Ağu
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.

 

 

 

Yorum yapabilirsiniz..

Yazar : Suhap Şahin

En son haber ve ücretsiz eğitimlere ulaşmak için üye olabilirsiniz