Bir oyun döngüsü sabit veya değişken zaman adımlarına mı dayanmalı? Biri her zaman üstün mü, yoksa doğru seçim oyuna göre değişiyor mu?
Değişken zaman aşaması
Fizik güncellemeleri "son güncellemeden bu yana geçen bir argüman" argümanından geçirilir ve dolayısıyla kare hızına bağlıdır. Bu, hesaplama yapmak anlamına gelebilir position += distancePerSecond * timeElapsed
.
Artıları : pürüzsüz, kodlanması kolay
Eksileri : deterministik değil, çok küçük veya büyük adımlarla tahmin edilemez
deWiTTERS örneği:
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Sabit zaman adımı
Güncellemeler, her güncellemenin belirli bir süre için olduğunu varsaydığı için, "geçen süreyi" bile kabul etmeyebilir. Hesaplamalar olarak yapılabilir position += distancePerUpdate
. Örnek, oluşturma sırasında bir enterpolasyonu içerir.
Artıları : tahmin edilebilir, deterministik (ağ senkronizasyonu kolay mı?), Daha net hesaplama kodu
Eksileri : v-sync'i izlemek için senkronize edilmez (enterpolasyon yapmazsanız jittery grafiklere neden olur), sınırlı maksimum kare hızını (enterpolasyon yapmazsanız), çerçevelerde çalışmak zor değişken zaman adımlarını varsayalım ( Pyglet veya Flixel gibi )
deWiTTERS örneği:
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
Bazı kaynaklar
- Oyunlarda Gaffer: Zamanınızı düzeltin!
- deWitter oyun döngüsü yazısı
- Quake 3'ün FPS sıçrama fiziğini etkiler - genelde bir neden Doom 3'ün 60 fps'ye kilitli kalması mı?
- Flixel değişken bir zaman aralığı gerektirir (bunun Flash tarafından belirlendiğini düşünüyorum), Flashpunk ise her iki türe de izin verir.
- Box2D'nin El Kitabı § World of Box2D'yi simüle etmek, sürekli zaman adımlarını kullanmasını önerir.