Kare hızı sınırlaması


9

En başarılı rekabetçi oyun motorları gibi id Tech, GoldSrc, Sourceve bu tür kare hızı sınırlamalar için izin verir.

30, 60, 99, 72, 68, 68 vb. İle oynayabilirsiniz. Kısacası, onu kapatabilir ve kapağı kontrol edebilirsiniz.

Merak ediyordum, kare hızını nasıl sınırlayabilirim?

Kodla değil, teoriyle ilgileniyorum.


Sadece meraktan, bunun diğer süreçler için döngüleri serbest bırakmaktan başka ne anlamı var?
3Dave

1
@DavidLively, dizüstü bilgisayarları, çok yüksek bir kare hızında çok kolay ısınanları düşünün, 60 fps'lik bir kapakla (daha fazlası yine de işe yaramaz, 60 bile biraz fazla, 40 yapmalı) sıcaklığı daha iyi kontrol edebilirler.

Rekabetçi oyunlar için, bazen bazı eylemler kare hızına bağlı ve zamana bağlı olmadığından, 60 ve 100 fps arasındaki artışlar yerine eşit bir kare hızına sahip olmak en iyisidir, eşit bir kare hızı bu eylemleri hissetmenizi sağlar. Btw, VSync'i etkinleştirirseniz oyununuzun her zaman yenileme hızınıza eşit bir maksimum fps'ye sahip olduğunu unutmayın (çünkü sürücü bununla ilgilenir).
Roy T.

Yanıtlar:


7

Teori: Bir kareyi en son ne zaman oluşturduğunuzu kontrol edin ve henüz başka bir kare çizmenin zamanı gelmiyorsa, yapmayın ve bitene kadar bekleyin.


8

Kare hızınızı 60 fps ile sınırlamak istediğinizi varsayalım, bu her karenin 1 / 60s = 16,67ms (yuvarlak) oluşturma süresine sahip olduğu anlamına gelir

Kare hızınızı sınırlamak için sadece oyun döngünüzün başlangıcındaki zamanı kontrol edersiniz, daha sonra oyun döngüsünün sonundaki zamanla karşılaştırabilirsiniz: fark 16.67 ms'den azsa o zaman durmanız gerekir.

Bunu yapmanın bir yolu şunları kullanmaktır:

sleep(waittime)

Ancak sleep(x), ipliği minimum xmilisaniye boyunca verdiğinden, kontrolü zamanında geri alıp almayacağınızdan emin değilsiniz.

Kullanmanın daha iyi bir yolu:

while(timediff < 16.67ms){ sleep(0); }

Bu ipliği verir ve mümkün olan en kısa sürede kontrol talep eder.

Başka bir çözüm, sadece meşgul bir bekleme döngüsüne sahip olmaktır, bu size en iyi kontrolü sağlar, ancak CPU'yu gereksiz yere kullanır.

İşletim sistemi zamanlayıcısının her zaman iş parçacığınızdan kontrolü kaldırabileceğini unutmayın, bu nedenle bazı dalgalanmalara hazırlıklı olun.


"1 / 60s" net olsun. :)
Richard Marskell - Drackir

Bu çözüm gerçekten kötü. Vsync özelliğini etkinleştirdiyseniz veya işletim sistemi bir şeyler yapmaya karar verirse, kare hızınız çok dalgalanır.
Tara

@Dudeson Neden kötü? (bu Quake3 btw'de kullanılan tekniktir). FPS'niz 60'dan düşükse döngü atlanır. Bu yüzden FPS'nizi mümkün olduğunca yüksek tutar, ancak asla 60'ın üzerinde tutmaz.
Roy T.

@RoyT. İlginç ... Bu bilgiyi nereden aldın? Kaynak koddan mı? Ayrıca, bir döngüde beklemenin kötü olduğunu söylüyorum, çünkü bunu tam olarak motorumda yaptım ve bu bana çok acı veriyor. Sorun, vsync'i (GPU sürücüsünde) açtığınızda, kodunuzdaki kare hızını da sınırlamaya çalışırsanız çok fazla kare damlası elde edersiniz, çünkü zamanınız her kare mükemmel olmayacaktır. Sadece vsync sorunları hakkında konuşuyorum. Vsync olmadan bu bir sorun değildir. Ve vsync'in Quake 3 gün içinde bugün olduğu gibi bir anlaşma olup olmadığından emin değilim.
Tara

@ Birisi bana bir süre önce bunu işaret etti çünkü meşgul bekleme ve uyku konusunda endişeliydim. Görüyorum ki v-sync açıkken 30fps ile 60fps arasında dalgalanabilirsiniz. Ama sanırım bu herhangi bir teknikle oluyor (FreeSync'in bunu hafifletmeye çalıştığı şey bu değil). Kodla sınırlı bir kare hızı veya bilgisayarınız 60 fps'de işleyemediğinden her zaman bu sorunu yaşayacağımı düşünüyorum :)
Roy T.
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.