Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 16. červen 2015, 23:06:11 Předmět: Potrebujem radu od skúsenejších //Pozadie hry |
|
|
Ahojte všetci,
Chcel by som vytvoriť hru Tunneler (1991 Geoffrey Silverton / Video: http://www.abcgames.sk/?p=hry_zobraz&id=8979) tak trochu po svojom. Budem programovať v jave za pomoci LibGDX. No mám na vás skúsenejších otázku. Nepotrebujem kód, stačí mi len váš názor a dobrá rada. To pozadie alebo teda terén by sa mal skladať s malých častí, ktoré sú menšie ako tank ktorý by som chcel mať vo velkosti asi 32x32. Mapa bude veľká kedže by som to chcel pre viacero hráčov.
Ako by ste to spravili vy tak aby to pozadie moc nezaťažovalo CPU a GPU? _________________ Väčšinou nepotrebujem návody krok za krokom. Stačí ma len postrčiť správnym smerom. Ďakujem za vaše rady a skúsenosti pretože tie sa nedajú kopírovať. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 18. červen 2015, 11:36:51 Předmět: |
|
|
V pripade, ze ti staci napriklad 8192x8192 policok (co by asi mohlo ), tak si vyrob 1-kanalovu texturu s 1 bajtom (8 bitmi) na kanal. To mas presne 64 MB. Tu budes mat cely cas v RAM na CPU a kopiu aj na GPU. Uplne normalne ako 2D pole (pripadne 1D pole a budes si ho indexovat sam (byteOffset = y * 8192 + x), to je jedno). Pripadne trochu mensiu, napriklad 4096x4096 na zaciatok (16 MB).
Ked dojde k vytunelovaniu nejakeho policka, tak ho proste nastavis na inu hodnotu (napriklad 1-255 je 255 roznych farbiciek a 0 bude prazdno).
Pomocou takejto textury mozes v priestore pohladu kazdeho hraca robit v pohode dotazy - je tam 0? Tank tam moze. Je tam nieco ine a leti tam strela? Tak to vymazes a nastavis na 0. A tak podobne. Kazdy takyto pohlad/vyrez bude zasahovat len niekolko100 x niekolko100 policok.
Dolezite je pristupovat k tvojej linearne ulozenej texture po riadkoch, aby si bajty cital v poradi, v akom su v RAM. Tak dojde k optimalnemu vyuzitiu cache. Cache miss budes mat len na zaciatku kazdeho noveho riadku.
Kazdy test pre pohybujuci sa projektil bude mizerny vzhladom na cache, ale s tym si este hlavu nelam. Asi ti tam nebudu lietat miliony striel.
Co sa tyka vykreslovania, tak by som uplne normalne takuto CPU texturu kazdy frame prekopiroval na GPU. Nie je to vela, 64 MB x 30 Hz = 1.8 GB/s. Tu ti nijaka Java, C++ ani assembler nijako nepomoze ani neublizi. To snad zvladne aj shitny mobil (nie?). Pripadne sa da aktualizovat len zmeneny obdlznik a vtedy budes prenasat mizive data. Pripadne si prekopirujes len vyrez aktualneho hraca (tych par100 x par100 pixelov) a ten zobrazis 1:1 na GPU do plneho okna (s point sampling filtrom, aby to malo pekny oldschool effect )
No a normalne ju vykreslis -- akurat, si napises shader, ktory jednotlive farbicky prelozi pomocou palety -- tj. paleta bude vyzerat ako farebna textura 256x1 px. Pre prvy pixel (0) tam bude cierna a pre ostatne nejaka ta zlta/oranzova. A pripadne pre niektore ine tam bude zelena/cervena/modra (zakladna jednotlivych hracov).
Pixel shader: float policko = bigMap.sample(uv); float3 farbicka = paleta.sample(policko); return farbicka; // uv je normalna 0..1 screen-space pozicia, ktoru ti posle vertex shader a dojde k jej interpolacii
Tak nejak. Chapes z toho nieco? _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 18. červen 2015, 12:44:48 Předmět: |
|
|
Mě dycky pobaví, když na předělávku něčeho pro DOS jsou začátečníkům hned doporučovaný složitější shadery. Přitom by hra úplně stejně vypadala i v technologiích na úrovni Direct3D 7 (a mohla být i tak náročná - i když 1,8 GB/s je i na mobilech dneska málo: LPDDR3 má 12,8 GB/s). Takový rady maj význam spíš pro 3D programátory-hračičky s předešlými zkušenostmi, co si chtěj zkusit zajímavý možnosti řešení.
BTW1: Jak pcmaster píše, textura se dá updatovat i po částech (zlomek přenosové náročnosti).
BTW2 z historie: V dávných dobách GPU strávil cykl i pixely mimo obrazovku, takže položit quad, z něhož je jen zlomek vidět na obrazovce, znamenalo velký propad výkonu (měl jsem to tak v rychle splácnuté hře Mars Racer). Ještě GeForce 4 MX to tak měl (vycházel z GF 2), Radeony už byly ok (ořízly polygony do plochy obrazovky a přepočítaly texturové pozice apod.). |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 18. červen 2015, 12:46:50 Předmět: |
|
|
Prave preto som odporucil NAJJEDNODUCHSIE riesenie a to je hentaky simple shader
"DX7" mi urcite nepride ani jednoduchsie na pochopenie, ani praktickejsie na implementaciu. Okrem toho som mu sotva mohol nieco take odporucit, ked som nikdy nic take archaicke nerobil alebo si to nepamatam.
Co sa tyka quadu, tak ja navrhujem vzdy kreslit prave 1 quad presne na celu obrazovku a texturu samplovat podla pohladu (normalne offset v UV). Nie je nic jednoduchsie nez shader. Jeho rychle pochopenie (ktore je nenarocne) mu pomoze v buducnosti.
2015 _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 19. červen 2015, 13:22:08 Předmět: |
|
|
mapu muzes pro usporeni mista v pameti ulozit do quadtree |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 19. červen 2015, 14:11:04 Předmět: |
|
|
Skus to trochu spresnit, pisal, ze je zaciatocnik.
Navrhni sposob, ako vytvorit stabilnu nahodnost 'oranzovej' farby v kazdom policku. Kde vidis prinos quadtree?
A mohol by sa aj mily Kroko309 vyjadrit _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 19. červen 2015, 14:30:00 Předmět: |
|
|
Quadtree usetri spoustu pameti - staci mu jen ukladat bool s ano/ne, drtiva vetsina prostoru bude budto spojite plna nebo spojite prazdna.
Zrnitost pixelu pak muze uz udelat nakym jednoduchym pseudorandom vypoctem zalozenym na pozici - ted si neco vycucam z prstu a vubec netusim, jestli je vysledek vypadajici pseudonahodne - treba
((((13*y*width+x*17) xor 0x71A4CC0D) ) >> 3) % 2
a podle toho tmavsi nebo svetlejsi oranzova
Koukam, ze ta moje funkce je nahodna asi jako...
|
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 21. červen 2015, 11:27:10 Předmět: |
|
|
1) potrebujes pri 16-64 MB setrit nejaku RAM?
1b) v pripade, ze budes mat dost rozstrielanu mapu, k ulozeniu stromu budes mozno potrebovat i viac RAM
2) dotazy do quadtree budu pomale, dotazy do mapy budu okamzite
3) bude schopny naimplementovat nejaky vyhladavaci strom? _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 23. červen 2015, 20:43:15 Předmět: |
|
|
Ďakujem vám veľmi pekne ale nerozumel som ani len polovici s toho čo ste mi tu písali a to znamená googliť, googliť a zase len googliť.
Každopádne ďakujem. Pri mojom voľnom čase mi to bude trvať dlhšie ako by som chcel ale ak pochopím viac ako polovicu z uvedeného tak určite začnem klásť viac otázok.
Ďík...
PS:
1-kanalovu texturu s 1 bajtom (8 bitmi) <-- to je textura s jednym radom pixelov s dĺžkou 8 pixelov?
Idem sa začať učiť tie shaderi _________________ Väčšinou nepotrebujem návody krok za krokom. Stačí ma len postrčiť správnym smerom. Ďakujem za vaše rady a skúsenosti pretože tie sa nedajú kopírovať. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 24. červen 2015, 17:48:11 Předmět: |
|
|
Nevadi, asi sme zacali velmi zhurta, tak zacneme postupne, len sa pytaj.
Jedno-kanalova znamena, ze ma jeden jediny "farebny" kanal (casto "cerveny", ale kedze je len jeden, tak ho mozes nazvat vselijako). Stvorkanalova ma cerveny (R), zeleny (G), modry (B) a alfu (A). Viac nez 4 uz nie je, su len 1, 2, 3 a 4.
Sirka toho kanalu bude 8 bitov (1 bajt). To znamena, ze kazdy texel (pixel textury) bude mat 1 bajt. V pripade stvor-kanalovej by to boli 4 bajty (1 pre R, 1 pre G, ...).
1 bajt na kanal nie je jedina moznost, moze to byt aj 10 bitov, 11 bitov, 16 bitov, 32 bitov, ci dokonca 4 alebo 5. Potom je to ovela komplikovanejsie, takze na to teraz kasleme. Pre tvoje potreby sa hodi 8 bitov.
Rozmer takejto 2D jedno-kanalovej 8-bitovej textury bude zodpovedat poctu policok, ktore chces mat v hre. Ja navrhujem 4096x4096 (lebo je to pekne okruhle cislo). A kolko RAM zaberie takato textura? No 4096*4096*1 = 16 MB.
Kazde policko = kazdy texel (pixel textury) ma teda 1 bajt, co je presne 256 moznosti (hodnoty 0 az 255 vratane). Ked tam bude 0, tak je to cierne (sa dohodneme). A ked tam bude nieco ine, tak to bude obsadene niecim - pieskom, zakladnou, ... Ale nie tankami ani strelami! Co teda budu znamenat hodnoty 1 az 255, sa dohodneme neskor.
Zatial sa chapeme? _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 25. červen 2015, 04:43:51 Předmět: |
|
|
Zatial hej
Toto všetko mám robiť v shaderoch? Lebo ak hej tak si šetri dych. Pozeral som si trocha dokumentáciu o shaderoch
v libgdx https://github.com/libgdx/libgdx/wiki/Shaders a zopár iných návodov no musím povedať že je to znova kopec vecí ktoré sa musím učiť. A ako vždy je toho straaašne veľa. Momentálne sa učím používať Box2d a Scene2D no a popri nich nezvládnem aj shaderi...... Princíp fungovania som pochopil ale musím na to ísť pekne postupne a najskôr dotiahnuť tie dve rozbehnuté "učivá". Takže shaderom sa nebudem tak skoro venovať.
Takže ak ich na to skutočne potrebujem tak sa ozvem neskôr.
Ďakujem. _________________ Väčšinou nepotrebujem návody krok za krokom. Stačí ma len postrčiť správnym smerom. Ďakujem za vaše rady a skúsenosti pretože tie sa nedajú kopírovať. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 25. červen 2015, 13:06:55 Předmět: |
|
|
Vsak postupne, nemusis mat na zaciatok nijaky shader. Ja budem hovorit bez akejkolvek znalosti libgdx, len vseobecne.
Zacni tym, ze celu obrovsku texturu ako je, vykreslis niekde do stredu obrazovky na obdlznik. Je uplne jedno kam, dolezite je, aby si ju videl. Na zaciatku ju napln nahodnymi datami. Finta je, ze ju nebudes nacitavat z disku, ale vytvoris si ju za behu. Na to budes potrebovat trochu experimentovat a citat dokumentaciu.
Daj nam vediet, ako sa to podarilo _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 25. červen 2015, 20:04:32 Předmět: |
|
|
Akými dátami?
Vytvorím si obdĺžnik a naň pripnem vytvorenú textúru. V textúre mám upnutý nejaký png súbor.... alebo môžem vytvoriť prázdnu textúru ktorej do konstruktoru zadávam 3 hodnoty a to velkosť textúri x a y a tá tretia je Pixmap.Format ktorý môže byť : RGBA8888, RGB888, RGBA4444, RGB565,...
napríklad RGBA888 má na každý kanál tých 8 bitov. Ale nevidel som tam možnosť vytvoriť jednokanálovú textúru.
ciže to vyzerá nejako takto textura = new Texture(32, 32, RGBA888) _________________ Väčšinou nepotrebujem návody krok za krokom. Stačí ma len postrčiť správnym smerom. Ďakujem za vaše rady a skúsenosti pretože tie sa nedajú kopírovať. |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 26. červen 2015, 07:16:53 Předmět: |
|
|
No myslim ze musis pouzit ako zdroj pre texturu nie subor ale PixmapTextureData. Aspon tak som to pochopil z nahliadnutia do LibGDX dokumentacie. teda vytvorit si pixmap s Intesity ako formatom to nahrat do PixmapTextureData a to nakoniec do Texture. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 26. červen 2015, 09:26:41 Předmět: |
|
|
Vyzera to tak, ze si si vybral dost limitujucu a primitivnu "platformu", ten javovy libgdx, ked tak cumim do dokumentacie
Ale nevadi, bude to neprijemnejsie, ale budeme robit, s cim sa da. Urob si RGBA8888 a skus to tak, ako napisal nou. Pohladom na dokumentaciu som ani nezistil, ako by sa asi tak dala taka textura updatovat, ako som povodne planoval, ale ani to by nemuselo vadit. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
|