.[ ČeskéHry.cz ].
Správa textur

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 15. duben 2012, 17:05:40    Předmět: Správa textur Odpovědět s citátem

Představte si modelovou situaci:
Mám hru, která je rozdělená na levely. Aby byl loading kratší, chci pro následující level zachovat v paměti textury z předchozího (na co je zbytečně mazat, ne?). ALE: V určitém momentu bude už těch textur v GPU paměti moc, a tak by bylo záhodno ty nejdéle nepoužívané odmazat. Jak mám detekovat ten okamžik, kdy už bych měl začít textury odmazávat?
Zajímá mě zejména řešení v OpenGL 2.x, ale i DirectX 9.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 15. duben 2012, 17:57:42    Předmět: Odpovědět s citátem

toto riesit nemusis. asi yb som proste vsetky textury oznacil pred nacitavanim nejakym flagom. a potom prote len zacal nacitavat nove level pri ktorom zistis ktore este potrebujes. tym texturam ten flag vynulujes. a ked skoncis tak proste odmazes tie ktorym ostal.

riesit to nemusis pretoze driver aspon na ATI (ale na 90% aj nvidia) nacitava textury do VRAM az v momente kedy su potrebne teda zavolas prvy glDraw*() s nabindovanou texturou.

inak existuje http://www.opengl.org/registry/specs/ATI/meminfo.txt a http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt

ale ako som povedal pokial nemas problem s RAM tak proste len nacitaj novy level a odmaz to potom. ovladac si to potom uprace sam.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 15. duben 2012, 18:40:25    Předmět: Odpovědět s citátem

Ale teď si představ, že se bude střídat level v interiéru a exteriéru. Čili dost rozdílné sady textur. V takovém případě by se mi hodily textury i z několikátého levelu nazpět.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 15. duben 2012, 18:48:58    Předmět: Odpovědět s citátem

Už vím. Jakou nejmenší paměť na textury můžu předpokládat u karet podporujících OpenGL 2.x/DirectX9? Nebo spíš jaký objem textur je ještě rozumný na této třídě HW? Nastavím to natvrdo a bude.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 15. duben 2012, 18:58:49    Předmět: Odpovědět s citátem

no povedal by som ze tych 512MB sa da predpokladat u relativne novsich kartach ktore boli kupene na to aby sa na nich hralo. a postol som ti sposob ako zistit velkost volnej VRAM. takze staci hned pri starte si to zistit. taktiez driver si tie textury prehadzuje z RAM do VRAM podla potreby. ak nejaka textura je nacitana ale sa nekresli tak sa pri nedostatku miesta v VRAM proste presunie do RAM.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 15. duben 2012, 19:04:44    Předmět: Odpovědět s citátem

Kdyby ty ovladače nebyly tak přechytřelé, všem by se nám žilo líp - jak vývojářům driverů, tak vývojářům aplikací.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 15. duben 2012, 20:28:13    Předmět: Odpovědět s citátem

OpenGL to snad dělá minimálně od dob Doom 3, ne? Že všechny textury jsou v RAM a do VRAM dává ty nejčastěji volané. Direct 3D to dělá od verze 10. Ani v jednom API tedy už nejde říct "tuhle texturu chci jen ve VRAM a uvolním si tak kus RAM". Takže limitující je jen množství RAM, ne VRAM. Příklad: Na PC s 2 GB RAM si veme Windows 7 0,8 GB, tvoje hra řekněme 0,5 GB, tak pokud nahraješ 1 GB textur/dat, tak ti bude 0,3 GB už swapovat na disk (plus spousta počítačů má sdílenou grafiku bez VRAM, ono taky na všem s výkonem >= GeForce 9300 pustím i AAA hry na Unreal 3 enginu z roku 2009).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 15. duben 2012, 20:50:20    Předmět: Odpovědět s citátem

Já chci na Linux nějaké dostatečně low level 3D API, a ne tento napůl low level, napůl hi level moloch! Navíc s tak v mnoha ohledech idiotským rozhraním Rolling Eyes
Edit: No dobře, nechal jsem se unést, možná to ve verzích >= 3.0 je už lepší, to nemůžu posoudit, protože jsem je zatím nezkoušel.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 15. duben 2012, 21:33:43    Předmět: Re: Správa textur Odpovědět s citátem

frca napsal:
Představte si modelovou situaci:
Mám hru, která je rozdělená na levely. Aby byl loading kratší, chci pro následující level zachovat v paměti textury z předchozího (na co je zbytečně mazat, ne?). ALE: V určitém momentu bude už těch textur v GPU paměti moc, a tak by bylo záhodno ty nejdéle nepoužívané odmazat. Jak mám detekovat ten okamžik, kdy už bych měl začít textury odmazávat?
Zajímá mě zejména řešení v OpenGL 2.x, ale i DirectX 9.

Uděláš si std::map<nazev souboru, textura*> a při vytvoření tam tu texturu přidáš a nastavíš jí počet referencí na 1. Až tu texturu budeš načítat znova, tak se nejdřív podíváš do toho seznamu a když tam není, tak ji načteš. Když tam je, tak ji vrátíš a zvýšíš jí počet referencí na 2. Nikdy nemažeš textury přímo, ale jenom jim odebereš referenci. Mazání uděláš tak, že projdeš seznam a smažeš ty, které mají počet referencí 0.

Př:
1) Uvolníš starý level.
2) Načteš nový level.
3) V tuto chvíli necháš smazat textury se seznamu, co mají počet referencí 0, tj. nepoužívané v aktuálním levelu.

Tím zajistíš, že při přechodu na nový level se načte jenom to, co ještě načteno nebylo, a uvolní se jenom to, co už není potřeba. Držet v paměti nějak dlouho textury, co nepoužíváš, nedoporučuju.

Stejný postup se dá aplikovat na modely, shadery atd.


nou napsal:
riesit to nemusis pretoze driver aspon na ATI (ale na 90% aj nvidia) nacitava textury do VRAM az v momente kedy su potrebne teda zavolas prvy glDraw*() s nabindovanou texturou.

Já to v driveru dělám tak, že textury načtu vždy do oblasti RAM, kterou GPU vidí, a pak řeknu GPU, ať si to k sobě zkopíruje (CPU obvykle k celé VRAM nemá přístup) a tu kopii v RAM zase smažu. Tedy po zavolání TexImage už je naplánovaný přesun do VRAM. Nevím, jak to dělají uzavřený drivery, ale pokud ti zrovna nedochází paměť, tak je to způsob, kterej funguje docela dobře.


Ladis napsal:
OpenGL to snad dělá minimálně od dob Doom 3, ne? Že všechny textury jsou v RAM a do VRAM dává ty nejčastěji volané.

OpenGL to tak vždycky určitě nedělá, OpenGL si ve skutečnosti může dělat, co chce. Co je to "nejčastěji volané"? Určitě není jen limitující množství RAM. Je tam víc úrovní:
- VRAM
- RAM, kterou GPU vidí (obvykle to je tak, že kolik má GPU paměti, tolik navíc může využívat RAM), tato RAM je obvykle neodswapovatelná.
- Zbytek RAM, kterou GPU nevidí.
- Swap. (to se spíš ale nepoužívá)

Také u integrovaných grafik, co používají RAM, tak ta oblast paměti je taky neodswapovatelná.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 16. duben 2012, 08:03:04    Předmět: Odpovědět s citátem

Marek:
Ako to funguje na PC ak je pre nacitanie textury pouzity PBO? Ide to priamo do VRAM, alebo stale sa drzi kopia textury aj v RAM?

Minimalne na ps3 sme mali problem s tym, ze nam klasicky loadnute textury zasierali RAM, takze sme presli na nacitanie cez PBO - a spravalo sa to tak, akoby sa ziadna kopia v RAM nevytvarala a textura sla priamo do VRAM. Dost to aj zrychlilo loading.Ma zmysel takto to riesit aj na PC? alebo je to tam jedno?

Diki
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 17. duben 2012, 01:07:05    Předmět: Odpovědět s citátem

kerekes napsal:
Marek:
Ako to funguje na PC ak je pre nacitanie textury pouzity PBO? Ide to priamo do VRAM, alebo stale sa drzi kopia textury aj v RAM?

Minimalne na ps3 sme mali problem s tym, ze nam klasicky loadnute textury zasierali RAM, takze sme presli na nacitanie cez PBO - a spravalo sa to tak, akoby sa ziadna kopia v RAM nevytvarala a textura sla priamo do VRAM. Dost to aj zrychlilo loading.Ma zmysel takto to riesit aj na PC? alebo je to tam jedno?


To závisí, co s tím driver dělá. Já do uzavřených driverů nevidím. PBO je úplně stejný buffer jako vertex buffer nebo uniform buffer. V pohodě se dá jeden buffer používat jako VBO, PBO a UBO zároveň. Výhoda PBO je, že má k dispozici API bufferů pro načítání textur. Pro textury je to fakt hnusný API a blbě se to implementuje, ale lepší než drátem do oka. Výhoda je, že tu kopii mezi texturou a bufferem u PBO může dělat GPU, takže CPU je od toho osvobozeno. Je třeba si uvědomit, že hlavní výhoda PBO je v tom, že k té paměti může hned přistupovat GPU. To se nedá říct o obyčejné paměti, kterou si sám alokuješ (samozřejmě to jde taky, ale je to komplikovanější). Takže teoreticky se PBO vyplatí.

Pokud jde o kopii v RAM - to je věc driveru. Když ještě nebyl spolehlivý memory magement pro VRAM a data se tam mohly ztratit třeba při přepnutí rozlišení, tak bylo potřeba dělat kopii v RAM. Dneska už to tak není (hlavně teda je možno nastavit konektor monitoru, aby četl framebuffer z libovolné adresy v paměti, takže v zásadě je všechno jenom "off-screen" textura).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 17. duben 2012, 18:05:49    Předmět: Odpovědět s citátem

Tento thread ve mě vyvolal pocit, že bych měl upravit knihovnu textur (manager textur) a tak jsem nakonec upravil i knihovnu shaderů... Wink

Díky, potřeboval jsem si odpočinout od bakalářky programováním nečeho jiného. Very Happy
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna