Uwaga! Informacje na tej stronie mają ponad 6 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.
Fri 07 Dec2007
Szarpanie gry to wredny błąd. Długo nie wierzyłem w ogóle w jego istnienie - dopóki sam go nie doświadczyłem w swoim kodzie, najpierw na laptopie, a potem również na blaszaku. Chodzi o sytuację, kiedy FPS-ów jest dużo, ale mimo tego animacja "szarpie". Powiązany z tym może być jest błąd opóźniania się obrazu za wejściem z myszki, doświadczany przy pisaniu GUI. Rozwiązania są różnorodne:
Przesuwać obiekty nie o stałą odległość w każdej klatce, ale o prędkość pomnożoną przez różnicę czasu, jaki upłynął od poprzedniej klatki do bieżącej. Innymi słowy, chodzi o szkolny wzór s += v * dt. To jedna z podstawowych zasad w programowaniu gier, każdy powinien ją znać.
Można spróbować włączyć pionową synchronizację (VSync). W Direct3D odpowiada za to flaga D3DPRESENT_INTERVAL_DEFAULT. To ogranicza liczbę FPS do częstotliwości odświeżania ekranu, ale niweluje sytuację, kiedy połowa ekranu pokazuje starą klatkę, a połowa nową. Podobno kiedyś na starych kartach graficznych pomagało też na jakieś migotanie, ale sam nigdy niczego takiego nie widziałem.
Można wywołać na początku programu funkcję WinAPI: SetThreadAffinityMask(GetCurrentThread(), 1); To sugestia dla systemu, żeby wątek główny przywiązać na stałe do pierwszego procesora, co powinno naprawić problemy z pomiarem czasu za pomocą Query Performance Counter na procesorach wielordzeniowych. Choć są i tacy, którzy twierdzą, że to nie pomaga. Mnie pomogło. (O tej metodzie powiedział mi mINA87.)
Utworzyć obiekt IDirect3DQuery9 typu D3DQUERYTYPE_EVENT, a przed wywołaniem metody urządzenia Present wywoływać dla tego Query metodę Issue(D3DISSUE_END). To powoduje zaczekanie z zakończeniem klatki na wszelkie renderowanie wykonywane asynchronicznie przez kartę graficzną. Dzięki temu nie "zbiera się" wiele klatek, co niweluje szarpanie, daje lepszą synchronizację myszki z obrazem oraz naprawia błąd w sterowniku nVidia, na który kiedyś natrafiłem, a który powodował nierenderowanie części geometrii. (O tej metodzie powiedział mi ayufan.)
Podobno są tacy, którym powyższy sposób nie pomaga. Wówczas pozostaje jeszcze brutalne wymuszenie zaczekania na kartę za pomocą sztuczki z blokowaniem powierzchni. Opisana jest tutaj: Input Lag.
(O tej metodzie powiedział mi Krzysiek K.)