Saniyede çerçevelerin kapatılmasının faydaları nelerdir? (Varsa)


13

OpenGL'de ekran başlatma ve giriş için SDL kullanarak basit bir oyun üzerinde çalışıyorum ve zamanlama açısından bana göre iki seçeneğim var. Birincisi, optimalTimePerFrame için uyuyor - theTimeTakenToRender, saniye cinsinden optimalTimePerFrame = 1 / theFramerateCap olduğunda. (Bunun gerekli olup olmadığından tamamen emin değilim, çünkü daha doğru olabilir vsync kullanmaya eşdeğerdir. Varsayım doğruysa, lütfen SDL + OpenGL'nin varsayılan olarak vsync olup olmadığını söyle ve nasıl değilse Diğeri son kare oluşturulduğundan bu yana geçen süreyi ölçmek ve hareketi buna göre ayarlamaktır. (Bir kareyi oluşturmak için daha kısa süre geçtikçe, o karede daha az varlık hareket eder). Performans ve azalan titreme vb. Açısından, bu iki yöntemin avantajları ve dezavantajları nelerdir?

Yanıtlar:


15

Kare süreniz tahmin edilemezse (bu sizin hatanız olsun ya da olmasın; işletim sistemi zaman zaman kaynakları kullanıyor olabilir, vb.), Elde edilebilir kare hızınızdan biraz daha düşük olan öngörülebilir bir kare hızına sınırlamak, tahmin edilebilir gecikme için çok şey yapar ; oyunu çok daha iyi hissettirecek.

Girdiyi işleme koyma ve bu girdiyle ilgili değişiklikleri oluşturma arasında ne kadar süre geçmesi kötü hissedilebilir - ortalama olarak ikisi arasında daha az gecikme olsa bile , "titreşim" insanlar tarafından fark edilebilir (bilinçli veya bilinçsiz olarak).

Burada bazı bilgiler için Çerçevede Neler: Yırtılma, Gecikme ve Kare Hızı başlıklı Microsoft GameFest sunumuna bakın . Carmack ayrıca bu konuda yararlı olan bir dizi blog yayınına da sahiptir .

Ayrıca, bazı deltaTdeğerleri düşük değerler kullanarak çerçeveler çalıştırdığınızda veya değişken kullandığınızda bile deltaT(bazı şeylerin "istikrarlı" ve öngörülebilir bir şekilde yapılması zorlaşabilir veya hatta zorlanabilir hale gelebileceğini unutmayın. tekrarlar ve bazı ağ senkronizasyonu gibi). Bir fikir edinmek için Timestep'inizi Düzeltme konusuna bakın .


1
(Bu arada, "uyku" ile kapatmamanızı şiddetle tavsiye ederim; platformunuzda vsync durumunuzun ne olduğunu anlayın ve sizi yönlendirmek için vsync'yi kullanın. Çok daha tahmin edilebilir ve genellikle daha az kaynak kullanır.)
leaher

Teşekkürler, kesinlikle kare hızını sınırlamaya çalışacağım. SDL kullanarak vsync'i nasıl etkinleştireceğinizi biliyor musunuz?
w4etwetewtwet

1
SDL 2.0'da, SDL_RENDERER_PRESENTVSYNC bayrağını SDL_CreateRenderer çağrısına ileterek vsync'yi etkinleştirebilirsiniz, örn.SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
TJS

12

Çok daha az CPU kullanacaksınız (çoklu görevliler size teşekkür edecek) ve mobil cihazlardaki insanlar da bunu takdir edecek.


4
Daha düşük güç kullanımından (mobil cihazlar / dizüstü bilgisayarlar için önemlidir) ve daha az ısı üretiminden bahsetmiyorum.
zeel

Menülerdeki FPS sınırsız ve inanılmaz derecede yüksek, 900 fps gibi bazı oyunlar sorununu hatırlatıyor ve bu gerçekten CPU / GPU -> daha yüksek sıcaklık -> daha fazla gürültüyü vurguladı.
Kromster

10

Kareyi kontrol etmek için asla Uyku'yı asla, asla, asla, asla kullanmamalısınız .

Bu daha önce bitti ve nedenlerini tartışmak için sizi diğer soruya yönlendireceğim. Bir şey değil 60Hz tipik Modern yenileme hızında ve Uyku aramaların tipik 1 milisaniye boyu ile, bu çerçevelerin arasındaki zaman ve doğru miktarda Uyku aslında imkansız olduğunu vardır belirtti.

Ben değilim değil size ilgisi var eğer CPU veren kötü bir şey olduğunu söyleyerek; ne münasebet. Ancak, kare hızını kontrol etmekle aynı şey değildir ve Uyku, öncekine uygun olan ancak ikincisine uygun olmayan bir çözümdür.

Bunun yerine geçen süreyi kontrol edin ve bir çerçeve çalıştırma zamanı gelmişse, aksi halde bunu yapın - ve biraz CPU vermek istiyorsanız - Çıplak minimum süre uyuyun - 1 milisaniye. Ayrıca, iyi bir çözünürlük sağlamak için uyku zamanlayıcınızın platformunuz için uygun şekilde ayarlandığından emin olun; yani "Uyku (1)" çağrısında bulunduğunuzda, aslında 15, 20 veya 30 gibi bir şey yerine 1 milisaniyede gerçekten uyuma şansınız vardır (aksi takdirde durum böyle olur). SDL'nin bunu sizin için otomatik olarak yapacağına inanıyorum.

Ayrıca, bir çerçeve çalıştırmak için zamanınız yaklaşırsa, Uyku modunu durdurabilir ve çerçeve çalışana kadar düz bir şekilde çalışmaya başlayabilirsiniz, bu da istediğiniz çerçeve aralığını daha doğru bir şekilde vurmanıza yardımcı olabilir.

Bunun neye benzediği, ara sıra çerçeveyle serpiştirilmiş bir sürü Uyku (1) çağrısıdır ve bu sorun değildir. İhtiyacınız olmadığında hala CPU'dan vazgeçiyorsunuz, ancak çerçeveleriniz zamanında çalışmaya devam edebilecek.



0

Daha önce de belirtildiği gibi, CPU kullanımını azaltır. Flipside ve giderek daha önemli olan, bu da pil ömrünü tüketir. İyi bir örnek olarak FTL, MBA'imde neredeyse% 100 CPU ile çalışıyor. Sonuç olarak, pili 2 saatten fazla boşalır ve çok sıcak çalışır. (Daha doğrudan bir sonuç olarak, kaldırdım ve artık oynatmıyorum ...). Bir çerçeve kapağı bunu önlerdi.

Bir başka bahsi geçmeyen avantaj ise, eğer çok oyunculu bir oyunsa, herkese aynı deneyimi vererek oyun alanını da seviyelendirirsiniz.


Kare hızı ve oyun güncelleme döngünüzün aynı hızda çalışması gerekmez, bu nedenle insanlara aynı deneyimi sunmak yalnızca kare hızına bağlı değildir.
Thomas
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.