Son zamanlarda Game Loops ile ilgili bu makaleyi okudum: http://www.koonsolo.com/news/dewitters-gameloop/
Önerilen son uygulama beni derinden karıştırıyor. Nasıl çalıştığını anlamıyorum ve tam bir karmaşaya benziyor.
İlkeyi anlıyorum: Oyunu sabit bir hızda güncelleyin, kalan ne olursa olsun, oyunu mümkün olduğunca çok kez işleyin.
Ben alayım ki kullanamazsınız:
- 25 kenede girdi alın
- 975 keneler için oyunu render
Yaklaşımın ikincisinin ilk kısmı için girdi alacağınızdan ve bu garip hissedeceğinizden mi? Yoksa makalede neler oluyor?
esasen:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
Bu nasıl geçerli?
Değerlerini varsayalım.
MAX_FRAMESKIP = 5
Ana oyun döngüsü söylenmeden önce başlatıldıktan sonra anlar atanan next_game_tick'i varsayalım ... 500.
Son olarak, oyunum için SDL ve OpenGL kullandığım için, OpenGL yalnızca oluşturma için kullanıldığından, GetTickCount()
SDL_Init çağrıldığından bu yana geçen süreyi döndürdüğünü varsayalım .
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
Kaynak: http://www.libsdl.org/docs/html/sdlgetticks.html
Yazar ayrıca şunları varsayar:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
İfadeyi genişletirsek while
:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750 çünkü zaman next_game_tick
atandı. loops
makalede gördüğünüz gibi sıfırdır.
Bu yüzden while döngüsüne girdik, biraz mantık yapalım ve bazı girişleri kabul edelim.
Yadayadayada.
Size ana oyun döngümüzün içinde olduğunu hatırlattığım while döngüsünün sonunda:
next_game_tick += SKIP_TICKS;
loops++;
While kodunun bir sonraki yinelemesinin nasıl göründüğünü güncelleyelim
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000 çünkü GetTickCount () öğesinin geri çağrıldığı döngünün bir sonraki başlangıcına ulaşmadan önce girdi alma ve bir şeyler yapma zamanı geçti.
540 çünkü 1000/25 = 40 kodunda, 500 + 40 = 540
1 çünkü döngümüz bir kez yinelendi
5 , neden biliyorsun.
Yani, bu While döngüsü MAX_FRAMESKIP
amaçlanan değil TEMİZLE bağımlı olduğundanTICKS_PER_SECOND = 25;
çünkü oyun nasıl düzgün çalışması gerekiyordu?
Bunu koduma uyguladığımda, kullanıcı girişini işlemek ve oyunu makalenin yazarının örnek kodunda ne olduğuna göre yeniden çizmek için fonksiyonları yeniden adlandırdığımda doğru bir şekilde ekleyebileceğim sürpriz değildi .
Yerleştirdim fprintf( stderr, "Test\n" );
Oyun döngüsü bitene kadar basılmayan bir while döngüsü içerisine .
Bu oyun döngüsü saniyede 25 kez çalışıyor, garanti ediliyor ve olabildiğince hızlı oluşturuluyor?
Bana göre, BÜYÜK bir şey eksik sürece, hiçbir şey ... gibi görünüyor.
Ve bu while döngüsü, bu yapı saniyede 25 kez çalışıyor ve daha sonra makalenin başında daha önce bahsettiğim oyunu tam olarak güncellemiyor mu?
Eğer durum buysa, aşağıdaki gibi basit bir şey yapamadık:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
Ve başka bir şekilde enterpolasyon için sayın.
Son derece uzun sorumu affedin, ama bu makale bana faydadan çok zarar verdi. Şimdi ciddi bir şekilde kafam karıştı - ve tüm bu sorulardan dolayı uygun bir oyun döngüsünün nasıl uygulanacağı hakkında hiçbir fikrim yok.