Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 15. květen 2009, 08:52:19 Předmět: |
|
|
VladR napsal: |
To je jasne, pokial to lockujes/unlockujes kazdy 1 frame. |
To by bylo ještě v pohodě - on IMHO lockuje před každým vykreslením spritu
Jinak konečně pěkný thread  |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 15. květen 2009, 08:54:59 Předmět: |
|
|
Augi napsal: |
VladR napsal: |
To je jasne, pokial to lockujes/unlockujes kazdy 1 frame. |
To by bylo ještě v pohodě - on IMHO lockuje před každým vykreslením spritu  |
Uf, tak este len to by bol uplny masaker, ale je to dost pravdepodobne
Augi napsal: |
Jinak konečně pěkný thread  |
jj, po dlhej dobe niekto, koho to ocividne bavi kodit gamesky |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 15. květen 2009, 18:18:32 Předmět: |
|
|
Augi:
Tak jsem vyzkoušel ten dynamický buffer, a hrál jsem si i s parametrem Flags u funkce Lock, no a zvýšil jsem fps tak o 100, ale stejně to je hodně pomalé oproti metodě DrawPrimitiveUP (kde mám o +300 fps více), protože ta se asi hodí více na časté vykreslovaní malého množství vertexů, u DrawPrimitive bych tipnul že to bude spíše dělané pro velké meshe apod.
Zkoušel jsem to i podle:
http://www.gamedev.net/reference/articles/article1946.asp
Jinak je pravda že jsem odemykal a zamykal ten vertex buffer pro každou textůru, protože nejenom že každou renderuji na jinou pozici ale každá má taky jiné rozměry... Taky mi to příjde trochu jako paradox, chci optimalizovat to renderovaní pomocí texture atlasu, takže se vyhnu častému volání SetTexture, ale zase musím odemykat a zamykat vertex buffer proto abych nastavit koordináty uv té textůry ?
Ohledně výkonu, jsem jím trochu posedlý Už v době kdy jsem kutil gamesy v GDI tak jsem psal funkce v assembleru spoledně s instrukční řadou MMX v dnešní době to už asi nemá cenu, i když jsem nedávno psal i nějaký funkce pro instrukční řady SSE2 - 4, zejména pro rychlé kopírování a kryptovaní dat.
Augi, VladR, Ladis:
Tak mě napadlo, v jakém jazyce programujete hry ? Asi všichni tady jsou odkojení na C/C++ že ? |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 15. květen 2009, 19:07:14 Předmět: |
|
|
tak vertex buffery su na to ze sa donich nasipe kopec dat a potom sa uz len rendruje. popripade sa tam sype po velkych datvkach.nie to menit po 4 vertexoch. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 15. květen 2009, 19:08:35 Předmět: |
|
|
Jen malé zrychlení při přechodu od statického k dynamickému vykreslování jsem očekával. Pokud chceš dosáhnout vyššího výkonu, musíš se vyhnout tomu zamykání/odemykání vertex bufferu. Měl bys to udělat nějak tak, že si do vertex bufferu uložíš vertexy na nějaké normalizované pozici (třeba jakoby na čtverci o straně 1) a budeš s nima hýbat jen pomocí transformací. Ty se nastavují pomocí metody SetTransform: http://msdn.microsoft.com/en-us/library/bb174463(VS.85).aspx
Transformace se nastavuje zvlášť pro pozici vertexu a pro jednotlivé texturovací koordináty, viz http://msdn.microsoft.com/en-us/library/bb206269(VS.85).aspx
Ale ani tímto možná nedosáhneš maximální rychlosti. Pro maximální rychlost je třeba vykreslovat sprity po dávkách, tedy využít instancing (jak naznačuje nou). Ale postupně...nejdřív se nauč pořádně transformace  |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 15. květen 2009, 19:56:03 Předmět: |
|
|
No zas nema to cenu u takove hry komplikovat . Je prece jedno, jestli ma 100 nebo 400 fps, kdyz i na tech 100 je to krasne hratelne (ale je dobre vedet pro pristi projekty o moznostech, to jo).
Augi napsal: |
Takže jediné, co bych na Tvém místě udělal, by bylo to, že před vykreslením spritu bych otestoval, jestli jeho plocha nějak zasahuje do obrazovky. O nějaké ořezání půlky spritu se už myslím postará docela efektivně hardware sám při rasterizaci. |
Presne tak, dnesni hw ti automaticky orezava polygony jen na viditelnou cast na obrazovce (a deje se tak v transformaci vrcholu, ne v rasterizaci polygonu). Pokud vim, tak jedna z poslednich grafik, ktera to nedelala (tj. resila to az v rastericaci), byl GF 4 MX - ten jeste prochazel u polygonu vsechny pixely - i mimo obrazovku - a testoval, zda dany pixel je videt (takze tam byl velky propad vykonu v zavislosti, o kolik pixelu polygon presahuje obrazovku).
Nouma napsal: |
Tak mě napadlo, v jakém jazyce programujete hry? Asi všichni tady jsou odkojení na C/C++ že ?  |
Podle projektu a okolnosti/prilezitosti. Drive vetsinou C, taky neco v C#, ted zas neco v C++. Jinak odkojen jsem na QBasicu, Pascalu a Delphi . _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 17. květen 2009, 19:06:25 Předmět: |
|
|
Tak už jsem vykutil ty 2D světla a ty texturované obdelníky, dokonce mi narostl výkon když jsem zapnul ořezávání
Chtěl jsem zkusit i ten instancing, celou dobu jsem se trápil s tím proč mi to nešlo, pak jsem zjistil že se vertexy rozlišují na ne/transformované a já používal právě tu druhou variantu, takže jakékoliv pokusy o SetTransform se neprojevily. (D3DFVF_XYZ / D3DFVF_XYZRHW)
Zajímalo by mě jak na 3D světla, chtěl bych třeba určitou část herní obrazovky více osvětlit.
Do formátu vertexu jsem přidal flag D3DFVF_SPECULAR, a upravil ten záznam o další barvu. Ta proměnná specular zřejmě znamená jaká barva se odrazí od toho vertexu když na něj dopadne světlo že ? Hodnota 0 znamená že se odrazí barva toho světla ?
Ted by mě zajímalo jak vytvořit to světlo
-Zapnul jsem si osvětlování -> SetRenderState(D3DRS_LIGHTING, 1);
-Nastavím si nějaký materiál ? SetMaterial(Material) ?
-Vytvořím si světlo?:
kód: |
light.Type:= D3DLIGHT_DIRECTIONAL;
light.Diffuse.r:= 1.0;
light.Diffuse.g:= 1.0;
light.Diffuse.b:= 0.0;
light.Ambient.r:= 1.0;
vecDir:= D3DXVECTOR3(cos(Angle),0.0, sin(Angle));
D3DXVec3Normalize(light.Direction, vecDir);
light.Range:= 1000.0;
|
-Nastavím to světlo -> SetLight(0, light);
-Zapnu to světlo ->LightEnable(0, TRUE);
A nic všechno mi to bylo k ničemu protože žádné světlo nevidím
Jinak ted trochu offtopic, chtěl jsem přidal nějaké zoomovaní do té 2D hry, povedlo se mi to zprovoznit, spíše by mě zajímalo jestli to dělám dobře protože se mi zdá že se ty textůry divně deformují...
kód: |
D3DXMatrixOrthoOffCenterLH(matrix, Zoom, WindowWidth, WindowHeight, Zoom, 0, 1);
SetTransform(D3DTS_PROJECTION, matrix); |
Proměnná zoom je hodnota o kterou se to má přiblížit, a pohybuje se od 0 do 200, kde vyšší hodnota celou scénu pixelizuje.
EDIT: Tak už se mi podařilo to osvětlovanání, zajímalo by mě alo proč mi to dělá tuto chybu:
[img=http://img269.imageshack.us/img269/2016/screenshot0o.th.png]
Kde se intenzita světla snižuje tak mi to dělá chybu s dlaždicemi (ty obdelníky jsou dlaždice) |
|
Návrat nahoru |
|
 |
|