.[ ČeskéHry.cz ].
Hra / engine - obecně
Jdi na stránku 1, 2  Další
 
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
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 15. říjen 2011, 21:29:08    Předmět: Hra / engine - obecně Odpovědět s citátem

Zdravím, jelikož jsem zde "nový", rád bych nejdřív objasnil, na čem bych rád zapracoval v budoucnu a zároveň vás zkušenější požádal o pár rad, návodů, triků apod. Smile
Takže, rád bych si zkusil napsat vlastní hru (vím, že "psát herní engine" tady není moc v oblibě Smile), a to pomocí SDL/OpenGL.. V tomto vlákně bych se chtěl dozvědět některé věci, které jsem nevyčetl zatím ani tady na fóru, ani jsem nenašel v různých bakalářkách, semestrálkách apod (nebo nepochopil), popřípadě alespoň slyšet váš náhled na věc, nejelegantnější řešení (v rámci možností vašeho know-how Smile) apod.

- rád bych ještě zdůraznil, že mně půjde především o obecnější věci co se týče fungování hry, tzn. pokusím se vás neotravovat věcmi jako binární strom ( které jdou velmi snadno dohledat Smile) ..


za A) Jak řešit správu paměti pro menší hru (řádově 1 menší mapa, 2 hlavní objekty, pár vedlejších, nic velkého) ? Naalokovat si hned ze začátku veškerou potřebnou paměť + nějakou rezervu, načíst všechny modely, textury, scénu, .. a pak k nim jenom přistupovat, nebo alokovat/uvolňovat paměť, nahrávat data, až podle potřeby?

za B) V jakém pořadí inicializujete / uvolňujete jednotlivé části hry? Handle okna, správce zdrojů (modely, obrázky, popisy scén, konfigurační soubory ..), ev. síťovou hru, grafickou část (rendering, 2D f-ce), fyzikální engine, správce scény, .... ? Něco tu už psal ]semo[ , jenom v pořadí mám ještě zmatky .-)


P.S. Píšu v C-čku, vím, že objekty bych si ušetřil hodně práce, ale jelikož rozhodně umím víc čisté C, než C++ apod., tak bych rád zůstal u něho..

.. prozatím asi vše, předem vám děkuji za odpovědi, i do budoucna Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



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

PříspěvekZaslal: 15. říjen 2011, 22:01:41    Předmět: Odpovědět s citátem

A) Něco mezi. Rozhodně vše naalokovat na začátku, za běhu už nic nealokovat. Nahrávat buď na začátku, nebo podle potřeby za běhu. "Na začátku" nemusí znamenat přímo jenom na začátku programu, ale třeba na začátku levelu, při loadingu uložené pozice apod. "Za běhu" znamená během výkonové části.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. říjen 2011, 22:44:06    Předmět: Odpovědět s citátem

A) Pokud jde o malou hru, cekal bych, ze se cela vejde to 100-200 MB RAM. Pokud ano, nema nahravani behem hry moc velky smysl. Pokud jde o alokovani pameti, tak to zalezi na tom, k cemu ji potrebujes. malloc/free jsou vcelku drahe operace, ale pokud jich udelas jenom par za frame (napriklad pro smazani mrtvych nepratel a pridani novych, trochu prace s retezci pro zobrazeni score...), tak se to nikde neprojevi a vlastni/specialni alokator nestoji za tu namahu. Pokud by jich ale mely byt tisice nebo desetitisice, pak by asi bylo lepsi pouzit nejakou chytrejsi metodu pro spravu pameti.

B) Nevim o tom, ze by existovalo jedine spravne poradi, v jakem to delat. Obecne doporuceni je "co nejdriv ukazat uzivateli, ze se neco deje" (co nejdriv vytvorit okno a napsat do nej "Loading"), ale dal uz je to asi jedno. Poradi nekterych veci vyplyne ze zavislosti (nema cenu inicializovat grafiku, dokud nenactes vychozi rozliseni z konfigurace, bez inicializovaneho spravce sceny moc nejde nacitat levely, ...), ale na to prijdes az to budes programovat.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 22. říjen 2011, 13:20:06    Předmět: Odpovědět s citátem

Ahoj, předem bych vám chtěl poděkovat za rady, načtu teda vše hned ze začátku.. Řeším další problémy, a sice s hlavní smyčkou, takže přidávám další otázku.. Smile

za C) Mám funkci app_run(), která se stará o herní smyčku. Ve smyčce volám 2 funkce, app_run_update() a app_run_render() ... update() by měla zachytávat události (klávesnice, TIMER, zprávu o ukončení programu, ...) a dále obnovovat (pozice objektů ve hře, scénu atd); a render() vše vykreslí.. Vás bych se rád zeptal, jestli je toto řešení v pohodě, pořád mně to nepřijde úplně "čisté" a funkční...

Opět budu rád za váš názor/připomínku, radu, cokoliv.. zdravím, costa
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 22. říjen 2011, 13:23:34    Předmět: Odpovědět s citátem

Mělo by to stačit... maximálně bych render třeba pozdržel podle FPS... tzn. že update se bude provádět pořád a jednou za nějaký čas se provede render
_________________
Perry.cz
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: 1536
Bydliště: u Prahy

PříspěvekZaslal: 22. říjen 2011, 15:19:53    Předmět: Odpovědět s citátem

Zas ale proč provádět update, když nebude volat render, což bude asi jediný výstup té hry.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



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

PříspěvekZaslal: 22. říjen 2011, 15:27:39    Předmět: Odpovědět s citátem

Ladis napsal:
Zas ale proč provádět update, když nebude volat render, což bude asi jediný výstup té hry.


Záleží, jakým způsobem bude mít dělanou fyziku, timery apod. Třeba u zrychlení je podstatné, jestli se mění rychlost dvakrát za poloviční čas, nebo jednou po celém čase.

Ale pravda, taky jsem update i render volal vždy, nic z toho nevynechával.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 22. říjen 2011, 16:47:51    Předmět: Odpovědět s citátem

Ladis> obecně se hodí mít update s pevným časovým krokem kvůli numerické stabilitě. A proč dělat víc update bez renderů - update je obvykle rychlejší než render, takže takhle jde snížit framerate rendereru, ale přitom mít simulaci herního světa přesně stejnou jako na počítačích s vyšší framerate.
_________________
http://trionteam.net
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: 22. říjen 2011, 18:12:56    Předmět: Odpovědět s citátem

Volat render víckrát než update nemá smysl, pokud neděláš benchmark.

Jinak:

A) Tam těch možností je trochu víc než jen 2. Buď nahrát vše při spuštění aplikace (podle mě je to blbost, plýtvá se paměť), nebo nahrát vše při načítání levelu (obvykle používaný způsob, snadný na implementaci), nebo nahrávat data podle potřeby během hraní, tj. zatímco hráč kuchá příšery, jejichž mozky tečou po podlaze, tak ty paralelně nahráváš další úsek levelu, ke kterému se hráč blíží, umísťuješ příšery apod., zároveň uvolňuješ úseky levelu, od kterých se hráč vzdaluje a zároveň je třeba zachovat naprostou plynulost hry (časté u online her, netriviální na implementaci, ale umožňuje více detailní scény kvůli tomu, že se tak neplýtvá pamětí).

Ze začátku je lepší načítat jen po levelech.

B) Uvolni si to, v jakém pořadí chceš, ale hlavně abys tam neměl memory leaky a jiné leaky. Samozřejmě je potřeba vědět, jestli ti zrušení handlu okna samo nezruší í všechny objekty, které jsou s ním asociované. To se obvykle dočteš v dokumentaci. Co se týče grafiky, okno doporučuju uvolnit až na konec, před ním je třeba uvolnit grafický kontext a před tím je celkem jedno, jak to uvolníš. Co se týče ostatních věcí, tak je asi úplně jedno, kdy to uvolníš. Zvuky je asi lepší uvolnit přes zrušením zvukovýho kontextu a fyzikální objekty je třeba uvolnit přes zrušením fyzikálního kontextu (enginu atd). Ale typicky je to tak, že herní objekt (třeba panák) si sám drží svoje modely, zvuky, fyzikální reprezentaci atd. a při jeho uvolnění se uvolní všechny objekty, co k němu patří.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 22. říjen 2011, 18:34:00    Předmět: Odpovědět s citátem

citace:
Volat render víckrát než update nemá smysl, pokud neděláš benchmark.

To není tak docela pravda ... i u her má jistý význam konstantní krok pro update a renderovat s interpolací. Trochu více informací k herní smyčce - http://www.koonsolo.com/news/dewitters-gameloop/

Co se načítání týče, je důležité poznamenat, že pro paralelní načítání levelů (tzv. streaming) za běhu hry, je velmi podstatný dobře navrhnutý formát, protože špatný (rozuměj všechny textové a špatně navrhnuté binární) formát může načítání velmi zpomalit.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 22. říjen 2011, 18:53:36    Předmět: Odpovědět s citátem

ještě bych měl upřesnit, o co se vlastně snažím... chci si napsat leteckou arkádu - samozřejmě zjednodušenou v co největší míře - takže jak jsem už psal, 1 mapa, 2 letadla, + nějaké věci okolo (skybox, pár domů, stromy, voda) každopádně nic megalomanského. Většina objektů půjde víceméně vidět po celou hru, žádné levely neplánuju Smile .... takže jsem si vlastně odpověděl sám Very Happy

- k TIMERu - ještě by tu byla jedna možnost..... v hlavní smyčce hry bych ošetřoval události s tím, že jeden event by byl timer.... někde bokem by mě běžel timer s nastaveným MAXFPS s tím, že by v každém intervalu poslal zprávu do hlavní smyčky.... ve smyčce by vedle zpráv z klávesnice, myši, ... by byla událost s timerem, která by volala f-ce update() a render() .... co vy na to?
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: 23. říjen 2011, 00:53:15    Předmět: Odpovědět s citátem

Vilem> Jenomže update interpolační proměnné je v update (haluz, co). Teď se nebavím o updatu fyzikálního enginu, ale o updatu kompletní hry. Co se ale týče té fyziky, není mi jasný, k čemu je tam interpolace dobrá. Ať nad tím přemýšlím jak chci, vždycky mi vyplyne, že tam ta interpolace spíš věcí kazí než že by něco vylepšovala.

costa> Kašli na timer, podle mě to nepotřebuješ, prostě udělej:

kód:
while (!keypressed(ESC)) {
   updateGameState();
   //updatePhysics();
   updateAnimations();
   render();
}


Fyzika sice potřebuje konstantní krok, ale hlavní smyčka o tom přece nepotřebuje vědět. To je soukromá věc fyzikálního enginu.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 23. říjen 2011, 09:59:57    Předmět: Odpovědět s citátem

Eosie: to by bylo nejjednodušší, ale jak by se pak hra chovala na různě rychlých kompech? Pokud bych třeba rychlost počítal jako přírůstek pozice za snímek, a hra někomu běžela 1500 FPS a druhému 150... Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 23. říjen 2011, 10:28:29    Předmět: Odpovědět s citátem

costa> ta zakladni smycka klidne muze byt takhle a v updateGameState bys mel mit neco typu:

kód:
void updateGameState() {
  while (timeInRealWorld - timeInGameWorld > X) {
    updateGameStateWithTimeStepX();
    timeInGameWorld += X;
  }
}


Jinak problem s timery (minimalne s WM_TIMER ve Windows) je ten, ze obvykle nejsou moc presne (milisekunda neni zadna mira) a nezarucuji, ze ti ta zprava prijde presne v dany cas, ale ze prijde nejdriv v dany cas. Problem je, ze i kdyz jde o tak kratky cas, tak na plynulosti hry jsou ty vykyvy vetsinou dost znat.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 23. říjen 2011, 10:37:23    Předmět: Odpovědět s citátem

o té nepřesnosti WM_TIMERu vím, já naštěstí používám SDL timer Smile asi to udělám jak píšete vy, vykašlu se na celý timer, maximálně přidám do smyčky SDL_Delay(), což by svůj účel taky mělo splnit...
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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