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
|
Zaslal: 24. říjen 2011, 08:09:02 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 24. říjen 2011, 09:26:35 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 24. říjen 2011, 09:36:19 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 24. říjen 2011, 10:16:16 Předmět: |
|
|
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  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. říjen 2011, 16:31:22 Předmět: |
|
|
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 |
|
 |
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 24. říjen 2011, 16:55:59 Předmět: |
|
|
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?  |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 24. říjen 2011, 17:06:27 Předmět: |
|
|
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 |
|
 |
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 26. říjen 2011, 14:31:47 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 26. říjen 2011, 14:38:09 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 26. říjen 2011, 16:35:57 Předmět: |
|
|
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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 26. říjen 2011, 21:50:24 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. říjen 2011, 00:27:24 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 27. říjen 2011, 09:51:17 Předmět: |
|
|
To sa mi nechce verit, ze chcel niekto volat sleep, nesrandujte. Len pekne pocuvajte if.then-a a Eosieho a nevymyslajte blbosti
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 |
|
 |
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 27. říjen 2011, 10:25:15 Předmět: |
|
|
sleep mám ve smyčce jen při minimalizovaném oknu |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 27. říjen 2011, 11:44:40 Předmět: |
|
|
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 |
|
 |
|