Tüm oyunlar her kare çizilerek mi yapılıyor?


60

Bilgisayar animasyonu (oyunlar için) öğrenmeye yeni başlayan biriyim. Şimdiye kadar karşılaştığım tek yöntem, her bir kareyi, her kareyi güncellemeyi çizmektir. Böylece her karenin başlangıcında, tüm kareler silinir ve bunun için gereken kareler yeniden çizilir.

Sorum şu ki, bu yöntemin animasyon ve oyun yapmak için kullanılan tek yöntem olup olmadığı. Biraz verimsiz gibi görünüyor. Ayrıca bu yöntemin 3d oyunlar için nasıl çalışacağını tam olarak anlamadım . Birisi lütfen bunu daha ayrıntılı olarak açıklayabilir mi?


Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
Josh

John Carmack neredeyse PC'de değişen ekranın sadece ince dikey dilimini çizerek tam ekran tarafı kaydırma yapma yaklaşımını icat etti. PC'ler tam ekran görüntüsünü bu teknik olmadan yeterince hızlı bir şekilde güncelleyemediler. Bunu 90'lı yılların başlarında Komutan Keen gibi birçok 2d oyunda kullandı. Daha fazla bilgi için "Usta Doom" u okuyun.
Ash,

Yanıtlar:


68

Çok eski oyunlar, bir karenin yalnızca bu bölümlerinde değiştirilen karelerin yeniden çizildiği bir teknik kullandı. Hatırladığım kadarıyla, "Küçük Büyük Macera" oyunu da bu tekniği kullanıyor (1994). Ancak oyunun çoğu zaman statik bir kameranın olduğunu görebilirsiniz. yalnızca görünen alandan çıktığınızda sahne yeniden çizilir. Oyunu oynarsanız, o karede küçük bir gecikme olduğunu da fark edersiniz. Modern oyun motorlarına sahip modern GPU'larda işler değişti. Her karede her şey yeniden çizilir. Render tekniğine bağlı olarak, işler birkaç kez bile gösterilebilir. Bir GPU'nun işlem gücü, doğru kullandığınızda inanılmaz derecede yüksektir. Fakat yeniden kullanım oluyor. Örneğin, bir motor gölge haritasını yalnızca her 5. karede bir güncellemeye karar verebilir. Veya ışık kaynaklarında değişiklik olmadığı sürece aydınlatma güncellenmez.


23
Bu sadece eski oyunlar değil. EA'da, belirli "gündelik" oyunlar için dizüstü bilgisayar pil kullanımını azaltma yönünde bir baskı vardı ve tekniklerden biri ekranın sadece bölümlerini yeniden çizmekti. Bunu, kamerayı sabit bir şekilde bırakıp ekran boyunca bir sim yürüdüyseniz, bazen Sims 3'te görebilirsiniz; bazen yeniden çizimin yeterince büyük olmadığı ve piksellerin arkaya doğru bir çizgide geride kaldığını göreceksiniz. ekran. Tam bir yeniden çizim yapmak için kamerayı hafifçe oynatmanız gerekiyordu ve çizgi kaybolacaktı.
Kevin Fee

12
Çok yaşlı .. 1994 ... Şimdi yaşlandım ...
18'de

4
@alseether oyun açısından eski. Unutmayın ki 8 bit piksel blob'lardan foto-gerçekçiliğe (canlı eylem değilse önceden oluşturulmuş kesim sahnelerinde) sadece 20 ~ 30 yaşlarında gittik.
Jared Smith,

16

Hayır.

En azından vektör görüntülerini kullanan 70'lerden eski oyunları eklerseniz.

Örneğin, aslında bir ekrana grafik oluşturmada temelde farklı olan vektör gösterimleri için geliştirilmiş olan yaygın olarak bilinen oyun Asteroids.

Vektör monitörler 1970'lerin sonlarında Asteroids, Tempest ve Star Wars gibi 1980'lerin ortasındaki arcade oyunlarında da kullanılıyordu. Video oyun salonlarında kullanıldığında teknolojiyi tanımlamak için Quadrascan terimini kullandı.

https://en.wikipedia.org/wiki/Vector_monitor

Günümüz grafikleri, rasterleştirme için yapılan% 100'dür ve tanım gereği her karede ekrana grafik arabelleği içeriğini yazar.


7
Vektör ekranlarının belli ki bir "karesi" bile yok.
Ocaklar

2
@ hobbs Doğru, "Her oyun her kareyi çizerek tüm oyunlar mı yapılıyor?" "Hayır, tüm oyunlar bile karelere dayanarak çizilmez."
Sandy Chapman

1
ancak, daha derin bir anlamda, soru, yalnızca hareket eden öğelerin değil tüm görünür öğelerin tekrar tekrar çizilmesi ile ilgiliydi ve çoğu vektör görüntü için cevap hala "evet" (resim saklama tüpü bir istisna olurdu)
szulat

@szulat doğru bir şekilde, ama adil olmak gerekirse, hala ekranın siyah olduğu boşlukları çekmiyor. Yalnızca ekrandaki görünen öğeleri yeniler. Asteroitler'de, sadece ekranda gemiyi ve kalan asteroitleri yeniden çiziyor.
Sandy Chapman

@SandyChapman ve başka bir seviyede, gerçekten çok az fark var. Bir oyun ekran hafızasını günceller veya bir şey değiştiğinde sprite. Aksi takdirde, ekranın ilgili kısmı statik kalır. Bu, hem raster hem de vektör sistemleri için geçerlidir - “asteroitler”, zx spektrum donanımının raster video sinyalini nasıl ürettiğini benzer şekilde, cpu'yu rahatsız etmeden, ekran yenilemesini (vektör!) ekran belleğinden alır. gerçek veya hayali crt ışınının çokgen çizdiği veya ekranı sabit bir şekilde taradığı, ikincildir.
szulat

11

En düşük seviyede, makinenizdeki grafik işlemcisi her kareyi sıfırdan hesaplar ve ekranınıza gönderir. Ancak buna maruz kalacaksınız, ancak, bu düşük seviyeli işleri kendiniz yönetirseniz [1] Herhangi bir grafik (ve bununla birlikte oyun motoru) motor, bu işleri sizin için idare eder ve sahneyi ifade etmekte özgürsünüz kareler arasında değiştirebileceğiniz birçok varlık açısından, ancak kalıcı olacaktır.

... bu yöntem 3d oyunlar için nasıl çalışırdı ...

3B alandaki öğeler kalıcıdır, grafik motoru yine, meydana gelen değişiklikler için ekranınızdaki görüntüyü yeniden hesaplar (kamera hareketi vb.)

[1] ... örneğin, kendi motorunuzu [2] OpenGL gibi bir şeyle yazıyorsanız. Bu durumda bile, muhtemelen çerçeveler arasında kalıcı şeyler saklarsınız.

[2] Şu anki beceri seviyenizde bir seçenek değil .


"Makinenizdeki grafik işlemci gerçekten her kareyi sıfırdan hesaplar" 'ı destekleyen referanslarınız var mı?
Kromster

@Kromster: Bu çoğunlukla bir verimlilik meselesi. Her çerçeve olarak belki tam hesaplama gerektiren ve belirsiz tam olarak parçalar yok ki, sen bit tasarruf edilebilir tam olarak ne olduğunu belirlemek için pahalı bir hesaplama gerekir. Net bir performans artışı olsa bile , tutarsız kare hızlarına yol açacaktır.
MSalters

@ MS, kelime biçimini değiştirir, birçok komşu cevabında birçok nokta ile çelişir.
Kromster

"Makinenizdeki grafik işlemcisi gerçekten de her kareyi sıfırdan hesaplar" ifadesinin teknik olarak yanlış olduğu söylenebilir. GPU ne söylediğinizi tam olarak hesaplar. Önceki kareyi yeniden kullanmasını istiyorsanız, o zaman (gerçekten, bu varsayılandır) olacaktır. Modern oyun motorlarının çoğu (ve hatta işletim sistemi GUI'leri) sıfırdan başlamayı seçer (önceki karenin yalnızca yeni karenin zaman içinde görüntülenmesi bitmediyse gösterilir), ancak buna gerek yoktur.
Ove

"Ekranın temizlenmesi gerekiyor" için neyin referans teşkil edeceğinden bile emin değilim, ancak bir çerçevenin Doom'da nasıl oluşturulduğuna dair bir referansım var: adriancourreges.com/blog/2016/09/09/doom-2016- grafik çalışması ; Orta seviye bir grafik kartının saniyede trilyon hesaplamayı, piksel başına birkaç bin yönetmeyi başarması gerektiğini unutmayın.
pjc50

2

Kısa cevap: Hayır.

Uzun Hikaye:

Okulda bazı oyun programlamaları öğrendiğimde, aşağıdakileri yapmamız öğretildi:

Oyunda hangi fps oranını istediğimize karar ver (örneğin 30).

Her aralık için bir sayaca 1 ekleyen bir kod yazın (30 fps için 33 msn). Bu kod oyun döngüsü ile aynı anda çalışır.

Ardından, oyun için hesaplamaları yapan oyun döngüsü (oyun durumu güncellemesi) her karede aynı sayacı 1 azaltacaktır. Ancak grafik hesaplamaları ve ekrana çizim ancak sayaç sıfır olduğunda yapılır.

Sonuç, grafik kare hızının, CPU'nun oyundaki hesaplamaları ne kadar iyi idare ettiğine bağlı olarak ayarlanacağı yönündedir. Oyunda çok fazla şey olmadığında, hesaplamalar kolaydır ve grafik kare hızı gerçek oyun durumu güncellemesinden daha yüksek olacaktır (temelde aynı oyun durumunu bir defadan fazla gösterdiğimizden beri döngüleri boşa harcar).

Fakat oyunda çok şey oluyor, işlemci daha fazla işi olacak ve oyun güncellemelerinin ekrana çizilmesine öncelik verilecek.

Çoğu zaman, oyun istenen oranda güncellenmeye devam eder, ancak ekranda her güncellemeyi görmeyeceğiniz için "laggy" görünür. Bu, oyunu yavaşlatmak için tercih edilebilir çünkü her güncellemeyi ekranda çizmeye zorlarsınız.

Bunların hepsi C ++ ile yapıldı, oyun motoru ve grafik kartı yoktu. Her şey tek bir çekirdekli işlemci üzerinde koştu. 2d grafik için bazı kütüphaneler kullandık.


1
"Altın Balta" oyununu hatırlıyorum. 8086'da oynandığında oyun, daha hızlı ve daha kolaydı; Sadece FYI.
akostadinov

0

Video oyunlarının ekranı her kareye “çizip çizmeyeceğini” söyleyebilmeden önce, öncelikle “çiz” ile neyin kastedildiğini tanımlamak gerekir. Kesinlikle çok fazla video oyunu var, kesinlikle her kareyi sıfırdan bir araya getirerek her kareyi çizmiyoruz; Gerçekten de, birçok oyun platformları tam bitmap'leri monte asla hiç .

Video oyunlarının ekran oluşturması için alabileceği birkaç yaklaşım var. Çok küçük bir sayı CPU'nun elektron ışınını açıp kapatmasını veya her piksel için veya vektör tarama oyunları için çizilecek her noktanın XY koordinatını ayarlamasını sağlar. Bunu yapan oyunların çoğu, CPU'nun yeterince hızlı olduğunu göstermek amacıyla büyük ölçüde yapıyor. Daha yaygın olarak, oyunlarda, CPU katılımı olmadığında, ekrana tekrar tekrar bazı piksel ya da vektörler çıktısı alabilecek donanıma sahip olacaktır. Bu model, verileri bir hafıza bölgesinden sırayla okuyarak ve her bir bit veya bit grubunu bir piksel rengi olarak yorumlayarak üretilebilir (buna bir bit haritası görüntüsü denir). Bazı durumlarda, donanım her 8x8, 16x16 için bir bayt hafıza okuyabilir, veya ekranın diğer boyuttaki bölgelerini seçin ve ardından piksel verisi için okunacak bir bellek aralığı seçmek için bu baytı kullanın (buna genellikle bir karakter haritası görüntüsü denir). Bazı donanım platformları, yapılandırılabilir konumlara sahip birden fazla bitmap ekranı kaplayabilir. Bunlar sprite olarak adlandırılır.

Bazı platformlar ekrana gönderilirken ekran düzeninin değiştirilmesine izin vermez, bunun yerine tüm güncellemelerin, ışın bir kare çizmeyi tamamladıktan sonra bir sonraki çizime başlamadan önce yapılmasını gerektirir. Bu tür platformlarda, bir çerçevede görünecek her şeyin o çerçevenin başlangıcından önce ekran donanımına yüklenmesi gerekir ve ekran aynı anda ayarlanabilecek bir desen göstermeyle sınırlı olacaktır. İşlemci kare gösterilirken çalışmayı durdurursa aynı çerçeve süresiz olarak gösterilmeye devam ederdi. Diğer platformlar, desenin ekrana çizilirken değiştirilmesine veya yeniden yapılandırılmasına izin verir. Bu, video devresinin kendi başına halledebileceğinden çok daha karmaşık bir ekranı göstermeyi mümkün kılar.

Çoğu kişisel bilgisayar oyunu, tek bir bitmap ekranı çizmek için yapılandırılmış bir donanım kullanır ve sonra o ekrana zaten olanlardan farklı olması gereken her şeyi çizer. Bazen belirli bir durumda gerçekten gerekli olup olmadığına bakılmaksızın bazı şeyleri çizmek daha kolay olabilir, ancak kod ekranın bir bölümünün değişmesinin hiçbir nedeni olmadığını kolayca söyleyebilirse, o bölüm atlanarak performans artabilir. Günümüzün platformları genellikle bir kare boyunca ekranın tamamını birçok kez çizebilecek kadar hızlıdır, ancak tarihsel olarak durum böyle değildi. Örneğin, Apple II bilgisayarının yüksek çözünürlüklü ekranına tüm pikselleri yazmak için mümkün olan en hızlı kod iki kareden daha fazla ve Apple II bilgisayarındaki tüm pikselleri kopyalamak için mümkün olan en hızlı kod olacaktır. Başka bir arabellekten gelen yüksek çözünürlüklü ekran iki katına çıkar. İyi performans elde etmek, oyunların yalnızca gerçekten değişen şeyleri güncellemesini gerektiriyordu ve bu genellikle iyi oyunların yaptığı şeydi.


1
Bu cevabın yarısına ulaştım ve soruyu gerçekten nasıl cevapladığından emin değilim. İlk paragrafınız CPU'lardan, XY koordinatlarından, elektron ışınlarından, bellek baytlarından ve sprite'lardan bahsediyor - ama bunların hiçbiri gözle görülür biçimde her kareyi çizmekle ilgili değil. İkinci paragraf uzunluğundaki ekran kalıplarından bahsediyor ve sonra beni kaybediyor. Bunun gerçekte bir kısmını ekranın yeniden çizilmesi ile ilgili almanız, açık bir ifadeyle en üst sıraya koymanız ve ardından ne olduğunu açıklamak için konuşmanız gereken her şeyi tekrar bağlamanız gerektiğini düşünüyorum.
doppelgreener

1
@doppelgreener: Her karenin "çizim" kavramı biraz belirsizdir. Bir şey her kareyi oluşturmak için gereken her şeyi yapmak zorundadır, ancak çalışmanın CPU ve donanım tarafından bölünmesi için birçok yol vardır. Bazı yollar CPU'nun ekranın bir kare ile diğeri arasında aynı görünen kısımları olsa bile her karede yer almasını gerektirirken diğerleri değildir. Herhangi bir LCD veya CRT oyun sonuçta gerektirir olsa bir şey çıktı olmayan her boş çerçeve [E-kağıt veya flip-nokta görüntüler olmayabilir kullanarak oyun], gerekli işlemler veya kabul edilemez olabilir "çizim".
supercat

Size basit bir dille başlamanızı (sürekli "çerçeve çizme" yapıp yapmadığımızı) ve oradan geri çalışmanızı öneririm. Bunun neden detaylandırmak için derine dalmak yerine bunun doğru bir yöntem olamayacağı konusunda daha fazla teknik ayrıntı açıklayın. . Göreviniz, yaptığınız derinlikleri incelemeye başlamadan önce, temel olarak bir Yönetici Özeti ve bir Giriş'e ihtiyaç duyar.
doppelgreener

-11

Kısaca söylemek gerekirse, tüm kareler çizilmez, sadece hikayenizi veya oyun temasını veya oyun oynama temasını sunmak için gerekli olanları çizerim. Ayrıca, belirli durumlarda gerçekleşmesini istediğiniz şeylerin zamanlaması da önemli olacaktır.


9
Bu, sorulan soruya karşı bile mantıklı gelmiyor .. Sanırım başka bir şey için "kareyi" karıştırdınız ... muhtemelen bir hikaye panosunun unsurları ile karıştırılıyor musunuz? OP, özellikle oluşturma
Trotski94
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.