Bir oyun döngüsünde güncellemeden bağımsız oluşturmanın amacı nedir?


74

Oyun döngülerinde onlarca makale, kitap ve tartışma var. Ancak, oldukça sık böyle bir şeyle karşılaşıyorum:

while(running)
{
    processInput();
    while(isTimeForUpdate)
    {
        update();
    }
    render();
}

Temel olarak beni bu yaklaşımdan rahatsız eden şey “güncellemeden bağımsız” oluşturmadır; örneğin, hiçbir değişiklik olmadığında bir çerçeve oluşturur. Öyleyse benim sorum bu yaklaşımın neden sık sık öğretildiği?


6
Şahsen, gameprogrammingpatterns.com/game-loop.html yararlı bir açıklama buldum
Niels

12
Renderde değişikliklerin tümü oyun durumuna yansıtılmaz. Ayrıca, bu kod parçasının noktasını yanlış anladığınızdan şüpheleniyorum - güncelleme başına birden çok kez değil, oluşturma başına birden çok kez güncelleme yapmanıza olanak tanır.
Luaan

13
Kod okur unutmayın yapın while (isTimeForUpdate), değil if (isTimeForUpdate). Asıl amaç, olmadığında render()değil update(), s update()arasında tekrar tekrar render()yapmaktır. Ne olursa olsun, her iki durumun da geçerli kullanımları var. Birincisi, durum updateişlevinizin dışında değişebiliyorsa geçerli olacaktır , örneğin, geçerli saat gibi kapalı duruma göre yapılanları değiştirirse. Sonuncusu geçerlidir, çünkü fizik motorunuza çok sayıda küçük, hassas güncelleme yapma imkanı verir, bu da örneğin engeller vasıtasıyla 'eğilme' olasılığını azaltır.
Thierry

Daha mantıklı bir soru, "güncellemeye bağımlı hale
getirme

1
Ne sıklıkta hiçbir şey yapmayan bir güncellemeniz var? Arka plan animasyonlarını veya ekran saatlerini bile güncellemiyor musunuz?
pjc50

Yanıtlar:


113

Bu ortak kongreye nasıl ulaştığımızın uzun bir geçmişi var, yol boyunca çok fazla zorlayıcı zorluklar oldu, bu yüzden onu aşamalar halinde motive etmeye çalışacağım:

1. Sorun: Aygıtlar farklı hızlarda çalışıyor

Hiç modern bir bilgisayarda eski bir DOS oyunu oynamayı denediniz ve oynanamaz bir şekilde hızlı çalışıyor - sadece bir bulanıklık?

Eski oyunların çoğunda çok naif bir güncelleme döngüsü vardı - ne kadar zaman geçtiğini hesaba katmadan girdi topladılar, oyun durumunu güncellediler ve donanımın izin verdiği kadar hızlı hale getirdiler. Donanım değiştiği anda oyun oynanır.

Genellikle oyuncularımızın, geçen yılın telefonunu veya en yeni modelini, en üst seviye oyun masaüstünü veya orta seviye dizüstü bilgisayar.

Özellikle, rekabetçi olan oyunlar için (çok oyunculu veya skor tabloları aracılığıyla), belirli bir cihazda çalışan oyuncuların diğerlerine göre avantaj sağlamasını istemeyiz, çünkü daha hızlı koşabilirler veya daha fazla tepki verebilecekler.

Buradaki kesin çözüm, oyun durumu güncellemelerini yapma oranını kilitlemektir. Bu şekilde sonuçların her zaman aynı olacağını garanti edebiliriz.

2. Öyleyse, neden sadece kare hızını kilitlemiyorsunuz (örn. VSync kullanarak) ve hala oyun durumu güncellemelerini ve gösterimini lockstep'te çalıştırmıyorsunuz?

Bu işe yarayabilir, ancak izleyiciler için her zaman zevkli değildir. Uzun süredir 30 fps hızında koşarken oyunlar için altın standart olarak kabul edildi. Artık oyuncular, özellikle çok oyunculu aksiyon oyunlarında rutin olarak 60 fps minimum bar bekliyorlar ve bazı eski oyunlar şimdi beklentilerimiz değiştikçe belirgin şekilde dalgalı görünüyor. Ayrıca özellikle de kilitleri çerçevelemeye itiraz eden sesli bir bilgisayar çalar grubu var. Son teknolojiye sahip donanımları için çok para ödediler ve bu hesaplama kasını kullanabileceği en yumuşak, en yüksek kalitede render için kullanabilmek istiyorlardı.

Özellikle VR'de, kare hızı kraldır ve standart sürünmeye devam eder. Son VR canlanmasının başlarında, oyunlar genellikle 60 fps civarındaydı. Şimdi 90 daha standart ve PSVR gibi bir donanım 120'yi desteklemeye başlıyor. Bu henüz artmaya devam edebilir. Bu nedenle, eğer bir VR oyunu bugün yapılabilecek ve kabul görmüş olanlarla sınırlandırırsa, donanım ve beklentiler daha da geliştikçe geride bırakılabilir.

(Kural olarak, genellikle "sırayla bir kareyi tanıma" gibi belirli bir "algı" türüne dayandığı için "oyuncular XXX'tan daha hızlı bir şey algılayamaz" derken dikkatli olun. Hareketin devamlılığı algısı genellikle çok daha fazladır hassas. )

Buradaki son sorun, kilitli bir kare hızını kullanan bir oyunun da muhafazakar olması gerektiğidir - oyunda bir anda çok fazla sayıda nesneyi güncellediğiniz ve görüntülediğiniz bir anı vurursanız, çerçevenizi kaçırmak istemezsiniz. son teslim tarihi ve belirgin bir kekemelik veya aksamaya neden olur. Dolayısıyla, içerik bütçelerinizi boşluk bırakacak kadar düşük tutmanız veya tüm oyun deneyimini en az özellikli donanımdaki en kötü durum performansına zorlamaktan kaçınmak için daha karmaşık dinamik kalite ayarlama özelliklerine yatırım yapmanız gerekir.

Bu, özellikle performans sorunları geç gelişme halinde ortaya çıkarsa, mevcut tüm sistemlerinizin şimdi her zaman vuramayacağınız bir adım adım görüntü oluşturma çerçevesini varsayarsak ve ayarlandığı zaman sorunlu olabilir. Dekuplaj güncelleme ve oluşturma oranları, performans değişkenliği ile başa çıkmak için daha fazla esneklik sağlar.

3. Sabit bir zaman diliminde güncelleme yapmak, (2) ile aynı sorunları yaşamıyor mu?

Bence asıl sorunun özü şu: güncellemelerimizi birleştirir ve bazen aralarında oyun durumu güncellemesi olmayan iki kareyi oluşturursak, o zaman daha belirgin bir değişiklik olmadığından, daha düşük bir kare hızında lockstep oluşturma ile aynı olmaz mı? ekran?

Oyunların, bu güncellemelerin ayrışmasını iyi bir sonuç elde etmek için kullanmasının birkaç farklı yolu var:

a) Güncelleme oranı , oluşturulan kare hızından daha hızlı olabilir

Tyjkenn başka bir cevabın da belirttiği gibi, özellikle fizik çoğu kez renderleme işleminden daha yüksek bir frekansta kademelendirilir, bu da entegrasyon hatalarını en aza indirmeye ve daha doğru çarpışmalar vermeye yardımcı olur. Dolayısıyla, oluşturulan kareler arasında 0 veya 1 güncelleme yapmak yerine, 5 veya 10 veya 50 olabilir.

Şimdi 120 fps'de oynatıcı, kare başına 2 güncelleme alabilirken, 30 fps'de daha düşük özellikli donanım sunumu yapan oyuncu, kare başına 8 güncelleme elde ediyor ve her iki oyunu da aynı anda saniyede aynı hızda oynuyor. Daha iyi donanım, daha yumuşak görünmesini sağlar, ancak oyunun nasıl çalıştığını kökten değiştirmez.

Burada , güncelleme hızı kare hızıyla eşleşmiyorsa, ikisi arasında bir "yendi sıklığı" alabilme riski vardır . Örneğin. Çoğu karede 4 oyun durumu güncellemesi ve biraz geriye kalanlar için yeterli zamanımız var, o zaman her seferinde bir karede 5 güncelleme yapmak için yeterli tasarruf sağladık, bu sayede harekette küçük bir sıçrama veya kekemelik yaptık. Bu ele alınabilir ...

b) Oyun durumunu güncellemeler arasında enterpolasyon yapmak (veya ekstrapolasyon yapmak)

Burada sıklıkla oyun durumunun gelecekte bir sabit zaman aşımına uğramasına izin vereceğiz ve aralarında keyfi bir nokta oluşturabileceğimiz en son 2 durumdan yeterince bilgi depolayacağız. Ardından ekranda yeni bir çerçeve göstermeye hazır olduğumuzda, sadece gösterim amacıyla uygun anı harmanlarız (yani, burada temel oyun durumunu değiştirmiyoruz)

Doğru yapıldığında bu, hareketin tereyağını pürüzsüz hissetmesini sağlar ve hatta çok düşük düşmediğimiz sürece kare hızındaki bazı dalgalanmaları maskelemeye yardımcı olur .

c) Oyun dışı durum değişikliklerine pürüzsüzlük ekleme

Enterpolasyon oyun durumu olmadan bile, yine de bazı pürüzsüzlük kazançlar elde edebilirsiniz.

Karakter animasyonu, parçacık sistemleri veya VFX ve HUD gibi kullanıcı arayüzü öğeleri gibi tamamen görsel değişiklikler, genellikle oyun durumunun sabit zaman çizelgesinden ayrı olarak güncellenir. Bu, oyun durumumuzu kare başına birden çok kez tıklattığımız takdirde, maliyetlerini her onay işaretiyle ödeyemeyiz - yalnızca son işlem geçişinde. Bunun yerine, bu efektlerin oynatma hızını karenin uzunluğuna uyacak şekilde ölçeklendiriyoruz, bu nedenle (1) de tartışıldığı gibi oyun hızını veya adaleti etkilemeden renderleme kare hızının izin verdiği kadar yumuşak oynarlar.

Kamera hareketi bunu da yapabilir - özellikle VR'de, bazen aynı kareyi bir kereden fazla göstereceğiz, ancak oyuncunun aradaki baş hareketini hesaba katması için reddettiğimizde , algılanan gecikme ve rahatlığı artırabiliriz. doğal olarak her şeyi bu kadar hızlı yapmayın. Bazı oyun akış sistemleri (oyunun bir sunucuda çalıştığı ve oyuncu yalnızca ince bir istemcinin çalıştığı) bunun bir sürümünü de kullanır.

4. Neden sadece (c) stilini her şey için kullanmıyorsun? Animasyon ve kullanıcı arayüzü için çalışıyorsa, oyun durumu güncellemelerini mevcut kare hızına uyacak şekilde basitçe ölçekleyemez miyiz?

Evet * bu mümkün, ama hayır basit değil.

Bu cevap zaten biraz uzun, bu yüzden tüm ayrıntılara girmeyeceğim, sadece kısa bir özet:

  • Doğrusal değişim deltaTimeiçin değişken uzunluktaki güncellemeleri ayarlamak için çalışmalarla çarpma (örn. Sabit hızda hareket, bir zamanlayıcının geri sayımı veya bir animasyon zaman çizelgesi boyunca ilerleme)

  • Ne yazık ki, oyunların birçok yönü doğrusal değildir . Yerçekimi kadar basit bir şey bile, değişen kare hızlarında farklı sonuçların ortaya çıkmasını önlemek için daha karmaşık entegrasyon teknikleri veya daha yüksek çözünürlüklü alt tabakalar gerektirir. Oyuncu girişi ve kontrolü kendisi büyük bir doğrusallık kaynağıdır.

  • Özellikle, ayrık çarpışma algılama ve çözünürlüğünün sonuçları, güncelleme hızına bağlı olarak çerçeveler çok uzarsa tünel açmaya ve titremeye neden olur. Bu nedenle değişken bir kare oranı bizi içeriğimizin çoğunda daha karmaşık / pahalı sürekli çarpışma algılama yöntemleri kullanmaya ya da fizikteki değişkenliği tolere etmeye zorlar. Sürekli çarpışma algılaması bile nesneler yaylarda hareket ettiğinde, daha kısa zaman aşımına uğrayan zorluklarla karşılaşır ...

Bu nedenle, genel bir orta karmaşıklık oyununa ilişkin olarak, tutarlı bir davranış ve adaleti tamamen deltaTimeölçeklendirme yoluyla korumak , tamamen zorla mümkün olmayan, çok zor ve bakım arasında bir yerdedir.

Bir güncelleme oranını standartlaştırmak , genellikle daha basit kodlarla, bir dizi koşulda daha tutarlı davranışları garanti etmemizi sağlar .

Bu güncelleme oranı tutulması render itibarıyla ayrılır bize veren esneklik deneyimi düzgünlüğü ve performansını denetlemek için oyun mantığı değiştirmeden .

O zaman bile hiçbir zaman gerçek anlamda “mükemmel” bir çerçeve bağımsızlığı elde edemiyoruz, ancak oyunlardaki pek çok yaklaşım gibi bize verilen bir oyunun ihtiyaçları için “yeterince iyi” ye çevirmek için kontrol edilebilir bir yöntem veriyor. Bu nedenle yaygın olarak faydalı bir başlangıç ​​noktası olarak öğretilir.


2
Her şeyin aynı kare hızını kullanacağı durumlarda, her şeyi senkronize etmek, denetleyicinin örneklendiği zaman ve oyun durumu tepki verdiği zaman arasındaki gecikmeyi en aza indirebilir. Bazı eski makinelerdeki birçok oyun için en kötü durum 17ms'in altında olacaktır (kontroller dikey boşluğun başlangıcında okunur, daha sonra oyun durumu değişiklikleri uygulanır ve bir sonraki kare ışın ekrana doğru ilerlerken oluşturulur) . Dekupaj işleri çoğu zaman en kötü durumda önemli bir artışla sonuçlanacaktır.
Supercat,

3
Daha karmaşık güncelleme boru hatlarının istemeden gecikmeyi başlatmayı kolaylaştırdığı doğru olsa da, doğru şekilde uygulandığında ayrıştırılmış yaklaşımın gerekli bir sonucu değildir. Aslında gecikmeyi azaltabiliriz bile . 60 fps'de çalışan bir oyun oynayalım. Bir kilitlemeyle read-update-render, en kötü durum gecikmemiz 17ms'dir (şimdilik grafik boru hattını ve ekran gecikmesini yok sayarak). (read-update)x(n>1)-renderAynı kare hızındaki ayrık bir döngü ile, en kötü durum gecikme süremiz ancak aynı veya daha iyi olabilir, çünkü girişi sık sık veya daha fazla kontrol edip davranıyoruz. :)
DMGregory

3
Gerçek zamanlı geçen eski oyunlarla ilgili ilginç bir notta, orijinal Space Invaders arcade, oyuncunun düşman gemileri tahrip ettiği, oy vermelerine ve dolayısıyla oyun güncellemelerinin hızlanmasına neden olacak şekilde, render gücünün neden olduğu bir aksaklığa sahipti. Oyunun ikonik zorluk eğrisinde.
Oskuro

1
@DMGregory: Eğer işler eşzamansız yapılırsa, o zaman oyun döngüsünün kontrolleri oylamasından hemen sonra bir kontrol değişikliğinin yapılması mümkün olacak, mevcut oyundan sonraki oyun olay döngüsü, oyun döngüsünün oyun durumunu kaptıktan hemen sonra bitecek ve Geçerli olandan sonraki oluşturma döngüsünün video çıkış sistemi geçerli kare arabelleğini kaptıktan hemen sonra bitmesi için en kötü durum, iki oyun döngü süresi artı iki oluşturma süresi artı iki çerçeve dönemi olmak üzere utangaç kalıyor. İşleri düzgün şekilde senkronize etmek, bunu yarıya indirebilir.
supercat,

1
@Oskuro: Bu bir aksaklık değildi. Güncelleme döngüsünün hızı, ekranda kaç istilacının olduğuna bakılmaksızın sabit kalır, ancak oyun, tüm istilacıları her güncelleme döngüsünde çekmez.
supercat

8

Diğer cevaplar iyidir ve oyun döngüsünün neden var olduğu ve oluşturma döngüsünden ayrı olması gerektiği hakkında konuşun. Ancak, "Neden bir değişiklik olmadığında neden bir çerçeve oluştur" özel örneğine gelince. Gerçekten de sadece donanım ve karmaşıklığa bağlı.

Ekran kartları devlet makineleri ve aynı şeyi tekrar tekrar yapmakta gerçekten başarılılar. Yalnızca değişen şeyleri yaparsanız, aslında daha pahalı, daha az değil. Çoğu senaryoda, statik olan hiçbir şey yoktur, eğer bir FPS oyunda biraz sola hareket ederseniz, ekrandaki% 98’in piksel verisini değiştirirseniz, tüm kareyi de oluşturabilirsiniz.

Ama esas olarak, karmaşıklık. Bir güncelleme yaparken değişen her şeyi takip etmek çok daha pahalıdır, çünkü ya her şeyi yeniden yapmanız ya da bazı algoritmaların eski sonuçlarını takip etmeniz, yeni sonuçla karşılaştırmanız ve yalnızca değişiklik farklıysa bu pikseli oluşturmanız gerekir. Bu sisteme bağlıdır.

Donanım vb. Tasarımlar mevcut sözleşmeler için büyük ölçüde optimize edilmiştir ve bir durum makinesi başlangıç ​​için iyi bir model olmuştur.


5
Burada yalnızca bir şey değiştiğinde (sorunun ne sorduğunu söylediğinde ) oluşturma (her şey) ile yalnızca değişen parçaları (cevabınızın tanımladığı) oluşturma arasında bir ayrım vardır .
DMGregory

Bu doğru ve birinci ve ikinci paragraflar arasında bu ayrım yapmaya çalıştım. Bir çerçevenin hiç değişmemesi nadirdir, bu yüzden bu görüşü kapsamlı cevabınızla birlikte almanın önemli olduğunu düşündüm.
Waddles

Buna ek olarak, yapmamak için hiçbir neden olmadığını unutmayın . Her karede render çağrıları için her zaman vaktiniz olduğunu biliyorsunuz (her karede render çağrılarınız için her zaman vaktiniz olduğunu daha iyi bilirsiniz!), Bu nedenle, 'gereksiz' bir render yapmak için çok az zarar var aslında pratikte asla ortaya çıkmadı.
Steven Stadnicki

@StevenStadnicki Her şeyi bir çerçeveye dönüştürmek için büyük bir zaman maliyeti olmadığı doğrudur (çünkü bir kerede bir çok devlet değiştiğinde bunu yapmak için zaman ayırmanız gerekir). Ancak dizüstü bilgisayarlar, tabletler, telefonlar veya taşınabilir oyun sistemleri gibi taşınabilir cihazlar için, oyuncunun pilini verimli kullanmak için gereksiz renderlemeden kaçınmak düşünceli olabilir . Bu esas olarak, ekranın büyük bölümlerinin oyuncu eylemleri arasında kareler için değişmeden kalabileceği ve oyunun mimarisine bağlı olarak uygulamak için her zaman pratik olmayacağı UI-heavy oyunlar için geçerlidir.
DMGregory

6

Render genellikle oyun döngüsündeki en yavaş işlemdir. İnsanlar, kare hızındaki 60'tan daha hızlı bir farkı kolayca fark edemezler; bu nedenle oluşturma işleminden daha hızlı zaman harcamak çoğu zaman daha az önemlidir. Ancak, daha hızlı bir oranda daha fazla fayda sağlayacak başka süreçler var. Fizik birdir. Bir döngüdeki değişimin çok büyük olması, nesnelerin duvarları tam olarak aşındırmasına neden olabilir. Daha büyük artışlarla basit çarpışma hatalarını aşmanın yolları olabilir, ancak birçok karmaşık fizik etkileşimi için aynı doğruluğu elde edemezsiniz. Fiziksel döngü yine de daha sık çalıştırılırsa, nesneler her seferinde oluşturulmadan daha küçük artışlarla hareket ettirilebildiğinden, daha az aksaklık olasılığı vardır. Hassas fizik motoruna daha fazla kaynak gider ve kullanıcının göremediği daha fazla çerçeve çizmeye daha az harcanır.

Bu özellikle grafik yoğun oyunlar için önemlidir. Her oyun döngüsü için bir render olsaydı ve bir oyuncu en güçlü makineye sahip olmasaydı, oyunda fps'nin 30 ya da 40'a düştüğü noktalar olabilirdi. Oyun, her bir fizik değişikliğini, aksaklıktan kaçınmak için oldukça küçük tutmaya çalışırsak, oldukça yavaş olmaya başlar. Oyuncu, karakterinin normal hızın sadece yarısı kadar yürüdüğünden rahatsız olur. Eğer görüntü oluşturma hızı döngünün geri kalanından bağımsız olsaydı, oyuncu kare hızındaki düşüşe rağmen sabit bir yürüyüş hızında kalabilecekti.


1
Veya, örneğin, keneler arasındaki süreyi ölçün ve o dönemde karakterin ne kadar ilerlemesi gerektiğini hesaplayın? Sabit sprite animasyonların günleri çoktan geçti!
Graham

2
İnsanlar zamansal takma olmadan 60 fps'den daha hızlı olanları algılayamazlar, ancak hareket bulanıklığı olmadığında yumuşak hareket elde etmek için gereken kare hızı bundan çok daha yüksek olabilir. Belli bir hızın ötesinde, bir çıkrık tekerleği bir bulanıklık olarak görünmelidir, ancak yazılım hareket bulanıklığı uygulamıyorsa ve tekerlek her kare için bir ipin yarısından daha fazla dönerse, kare hızı 1000 kare olsa bile tekerlek kötü görünebilir.
Supercat,

1
@Graham, o zaman ilk paragrafımdan itibaren sorunla karşılaşıyorsunuz, fizik gibi şeyler kene başına daha büyük bir değişiklikle yanılıyorsa. Kare hızı yeterince düşerse, daha büyük değişikliklerle telafi etmek, bir oyuncunun doğrudan duvardan geçmesine ve vuruş kutusunu tamamen kaybetmesine neden olabilir.
Tyjkenn

1
İnsan genellikle 60 fps'den daha hızlı algılayamaz, bu yüzden kaynakları daha hızlı hale getirmek için boşa harcar. Bu ifadeyle ilgili konuya giriyorum. VR HMD'ler 90Hz'de çalışıyor ve artıyor. İnan bana, kulaklıktaki 90Hz ve 60Hz arasındaki farkı kesin olarak algılayabileceğinizi söylediğimde bana inanın. Ayrıca, son zamanlarda CPU'ya bağlı ve GPU'ya bağlı olan birçok oyun gördüm. "Oluşturma genellikle en yavaş işlemdir" demek mutlaka doğru değildir.
3Dave

@DavidLively, bu yüzden "anlamsız" çok abartılı olabilirdi. Kastettiğim şuydu, darboğaz olma eğilimi vardı ve çoğu oyun 60 fps'de gayet iyi görünüyordu. Kuşkusuz, VR gibi bazı oyunlarda yalnızca daha yüksek kare hızlarıyla elde edebileceğiniz, ancak bunlar normalden ziyade istisna gibi görünen etkiler var. Daha yavaş bir makinede oyun oynuyor olsaydım, daha az dikkat çeken hızlı bir kare hızından çok çalışma fiziğine sahip olurdum.
Tyjkenn

4

Sorunuzdaki gibi bir yapı, oluşturma alt sisteminin "son oluşturma işleminden bu yana geçen zaman" kavramına sahip olup olmadığını anlayabilir .

Örneğin, oyun dünyasındaki bir nesnenin konumunun (x,y,z), mevcut hareket vektörünü ek olarak saklayan bir yaklaşımla sabit koordinatlarla temsil edildiği bir yaklaşımı düşünün (dx,dy,dz). Şimdi, oyun döngüsünü, pozisyondaki değişimin updateyöntemde gerçekleşmesi gerekecek şekilde yazabilir , ancak hareketin değişmesi sırasında gerçekleşmesi için de tasarlayabilirsiniz update. İkinci yaklaşımla, oyun durumunuz aslında updatebir sonrakine kadar değişmese de ,render- daha yüksek bir frekansta çağrılan fonksiyon, nesneyi biraz güncellenmiş bir pozisyona çekebilir. Bu teknik olarak, gördükleriniz ile dahili olarak temsil edilenler arasında bir tutarsızlığa yol açsa da, fark, pratik yönlerin çoğu için farketmeyecek kadar küçüktür, ancak animasyonların daha yumuşak görünmesine izin verir.

Oyun durumunuzun "geleceğini" tahmin etmek (yanlış olma riskine rağmen), örneğin ağ girişi gecikmelerini hesaba kattığınızda iyi bir fikir olabilir.


4

Diğer cevaplara ek olarak ...

Durum değişikliğini kontrol etmek önemli işlem gerektirir. Değişikliklerin kontrol edilmesi benzer (veya daha fazla!) İşlem süresi gerektiriyorsa, aslında işlemeyi gerçekleştirmeye kıyasla, durumu gerçekten daha iyi hale getirmediniz. Bir görüntü oluşturma durumunda, @ Waddles’in söylediği gibi, bir ekran kartı aynı aptal şeyi tekrar tekrar yapmakta gerçekten iyidir ve değişiklikler için her veri yığınını kontrol etmekten daha maliyetlidir. işleme için ekran kartına. Ayrıca görüntü oluşturma oynanışı ise, ekranın son onaylamada değiştirilmemesi olası değildir .

Ayrıca, renderlemenin önemli işlemci süresi aldığını varsayıyorsunuz. Bu, işlemcinize ve grafik kartınıza bağlıdır. Uzun yıllar boyunca, odak noktası giderek daha karmaşık işleme çalışmalarını grafik kartına boşaltma ve işlemciden ihtiyaç duyulan görüntü işleme girişini azaltma üzerine odaklandı. İdeal olarak, işlemcinin render()çağrısı basitçe bir DMA transferi kurmalı ve bu kadar. Grafik kartına veri alınması daha sonra bellek denetleyicisine verilir ve görüntünün üretilmesi grafik kartına verilir. İşlemci paralel olarak bunu kendi zamanlarında yapabilirlerfiziği, oyun motoru ve bir işlemcinin daha iyi yaptığı diğer şeyleri sürdürür. Açıkçası, gerçeklik bundan çok daha karmaşık, ancak çalışmayı sistemin diğer bölgelerine boşaltabilmek de önemli bir faktör.

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.