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

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 6. prosinec 2009, 17:41:35 Předmět: |
|
|
Ok... 150FPS je hodně.. jenomže to je hodně na High-End grafice... když to pojede na slabší, tak to letí rychle dolu ... no ale řekněme, že zatím je to až až... ono to s přidáváním vysoce polygonálních modelů zase poletí dolu.. a pak už se LODu nevyhnu (asi budu muset nahodit LOD i na modely... na terén je to imho zatim zbytečné, právě vzhledem k rozlišení)
Jinak ohledně kreslení od nejbližšího po nejdál.
Přehodil jsem to, terén se kreslí, ale částice dělají "bordel"
http://www.perry.cz/files/water-particles-bug.jpg, což byl taky důvod, proč jsem to kreslil od zadu.
Když vypnu ZBuffer, tak to sice vypadá OK, ovšem pak to zase vidím skrz zdi :/ |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. prosinec 2009, 18:44:19 Předmět: |
|
|
Protože kreslíš částice blbě. Musíš mít na ně vypnutý zápis do zbufferu, ale zapnutý depth test. Průhledné objekty také musíš kreslit až na konec a musíš je kreslit odzadu. Neprůhledné objekty ale kresli standardně odpředu!
Možná tam máš ještě jiný bug a při kreslení scény odzadu se neprojevoval. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 6. prosinec 2009, 19:30:56 Předmět: |
|
|
Kreslím je:
kód: |
this.device.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
...
this.device.SetRenderState(RenderState.ZWriteEnable, false);
this.particles.Render(camera.ViewMatrix * camera.ProjectionMatrix, Matrix.Identity, Environment.TickCount);
this.device.SetRenderState(RenderState.ZWriteEnable, true);
|
A tohle mi castice maluje tak, ze je vidim skrz zdi. Dělá to ovšm pouze tehdy, pokud scénu kreslím po jednotlivých pásech v CSM. Když celý viewport namluju najednou a pak částice, tak se nakreslí kde mají
Poté co proběhne tento kus kódu to přestane fungovat.
kód: |
for (int i = 0; i < stiny.PSSMLevel; i++)
{
float near = stiny.SplitDistances[i];
float far = stiny.SplitDistances[i + 1];
/* zalohujeme si aktualni nastaveni sceny */
viewPort = this.device.Viewport;
origViewport = this.device.Viewport;
origFar = this.camera.CamFar;
origNear = this.camera.CamNear;
/* ------ */
/* upravime vieport a nastavime nove far a near pro kameru */
viewPort.MinZ = (near - this.camera.CamNear) / (this.camera.CamFar - this.camera.CamNear);
viewPort.MaxZ = (far - this.camera.CamNear) / (this.camera.CamFar - this.camera.CamNear);
this.camera.CamFar = far;
this.camera.CamNear = near;
this.camera.CreateProjectionMatrix();
/* ------ */
this.device.Viewport = viewPort; // set up new viewport
this.effect.SetTexture(xShadowMap, stiny.ShadowMaps[i]);
this.effect.SetValue<Matrix>(xTextureMatrix, stiny.TextureMatrix[i]);
this.effect.CommitChanges();
this.RenderScene(this.camera.ViewMatrix * this.camera.ProjectionMatrix, "MultiTextured", RenderSceneType.WithoutBlendingPass);
/* restore viewportu */
this.device.Viewport = origViewport;
this.camera.CamNear = origNear;
this.camera.CamFar = origFar;
this.camera.CreateProjectionMatrix();
/* ----------------- */
}
|
Pokud zavolám jenom
this.RenderScene(this.camera.ViewMatrix * this.camera.ProjectionMatrix, "MultiTextured", RenderSceneType.WithoutBlendingPass);
Tak to funguje normálně.... Nikde tam se ZBufferem nehýbu během této smyčky (v žádné funkci) |
|
Návrat nahoru |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 7. prosinec 2009, 09:47:16 Předmět: |
|
|
Když se tak dívám na ten zdrojový kód... v jakém jazyce to píšeš? Není to náhodou Java nebo C#?
Nemám proti Javě a C# nic, dnes jsou na grafiku poměrně použitelné, ale věřím, že fps 150 může být způsobeno také právě zvoleným jazykem. |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 7. prosinec 2009, 09:55:55 Předmět: |
|
|
Tych 150 fps mas po tych desiatich passoch ?
Lebo to vobec nie je zle, mat 150 fps po tom vsetkom co tam stvaras.
K vyssim hodnotam (300-1500 fps) sa dostanes uz fakt iba pri 1-2 passoch a velmi nizkom pocte DX calls a samozrejme pri minimalnej zatazi CPU (ziaden A* a podobne zverstva). |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 7. prosinec 2009, 10:39:13 Předmět: |
|
|
klapauciusk: On ale používá C# de facto jen na "programování" grafické karty (plnění command bufferu), takže tohle opravdu vliv nemá... |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 7. prosinec 2009, 15:19:39 Předmět: |
|
|
No C# sám o sobě může "užrat" max. 10% výkonu (ani to ne). To ovšem nic nemění na tom, že výše uvedený kód prostě funguje nějak divně a nevidím tam žádný zásadní problém |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. prosinec 2009, 16:07:55 Předmět: |
|
|
Argument "10% výkonu" je zcestný a nevím, proč se tím furt oháníš. V okenní klikací aplikaci je to 0%, v nenáročné 3D aplikaci taky asi 0%, v aplikaci provádějící náročné numerické výpočty to může být mnohem mnohem víc než 10%.
Dále, Visual C++ compiler s každou verzí generuje stále rychlejší kód, ve verzi 2010 se oproti verzi 2008 zrychlil kód přibližně o 10% pro x86 a 15% pro x64. Taky má smysl podotknout, že GCC často generuje ještě rychlejší kód než Visual C++ (ručně ověřeno). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 7. prosinec 2009, 16:25:01 Předmět: |
|
|
Eosie napsal: |
Dále, Visual C++ compiler s každou verzí generuje stále rychlejší kód, ve verzi 2010 se oproti verzi 2008 zrychlil kód přibližně o 10% pro x86 a 15% pro x64. Taky má smysl podotknout, že GCC často generuje ještě rychlejší kód než Visual C++ (ručně ověřeno). |
Pro okení aplikaci, nebo snad pro nenáročné 3D, či dokonce rozsáhlé numerické výpočty? :-D:-D:-D Nebo jen pro obyčejný "průměrný kód", pro který platí i perryho 10%? :-) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. prosinec 2009, 16:46:23 Předmět: |
|
|
Rozsáhlé numerické výpočty samozřejmě. Na Visual C++ blogu o tom zrychlení taky něco bylo. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 7. prosinec 2009, 17:05:58 Předmět: |
|
|
10% jsem našel na diskuzi myslím gamedev. Někde tam rozebírali v nějakém threadu výkon C# / C++ v DirectX a přibližně jim to vyšlo 10% pokles výkonu (jednalo se o aplikaci v XNA).
Imho C# nikdy rychlostí nedosáhne na C++, už jenom třeba pro správu paměti. Co jsem zkoušel tak třeba spoják structů v C# moc ideálně nejde. Interně to sice optimalizuje, ale pokles tam vždycky bude. Třeba Java má ve 3D (Jogl) brutální pokles oproti skoro stejnému kódu v C++, naopak na výpočty zase Java úplně k zahození není (proč by taky kus Matlabu jinak běžel pod Javou)
Na každou věc se trochu hodí něco jiného. Kdyby byl rozdíl výkonu oproti C++ / C# minimální, tak proč by se Dx aplikace hromadně nepsali v C# ? Proč by Microsfot neudělal Managed DX (nebo XNA) pro DX 10/11 ? |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. prosinec 2009, 19:10:38 Předmět: |
|
|
Měřit pokles výkonu v XNA je k ničemu, tam je tolik jiných faktorů, že výkon C# je až na jednom z posledních míst. Kdyby tam počítali nějaký fyzikální problém pro hodně instancí, pak by to nějakou vypovídací hodnotu mělo.
DX aplikace se moc nepíšou v C# právě proto, že velká část herních platforem ten jazyk nepodporuje. To ale nemá nic společnýho s jeho rychlostí. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 8. prosinec 2009, 10:11:07 Předmět: |
|
|
Ani 5%, ani 10%, ale az 84% :
Realny priklad z praxe - prepisovali sme C++ aplikaciu (prehravanie videa) do C# a ta C++ verzia to prehravala o 84% rychlejsie. Kapanek sokujuce, ale je to tak. S tou C# verziou uz nespravime nic, tam je vsetko nadoraz.
Merane v style max throughput - pocet framov co to stihne prehrat (to iste video) za 2 minuty. Tie presuny blokov pamate su pod C# abnormalne pomale. |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 8. prosinec 2009, 10:43:59 Předmět: |
|
|
boze to je zas OT - tak toho rychle nechte a bezte to resit jinam - tema uz tu bylo |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 11. prosinec 2009, 17:59:47 Předmět: |
|
|
Dobrý.. ještě bych měl dotaz, co mám dělat s modely... když jsem od něj daleko, ale stále ho vidím, přijde mi zbytečné kreslit vysoký počet polygonů, jak když stojím před ním.
A za druhé.. stojím na jedné straně, ale kreslím i tu kterou nevidím. Např. Mám velkou loď. stojím a koukám na levobok... a pravobok vůbec nevidím a kreslím ho.. maluji 2x tolik polygonů než potřebuji.
Modely mám načtené z 3d Studia (3ds) ve VB a IB. Loader jsem musel napsat sám  |
|
Návrat nahoru |
|
 |
|