Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 30. prosinec 2021, 21:46:54 Předmět: DirectX: Proč mám 2D grafiku pomalejší než 3D grafiku? |
|
|
Moje otázka je celkem prostá: Proč mám 2D grafiku pomalejší než 3D grafiku? Tento problém se projevuje od Windows 7. Vista nevím a na všem od Windows 95-XP jsem tento problém neměl. Nebo jsem ho nevnímal. Nebo jsem tehdy měl jiné grafické karty a tím to možná bylo. To právě nevím.
Neví někdo třeba o nějakém diskuzním fóru v angličtině, kde je hodně lidí i někdo, co dělával hry před 20 lety, kde bych měl šanci najít někoho s tímto zkušeného?
Více podrobností v dalších odstavcích:
Dělal jsem nějaké hry v DirectX v roce 1997. A pak ještě emulátory a fungovalo to krásně na všem až do Windows XP. Vista jako první dělala drahoty, problémy, tak jsem tam tehdy musel udělat nějaké úpravy. Protože když už jsem něco vytvořil, mám rád, aby to "navždy fungovalo".
Po vyřešení Visty mi pak Windows 7 fungovalo uspokojivě. Ale Windows 10 je naprostý disaster. Všechno se hroutí a nefunguje z důvodů nekompatibility na úrovni DirectX. Kompatibilita je značně omezená a spousta věcí, co bývala už v 90. letech akcelerovaná i na těch nejvíc historických kartách S3, najednou jede jen softwarově, a nebo třeba nefunguje vůbec. To byly ty nejlevnější S3 karty, tehdy mnoho let před úplně prvními 3Dfx akcelerátory. Byly tam nějaké akcelerované funkce kvůli kreslení oken v Windows a na tom se dobře dělaly i 2D hry. A teď to Microsoft zjevně zařízl, aniž by to nějak někde zdokumentoval. Taktéž u Nvidie nevidím žádnou dokumentaci o tom, že to zrušili. Ono se to děje už řadu let, co existuje Windows 10, jen já to prostě neřešil, až teď se dostávám k tomu prohlížet a kontrolovat ty nejstarší hry, jak fungují. A moc teda nefungují. Jedna hra třeba mívala už v roce 1998 300 fps kreslení celé obrazovky, protože to prostě vyždímalo, co to šlo, z těch S3 karet. No a dnes to jde sice spustit i na Windows 10, ale i když mám GTX1650, mám 3 fps v rozlišení 640x480. Žádné chyby, funguje to, ale pouhé 3 fps. To mi nepřijde úplně v pohodě. A nikde žádná zmínka v dokumentaci, která by to vysvětlila.
Teď jsem se dostal k emulátoru ASCD, který taky upravuju pro Windows 10, a ten mi záhadně stíhá velmi svižně. Sice na dnešním počítači je 3-6x pomalejší než na 10 let staré šunce s historickou grafikou, ale pořád to je jen 10% dostupného výkonu, takže bych mu to prominul. V tom emulátoru je profiler, na kterém jsou ty rychlosti vidět a taky to má 2D i 3D driver. 2D grafika se kreslí do RAM a pak nějakou triviální funkcí DirectDraw 6 se přenáší do videoram. No a 3D verze to dělá tak, že si to překopíruju do textury a tu pak nechám nakreslit pomocí dvou trojúhelníkú ve 3D. Překvapuje mě, že navzdory té větší pracnosti je tahle 3D verze několikanásobně rychlejší. Proč?
Navíc další problém, co jsem zjistil, je, že Windows 10 nějak odmítá režimy s paletou 256 barev a vyžaduje true colors. Problémy byly už na Vistě a W7, ale tam jsem to nějak ohackoval, že to dokázalo nakonec nějak fungovat. Protože ty staré hry jsou prostě takto napsané, nechci si přidělávat zbytečnou práci navíc s přepisováním velké části kódu. Nechápu, proč 256 barev v pár aplikacích funguje, ale v ostatních je jen černá obrazovka a driver se tváří, že to vůbec nepodporuje.
Dokud jsem neviděl ten emulátor (který na rozdíl od těch her stíhá dobře), netušil jsem, co tomu je. 3 fps? WTF? Když jsem ten kód porovnal, začínám mít tušení, co je špatně. Ono se zdá, že ten kkt při nakreslení každého jednoho grafického objektu kopíruje úplně celou videoram a proto je to pomalé. Emulátor vždycky býval nejpomalejší, protože grafika se tam kreslí ručně do vlastního bufferu po pixelech a pak kopíruje do videoram celá obrazovka. A tohle je teď najednou rychlejší než to, co mělo být akcelerované pomocí grafických objektů v DirectX.
(Grafický objekt v 2D je vlastně obdélník, potenciálně i s průhledností. Většina karet to umí navíc hardwarově resizovat a případně i nějaké další grafické efekty. Z těch obdélníků-spritů se skládá celá 2D hra. A celé to má být akcelerované. A ve Windows 10 není. A dokonce je to mnohem pomelejší, než kreslit si jednotlivé pixely, což je velmi podezřelé.) _________________ Děcka, mám doktorát z informatiky a aplikované matematiky, tak se se mnou laskavě nehádejte.
(Každej tu má nějakej zaručeně tvrďáckej podpis, tak já teď taky. ) |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 1. leden 2022, 21:34:39 Předmět: |
|
|
Důvod je ten, že GPU už mnoho let neumí 2D. Koneckonců videopaměť už ani není lineární (dnes už všechny grafiky - AMD, NVidia, Intel - kreslí v dlaždicích). Pamatuješ 16bit ISA karty Trident SVGA, kde musel DirectX vytvořit shadowbuffer v RAM, do kterého kreslila hra lineárně, a pak přenášet po 64kB stránkách do VRAM? Proto se dnes kreslí do obrázku v RAM, který pak přeneseš a vykreslíš do VRAM (např. nahraješ pixely textury, a tu použiješ na ty 2 trojúhelníky). K tomu se přidal konec podpory 8 a 16bit barevných režimů (pokud ještě v nějaké hře fungují, tak se rozbije třeba po Alt+Tab).
U starých her jsou patche od výrobce, případně od komunity (např. DLL, kterou nahraješ do složky hry - např. wrapper starého DirectX na DX11). V Linuxu to řeší Steam svojí knihovnou, která vytváří virtuální obrazovku, do které kreslí stará hra, a pak to vykreslí na skutečnou obrazovku - sám převede 8/16 barvy na TrueColor, sám udělá upscale se správným poměrem stran apod.
EDIT: Ještě přidám, že v non-x86 verzích Windows ani není DirectX starší než verze 9. Obsahují sice emulátor x86, takže aplikace obecně fungují - problém jsou ale chybějící API (nejen DX).
Jestli používáš DirectX, tak si pohraj s typem surface, do kterého kreslíš. Nejlépe nějaký "softwarový" v RAM, který v závěru přeneseš do GPU. _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 2. leden 2022, 00:09:27 Předmět: |
|
|
Díky. No já jsem se právě divil, že cizí hry na nových počítačích fungují, zatímco moje nefungují. Takže asi mají nějaké patche. A píšeš přesně to, co já předpokládám. Že blitování v RAM je stále rychlé, zatímco blitování do videoRAM je úzké hrdlo, kterému se musím vyhýbat.
S tím zrušeným 8-bit režimem s paletou je to škoda! V podstatě mě to nějak náhodou napadlo vyzkoušet a fakt pokud se dá, změnit kód na 32bit pixely, najednou to všechno daleko spolehlivěji jede a necrashuje při Alt+Tab apod. Ale ani slovo o tom není v dokumentaci API od Microsoftu nebo Nvidie. Pokud se dalo, přepisoval jsem přímo ty hry, aby nativně kreslily true colors, odpadne tam pak to závěrečné konvertování a je to rychlejší. Ale někdy je ten starý kód dost naprasený a člověk nemá nervy se v tom hrabat.
Dnes jsem pouštěl můj emulátor na cca 18 let starém počítači s P4 CPU s DDR1 RAM a kartou Nvidia 6600GT v AGP. Windows XP, čili ještě nativní 2D grafika. A přesto i tam mi ta 3D verze jede výrazně cca 4x rychleji než 2D. Důvod, že jsem si toho nikdy nevšiml, když to bylo aktuální nové, bylo, že já měl ty DirectX hry jen v exclusive fullscreenu a tam nebyl vidět profiler. Teprve loni jsem dodělával windowed režim (opět ještě stále pro staré DirectDraw 6 ve 2D) a tak teprve loni jsem začal vidět ty nečekané věci v profileru. Takže i na skoro 20 let starém počítači mám 3D 4x rychlejší... celá existence 2D verze těch programů je tedy vlastně groteskní. 3D texturu umím nakreslit na pixel přesně, nemám důvod zkoušet nativní 2D. Význam by to mělo jen pro někoho, komu Windows nebo grafická karta vůbec nepodporuje DirectX 9...
Já jsem na ty hry používal mou vlastní knihovnu. Tu jsem vytvořil 1997, tehdy jsem nějak měl DirectX 5, díky bohu, protože v předchozí verzi se prakticky nedalo nic normálně udělat (lidi od Microsoftu zjevně nikdy nic grafického nsami neprogramovali) a přešel jsem na DirectX 6, kde byla nějaká hodně důležitá nová věc. A tam jsem právě hodně řešil ty typy surfaců, aby to bylo ve video RAM. Každý sprite jsem si připravoval v normální RAM, nahrál do DirectX, stále v normální RAM, pak nechal překopírovat do jiné surface v DirectX, která už je ve video RAM. A pak to kreslení bylo velmi rychlé. Rok 1997... Mně přijde, že namísto měnění typu surfaců bych to asi prostě kopíroval ručně, jsou to přece jen obdélníky v paměti. A na závěr to dám do té textury. Problem solved. Navíc 3D velmi hezky funguje i non-exclusive, takže bez omezení Alt-Tab, tlačítko Start s nabídkou kreslí i ve fullscreenu atp. Samotný "vynález" těch exkluzivních režimů byl perverzní už v tom roce 1996, když s tím poprvé přišli. (Chápu, že byl trošku pomalejší hardware, který ty perverzity asi vyžadoval, ale dnes už to nemusíme řešit.) _________________ Děcka, mám doktorát z informatiky a aplikované matematiky, tak se se mnou laskavě nehádejte.
(Každej tu má nějakej zaručeně tvrďáckej podpis, tak já teď taky. ) |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 2. leden 2022, 00:21:48 Předmět: |
|
|
Tehdejší HW exkluzivní přístup potřeboval. Např. na 4MB grafice je rozdíl, jestli máš v 640x480x16bit pro textury 1,5 MB nebo 2,1 MB (o 40 % víc, pokud jde o exkluzivní fullscreen, a ne "okno přes celou plochu Windows" - tak jak to bylo v OpenGL, který fullscreen nezná - pozdější ovladače to aspoň detekují a přepnou na page flipping místo blitting). Předpokládám, že i u 2D grafik to mělo nějaký význam (např. ve 256 barvách jsi měl celou paletu - a ne že 20 barev na pevných pozicích bylo vyhrazených pro Windows).
EDIT: P4 CPU s DDR1 RAM a kartou Nvidia 6600GT v AGP je vlastně už dost výkonný 3D systém . Šlo o první 3D kartu od NVidie s plnohodnotnými programovatelnými shadery (GeForce FX měl Shader Model 2.0 jednotky špatně udělané, zadrhávaly se a fps skákalo sem-tam; GF 3/4 měly SM 1.x implementovaný jen jako delší fixed function pipeline).
EDIT 2: "Nvidia 6600GT v AGP. Windows XP, čili ještě nativní 2D grafika" -- Já bych za nativní 2D grafiku od NVidie označil Riva128 (NV3), která možná jako jediná plně akcelerovala Windows GDI (např. StretchBlt byl okamžitý a včetně bilineární interpolace!). Bylo to z historických důvodů, protože NV1 byl fail (triangly jen emulovala) a NV2 do herní konzole Sega byl nakonec zrušen. NVidia se proto rozhodla neriskovat a udělala GPU, které plně implementuje standardní API (GDI, DirectX, Direct3D - OpenGL tam bylo s chybami, hlavně v blending módech). Mimochodem všechny ty karty jsem měl doma a testoval (NV1, NV3) _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 3. leden 2022, 17:04:55 Předmět: |
|
|
No já tento počítač dostal už jako starý, takže nevím, z kterého je vlastně roku. Má zajímavou kombinaci fakt předpotopních věcí jako DDR1 nebo CPU socket 478, s celkem výhodnými věcmi, které v té době měl high end, jako SATA porty, P4 3GHz s hyper threadingem a tou GeForce 6600GT na AGP. Ale mám v šuplíku i FX5200 - ono to dnes už není důležité, ale prohodit a otestovat ty moje hry můžu.
(Mám tu i dva novější počítače se socketem 775 a DDR2 pamětí, přitom mají viditelně pomalejší CPU i pomalejší grafiku. Ono se traduje, že HT není pro hry k ničemu, ale to Windows XP na tom běží strašně dobře, protože to druhé pseudojádro zachraňuje všechy to chyby v systému, kvůli kterým to občas chvíli žralo 100% CPU.) _________________ Děcka, mám doktorát z informatiky a aplikované matematiky, tak se se mnou laskavě nehádejte.
(Každej tu má nějakej zaručeně tvrďáckej podpis, tak já teď taky. ) |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 3. leden 2022, 17:10:22 Předmět: |
|
|
FX5200 měla jen 2 jednotky SM2.0, což byla asi 1/3 nejslabší plnohodnotné GeForce. Takže výkon v SM2.0 nepoužitelný. Ale aspoň pro vývojáře šlo vyvíjet (tam ti stačí i třeba 4 fps - jen abys viděl, že výsledek je v pořádku).
HT bylo v P4 nutnost, protože měla velmi dlouhou a velmi neefektivní pipeline. Takže ALU se flákala, proto využít je pro druhé virtuální jádro ti dalo 2jádrový CPU (jak píšeš - význam pro OS, pro hry nepodstatné, protože ty tehdy využívaly jen 1 jádro). _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 8. leden 2022, 21:15:27 Předmět: |
|
|
Nespletl sis stránku? Nebo jak mi tohle pomůže s problémem, že mám 2D grafiku 20 let starých her pomalejší než 3D? |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 28. leden 2022, 23:37:34 Předmět: |
|
|
To bola reakcia na Ladisov komentar ze nvidia 6600GT mala programovatelne shadery. Mal som to citovat. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
|