Yarı sabit veya tam sabit zaman aşımı?


15

Bir iphone shmup yapıyorum ve ne tür oyun döngüsü kullanılacağına karar vermeye çalışıyorum. Yarı sabit zaman adımını veya tam sabit zaman adımını kullanmak istiyorum.

Yarı sabit zaman testiyle sıfır veya daha fazla güncelleme (FIXED_INTERVAL) çağrısı ve ardından bir güncelleme (dt) çağrısı yapacağım, burada oyun döngüsü başına dt <= FIXED_INTERVAL. Ben bu yöntemle dezavantajları benim temelde her güncelleme için bir değişken dt varsaymak zorunda çünkü benim fizik güncelleme (dt) mantığı programlamak için daha zor olacak olmasıdır. Ve sonra, kayan nokta değerlerinin her seferinde aynı olmaması nedeniyle oyunumun her çalışmasının biraz farklı olacağını duydum.

Sonra tamamen sabit bir zaman çizelgesi ile sıfır veya daha fazla güncelleme (FIXED_INTERVAL) çağrıları ve ardından bir enterpolasyon (dt / FIXED_INTERVAL) çağrısı yapıyorum, burada oyun döngüsü başına dt <FIXED_INTERVAL.

Bu yüzden gerçekten yapmak zorunda olduğum büyük karar şudur: Değişken dt ile bir güncelleme (dt) uygulama zorluğunu çözmek mi yoksa enterpolasyon uygulama zorluğuyla mı uğraşmak istiyorum?

Şimdi okuduğum kadarıyla insanların çoğunluğu tam sabit kullanmayı ve enterpolasyon yapmayı söylüyor. Ama enterpolasyonu uygulamayı düşündüğümde, değişken dt ile bir güncellemeden (dt) çok daha karmaşık olurdu. Çünkü enterpolasyon kullanırsam hem önceki durumu hem de mevcut durumu hatırlamalıyım. Bu yüzden enterpolasyon kullanmak istiyorsam, tüm bireysel oyun durumlarını özetleyen ek bir dolaylama katmanı bulmalıyım. İnterpolasyon kullanmak zorunda olmadığım yarı sabit zaman aşımı ile bir oyun durumu soyutlaması yapmak zorunda değilim çünkü her zaman sadece bir oyun durumu vardır ve bu sadece düşmanlarımı ve düşmanımı temsil eden "küresel diziler" madde işaretleri vb.

Peki daha pratik bir seçim nedir: fizik güncellemelerimin dt değişkeni ile karmaşıklaşabileceğini bilerek yarı sabit olarak uygulayabilir miyim? Yoksa tam olarak sabit mi kullanıyorum ve enterpolasyon yapmak için önceki durumu ve mevcut durumu izleyebilmem için bir oyun durumu soyutlaması mı bulmaya çalışıyorum?


Burada oldukça iyice kaplıdır
michael.bartnett

1
Bu tartışmayı ve oradaki bağlantıları defalarca okudum. Aslında bu yazıya geldim. Sorum, esas olarak, bu tartışmada hiç yer almayan enterpolasyon elde etmek için oyun durumlarının nasıl uygulanacağı ile ilgilidir.
Ryan

Yanıtlar:


12

Tamamen Sabit

Her kareye bir kez değişken bir adım attığınızda sabit bir zaman adımının avantajlarının çoğunu kaybedersiniz.

Noel Lopis, Casey's Contraptions oyununda sabit bir zaman adımını nasıl uyguladığı hakkında harika bir yazı yazdı . Sana bonus olarak bir iphone geliştiricisi, tekniği iphone'a özgü olmasa da.

Makaleden bazı önemli noktalar

  • Bir zaman akümülatörü kullanın.
  • 60Hz kare hızı için 120Hz fizik hızını kullanın.
  • Geleceğe sabit bir adım simüle edin ve mevcut fizik durumu ile gelecekteki fizik durumu arasındaki çizim kodunu almak için zaman içinde kalan birikimi kullanın.
  • çeşitli yakaladım

2

"Yarı sabit" ve "tam olarak sabit" zaman aralığı olarak adlandırdığınız şey, bence, hem sabit zaman aralığıdır - çağrınıza ilettiğiniz dt , updatekareler arasında değişmez.

Yani, sorunuz aslında "oluşturma amacıyla enterpolasyon uygulamak istiyor muyum?" Cevap: muhtemelen hayır .

İnterpolasyon, yalnızca sabit zaman updateçizelgeniz hedef zaman renderçizelgenizden belirgin şekilde farklıysa yapmak istediğiniz bir şeydir. Sadece 10Hz'de updateçağrı updateyapmak, ancak tam kare hızında render yapmak için yorucu bir aşaması olan oyunlar için nadir değildir .

Bir iPhone shmup yazdığınızdan, ne sizin updatene de renderihtiyacınız özellikle CPU yoğunluklu değildir; çerçevenizi 30Hz veya 60Hz'e kolayca kilitleyebilir, uygulamadan rahatsız olmaz ve yine de pürüzsüz görünümlü bir oyuna sahip olabilirsiniz.


Anlamıyorum. Oyun döngümde hesaplayacağım büyük dt'yi kilitleyebileceğimi söylüyorsun - fizikimin tükettiğini mi söylüyorsun? Bunu nasıl yaparım? CADisplayLink ile yapabilir miyim? Yani, ne kadar CPU kullandığınızı düşünüyorsunuz? Gerçekten kilitli oyun döngü dt varsayalım?
Ryan

Söylediklerim gerçekten buna bağlı: işe yarayacak en az karmaşık şeyi yapın.
Blair Holloway

1
Detaylandırma: ve dtiçin bir değişken kullanmak işe yarayacak en basit şeydir, ancak fizik motorlarını neden olduğu istikrarsızlık için kullanırken genellikle kaçınılır. Bu nedenle, sabit bir şekilde çağrı yapmak ve aynı oranda işleme ( uzun süre çalışırsa çerçeveleri düşürürken ) genellikle işe yarayacak en basit şeydir. Aramalar arasında enterpolasyon yapmak için kod yazmak, kodunuza karmaşıklık katar; özellikle hiçbir sorunu çözmek için eklediğiniz karmaşıklık. updaterenderupdatedtupdateupdate
Blair Holloway
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.