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



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 24. říjen 2011, 08:09:02    Předmět: Odpovědět s citátem

Eosie napsal:
Co se ale týče té fyziky, není mi jasný, k čemu je tam interpolace dobrá.


Kdyz budes mit ruzne fps pro fyziku a rendering (treba fyzika 15 fps, rendering 50fps).

Aby se ty objekty, s kteryma hejbe fyzika, neposouvaly trhane (15 fps), tak tu pozici pro renderovani (ziskanou z fyziky) interpolujes...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 24. říjen 2011, 09:26:35    Předmět: Odpovědět s citátem

Osobně dělám game loop takhle...

kód:

const float STEP_SIZE = 1/60.f;
float oldTime, newTime; //čas minulý a tento frame
float timeDifference;
... //game loop
do
{
  newTime = vratCas(); //nahraď si to něčím, co vrací čas v sekundách
  timeDifference = newTime - oldTime;
  while (timeDifference >= STEP_SIZE) //while, ne if
  {
    updatePhysics(STEP_SIZE);
    timeDifference -= STEP_SIZE;
  }
  render(); //vyrenderuje data
  oldTime = newTime;
} while (!exitLoop)

Tak to vypadá u mě a fyzika (Bullet Physics) je pěkně stabilní. Teď přemýšlím nad tím, co říkal Eosie, zda by nebylo lepší dát render jen v případě, že se od předchozího měnila fyzika...
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 24. říjen 2011, 09:36:19    Předmět: Odpovědět s citátem

Ja som to robil podobne a je to velmi pekne, primitivne a stabilne riesenie pre 1 vlakno. Veselo to pouzivajte! Toho zbytocneho renderu by som sa az tak nebal.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

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

Tak jsem si pohrál s gDebuggerem a zjistil jsem, že je prakticky úplně jedno, jestli člověk volá render vždycky nebo jenom s fyzikou... takže moje rada je neřešit to a místo toho si pohrát s bottlenecky Smile
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
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: 24. říjen 2011, 16:31:22    Předmět: Odpovědět s citátem

satik napsal:
Eosie napsal:
Co se ale týče té fyziky, není mi jasný, k čemu je tam interpolace dobrá.


Kdyz budes mit ruzne fps pro fyziku a rendering (treba fyzika 15 fps, rendering 50fps).

Aby se ty objekty, s kteryma hejbe fyzika, neposouvaly trhane (15 fps), tak tu pozici pro renderovani (ziskanou z fyziky) interpolujes...


No to bych právě řekl, že takhle to nemá šanci fungovat spolehlivě a bude to fake. Buď můžeš interpolovat se starými daty, což je nesmysl, protože do obrazu dáváš něco, co už dávno není aktuální. Nebo můžeš interpolovat s daty "z budoucnosti" tj že si napočítáš ještě jeden časový krok navíc, ale to je taky fake, protože uživatelský vstup pro příští snímek by ti ten budoucí krok mohl úplně změnit, tzn. to, co se předtím nějak nainterpolovalo, by najednou bylo neplatné (vypadalo by to nikoliv jako interpolace, ale jako extrapolace). Takže jak jsem řekl, interpolace to tam může pro některé případy vylepšit, ale může to taky kazit. Vždycky je nejlepší zobrazit to nejaktuálnější, co máš, a beze změn.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 24. říjen 2011, 16:55:59    Předmět: Odpovědět s citátem

Predstav si, ze stojis na miste a koukas na posunujici se objekt.

Kdyz fyzika bezi 15fps a rendering 50, tak ten objekt tam porad bude poskakovat jako kdybys mel cca 15fps i rendering.

Kdyz ho ale budes interpolovat, tak sice budes o neco pozadu, ale ten objekt opravdu pojede plynule.

Zalezi samozrejme na typu hry, neco jinyho jsou zavody aut, kde v 50km/h by to pri 15fps fyzice bylo uz treba cca metr rozdil oproti pozici, na ktery auto realne je, ale pro nejakou strategii nebo rpg by to bohate stacilo, pri rychlostech postav by to bylo radove kolem 10cm, coz je v techhle hrach celkem fuk.

Tech 15 fps byl jen priklad, pokud fyzika pobezi vic, tak ta nepresnost se bude snizovat a pak uz te to nebude trapit ani treba u tech zavodu nebo 3D strilecek, kde je rozdil, jestli mu jen liznes ucho nebo ho trefis do cela.

Proc nevyuzit vic jader, kdyz uz je mame k dispozici? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 24. říjen 2011, 17:06:27    Předmět: Odpovědět s citátem

Eosie napsal:
Nebo můžeš interpolovat s daty "z budoucnosti" tj že si napočítáš ještě jeden časový krok navíc, ale to je taky fake, protože uživatelský vstup pro příští snímek by ti ten budoucí krok mohl úplně změnit, tzn. to, co se předtím nějak nainterpolovalo, by najednou bylo neplatné (vypadalo by to nikoliv jako interpolace, ale jako extrapolace).


Who cares? I kdybys měl fyziku počítanou jen každou 1/10 sekundy, tak uživatel stejně nepozná, jestli vystřelil (/vyskočil, rozběhl se apod.) o tu 1/10 s dříve.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
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: 26. říjen 2011, 14:31:47    Předmět: Odpovědět s citátem

2if.then: V tvojí smyčce se bude vše aktualizovat jenom jednou za sekundu, ne? Pokud jsem ji teda správně pochopil....

Ještě bych se chtěl zeptat, jestli by třeba jenom nestačilo ve smyčce jednou aktualizovat fyziku, jednou vykreslit s tím, že by to bylo vždycky o určitý čas zpožděné... ? Resp. jaké možné problémy by z tohoto řešení vyplynuly? Díky, costa
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: 26. říjen 2011, 14:38:09    Předmět: Odpovědět s citátem

if.then napsal:
Who cares? I kdybys měl fyziku počítanou jen každou 1/10 sekundy, tak uživatel stejně nepozná, jestli vystřelil (/vyskočil, rozběhl se apod.) o tu 1/10 s dříve.


1/10s je už fakt hodně. Uživatel pozná rozdíl mezi tím, jestli snímek trvá 33ms a 16ms, důvod je prostý: latence. Délka snímku je totiž latence, kdy se vstup z klávesnice dostane na monitor. Mozek to vnímá velmi citlivě.
_________________
AMD Open Source Graphics Driver Developer


Naposledy upravil Marek dne 26. říjen 2011, 17:36:07, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 26. říjen 2011, 16:35:57    Předmět: Odpovědět s citátem

costa napsal:
2if.then: V tvojí smyčce se bude vše aktualizovat jenom jednou za sekundu, ne? Pokud jsem ji teda správně pochopil....

Ještě bych se chtěl zeptat, jestli by třeba jenom nestačilo ve smyčce jednou aktualizovat fyziku, jednou vykreslit s tím, že by to bylo vždycky o určitý čas zpožděné... ? Resp. jaké možné problémy by z tohoto řešení vyplynuly? Díky, costa


Rychlost vykreslení určuje konstanta STEP_SIZE, která např. v mnou pastovaném kódu má hodnotu 1/60, tj. 1 update se vykoná za 1/60 sekundy.

Tohle řešení game loopu používá spousta her, je jednoduché na implementaci, takže bych si osobně nelámal hlavu s jinými řešeními.

BTW: Zpožďování smyček bych se vyhnul, systémové zpožďování není moc přesné, takže se ti může stát, že ti aplikace jeden update vynechá, při dalších se vůbec zpožďovač nespustí atd. atp.

Eosie> Jasně, to byl jenom přestřelený příklad. Když se nad tím tak zamyslím, tak to bude ve výsledku docela jedno, záleží na koncovém uživateli... Ale při motion blur je zase interpolace vhodná. Takže vše má své pro a proti.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 26. říjen 2011, 21:50:24    Předmět: Odpovědět s citátem

if.then napsal:
Zpožďování smyček bych se vyhnul, systémové zpožďování není moc přesné, takže se ti může stát, že ti aplikace jeden update vynechá, při dalších se vůbec zpožďovač nespustí atd. atp.


Raději zpožďovat, než mít zbytečně vytížené jádro na 100%. Musí se to udělat chytře, dynamicky vypočítávat ten čas pro čekání a kontrolovat ty časy nazpět, pro případné chyby.

Já osobně používám funkci Sleep pro framerate <= 50fps, a ještě jsem nezažil že by mi některý snímek kvůli "nepřesnosti" té funkce vynechal. A vytížení CPU mi kleslo ze 100 na 20 procent, což se líbilo hlavně mému notebooku, protože při nízkém vytížení si cpu podtaktuje na 800MHz, kvůli výdrži baterie (a hlavně ventilátory pro chlazení tak neřvou).

A pokud to chce nějak jednoduše, tak i volání Sleep(1) umí ušetřit nějaké cykly bez většího vlivu na výkon.
_________________
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: 27. říjen 2011, 00:27:24    Předmět: Odpovědět s citátem

Sleep je trochu prasárna. Proč prostě nezapnout vertikální synchronizaci? Pak vám to bude spát ve SwapBuffers a jako bonus nebudete mít žádný tearing.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 27. říjen 2011, 09:51:17    Předmět: Odpovědět s citátem

To sa mi nechce verit, ze chcel niekto volat sleep, nesrandujte. Len pekne pocuvajte if.then-a a Eosieho a nevymyslajte blbosti Shocked

Eosie velmi spravne poznamenal, ze dolezity, ba najdolezitejsi je cas, od vstupu do vystupu na obrazovku. 100 ms lag uzivatel fakt spozna a nebude sa mu vobec pacit. Bolo by to naprd, hlavne v FPS hre. V strategii a podobne ani tak nie.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
franz



Založen: 30. 07. 2007
Příspěvky: 1325

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

sleep mám ve smyčce jen při minimalizovaném oknu
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 27. říjen 2011, 11:44:40    Předmět: Odpovědět s citátem

ni ano input lag sa pozna. ale na co je este clovek citlivejsi je nepravidelnost v zobrazovani jednotlivych snimkov. vid problemy s microshutteringgom pri SLI/CF. no to je jedno sleep() je vhodny len do minimalizovaneho okna ked sa user proste nepozera.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
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 Předchozí  1, 2
Strana 2 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