19
2011
Bölüm 3. Android için Oyun Döngüsü Kavramı
Değişken FPS kullanan Oyun Hızı
Oyun döngüsüne yönelik bu yaklaşım tarzı ise oyunun mümkün olduğunca hızlı oynanmasını sağlamaktadır. Oyunun hızının FPS katsayısı belirlendiği bu yaklaşımda oyun, bir önceki çerçeve “frame” ile zaman farkı gözetilerek güncellenir. Yani FPS değişkeninin değeri çerçeveler arasındaki değişken zaman farkıdır.
DWORD prev_frame_tick;
DWORD curr_frame_tick = GetTickCount();
bool game_is_running = true;
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update_game( curr_frame_tick – prev_frame_tick );
display_game();
}
Yukarıdaki kod bir önceki “FPS’ye Bağlı Sabit Oyun Hızı” yaklaşımındaki koda göre biraz daha karmaşıktır. Çünkü update_game fonksiyonu içerinde zaman farkını hesaplamamız gerekmektedir. Bu yaklaşım ilk bakışta ideal bir çözüm gibi görülmektedir. Bu tarz bir çözümü kullanan birçok programcı mevcuttur. Makalede bu çözümün yavaş ve hızlı donanımlar üzerinde çok ciddi problemleri olduğu gösterilecektir.
Yavaş Donanım
Yavaş donanımlar bazı zamanlarda ciddi gecikmelere neden olmaktadır. Bu durumlarda oyun hızı oldukça yavaşlamaktadır. Özellikle yoğun grafik işlemleri gerektiren 3 boyutlu oyunlarda bu durum oldukça sık olmaktadır. Çerçeve gösterim hızının “frame rate” düşmesi giriş tepki süresini ve dolayısıyla kullanıcıya verilen reaksiyon zamanını ciddi etkileyecektir. Oyun durumuna ait güncelleme zamanları artacağından, oyun oynandığı sırada gecikmeler hissedilecektir. Bütün bunların sonucu olarak oyuna ait grafik gösterimi ve kullanıcı girişlerine verilen reaksiyonlar yavaşlayacak dolayısıyla ciddi problemlerle karşılaşılacaktır. Örneğin normal FPS ile oyun içerisindeki bazı problemler kolayca aşılır iken yavaş FPS katsayısı ile bu durum mümkün olmamaktadır. Yavaş donanımla çalışır iken özellikle oyun içerisindeki fiziksel benzetimlerin çalışmama veya hata verme olasılığı oldukça yüksektir.
Hızlı Donanım
Muhtemelen yukarıdaki yaklaşımın hızlı bir donanım üzerinde ne gibi hatalar vereceği merak konusu olacaktır. Bu durumu için bilgisayar matematiği hakkında bazı noktaları tekrar hatırlamak gerekir. Bilgisayarlarda kayan noktalı “float” veya çift kayan noktalı “double” değerler için hafıza alanı sınırlıdır. Hatta bazı değerler gösterilemeyebilir. Örneğin, 0.1 ikilik tabanda tam olarak gösterilemez. Bu nedenle hafızada double formatında saklanır. Bu durumu python kullanarak gösterelim;
>>> 0.1
0.10000000000000001
Yukarıdaki örnek tek başına pek bir şey ifade etmiyor gibi görünebilir. Ancak bu durumun sonuçları donanım açısından oldukça çarpıcıdır. Diyelim ki, milisaniye başına 0.001değerinde hıza sahip bir yarış arabasına sahipsiniz. Bu durumda yarış arabası 10 saniye sonra 10.0 değerinde mesafe kat etmiş olacaktır. Bu hesaplama saniye başına düşen çerçeveyi “Frame Per Second-FPS” giriş olarak kabul alan bir fonksiyonda aşağıdaki gibi olacaktır.
>>> def get_distance( fps ):
… skip_ticks = 1000 / fps
… total_ticks = 0
… distance = 0.0
… speed_per_tick = 0.001
… while total_ticks < 10000:
… distance += speed_per_tick * skip_ticks
… total_ticks += skip_ticks
… return distance
40 FPS sonrasında kat edilen mesafeyi hesaplayalım;
>>> get_distance( 40 )
10.000000000000075
Fonksiyonun sonucunda elde edilen değer hesaplama sonucunda elde edilen değerden farklıdır. Çünkü fonksiyon çalıştığında, “while” komutu içerinde 400 tane ayrı toplama yapılmıştır. Tabi ki bu toplamalarda oluşan yuvarlama hatası sonucu farklılaştıracaktır.
Peki 100 FPS değeri değerinde sonuç ne olacaktır?
>>> get_distance( 100 )
9.9999999999998312
Hata daha çok büyümektedir. Çünkü 100 FPS değerinde daha fazla toplama işlemi yapılmaktadır. Dolayısıyla yuvarlama hatası daha büyük olacaktır. Dolayısıyla oyun hızı 40 veya 100 FPS değerlerinde çalışken farklı olacaktır.
>>> get_distance( 40 ) – get_distance( 100 )
2.4336088699783431e-13
Bu farkın oyun döngüsü içerisinde önemsenmeyecek bir değer olduğunu düşünebilirsiniz. Fakat asıl problem diğer hesaplamalar için bu yanlış değeri kullandığınızda ortaya çıkacaktır. Bu durumda önemsenmeyecek bu hata çok daha büyüyecek ve yüksek çerçeve hızında oyunun tamamen yıkacaktır. Bu tarz bir sorunu çözmek için oyunu yeniden yazmanız gerekebilir.
Sonuç
Bu tip oyun döngüsü yazılımı başlangıçta pratik ve iyi görünebilir ancak aldatıcıdır. Hem yavaş hem de hızlı donanım için oyun içerisinde ciddi sorunlar çıkarabilir. Bu problemlerin yanı sıra update_game() fonksiyonun yazılım “FPS’ye Bağlı Sabit Oyun Hızı” yaklaşımında update_game() fonksiyonun yazılına göre çok daha zordur.
Kariyer
- Yazılım Geliştirme Uzmanları
MobilMutfak - Java Yazılım Uzmanı
Yapı Kredi Emeklilik - Java Yazılım Uzmanı
Universal Bilgi Teknolojileri - Yazılım Geliştirmeci ve Proje Mühendisi
Yapı ve Kredi Bankası - Java Yazılım Uzmanı
Abaküs Finansal Yaz. A.Ş








