Video oyunları bilgileri ekran dışında nasıl saklar?


16

Sıfırdan bir video oyunu yapmaya çalışıyorum, ancak bunun için gerçekten yeniyim ve temel sorunlara girmeye devam ediyorum. En önemlisi, video oyunları ekran dışı bilgileri nasıl saklar? Demek istediğim, program ekranın yanında neyin görüntüleneceğini nasıl biliyor? Ya da, oynatıcı ortamı değiştirse bile, bu değişiklik ekrana bir sonraki yüklemesinde nasıl kalır?

Örneğin, Yeni Süper Mario Bros'da, bir? engelle ve sonra ekrandan çıkmak ve geri gel, hala vurmak kalır. Oyuncu bu bloğu bir sonraki yükleyişinde nasıl saklanır ve yürütülür? Neden sadece sıfırlanmıyor?


24
Pedantry: Super Mario Bros'da, eğer vurursanız? engelle ve sonra ekrandan çık, geri dönemezsin - oyun sadece bir yönde kayar ve tüm çözgü boruları tek yönlüdür.
Trevor Powell

61
Bir metin belgesini okuduğunuzda ve aşağı kaydırdığınızda, kelime işlemciniz belgenin başlangıcını siliyor mu?
Philipp

31
Monitör, oyun dünyasına bir pencere gösterir. Dünya pencerenizin dışında var - görmüyorsunuz.
Felsir

11
Çok daha tipik bir acemi programlama sorusu şudur: "Bilgilerimi ekranda nasıl görüntülerim?". Herhangi bir programlama dersinde çalışın ve bu soruya vardığınızda sorunuzun cevabına zaten sahip olmalısınız.
Peter

4
Bunu tutmak şeylerle çalışıyoruz tür geliştirme ortamının merak kapalı onları daha almak daha komplike ekran sesleri üzerine ekranın :) Ya da bu sadece tamamen teorik bir soru?
Luaan

Yanıtlar:


59

Genellikle oyun ortamınızın mantıksal durumunu görsel sunumdan ayırmalısınız.

Oyuncu ekranının sadece küçük bir bölümünü görebilir, ancak yine de tüm seviyenin durumunu hafızada tutar ve genellikle oyun mekaniğini tüm seviye için hesaplarsınız. Dünyanız çok büyük olduğunda, bu çok fazla koç ve / veya işlemci gerektiriyorsa, uzaktaki alanları sabit sürücüye askıya alabilirsiniz.

Oluşturma altyordamınız, seviyenin hangi bölümlerinin o anda ekranda olduğunu kontrol eder ve yalnızca bunları çizer. Ekran dışında kalanlar çizilmez, ancak bu güncellenmediği anlamına gelmez.


37

Geriye gidiyorsun.

Oyunun mantıksal durumuyla başlıyorsunuz ve bunu modelliyorsunuz. Tüm dünyanın tüm mantıksal durumu neredeyse bir kerede hafızada tutulamayacak kadar fazla olacaktır, bu yüzden bağımsız olarak yüklenebilen ve kaydedilebilen daha küçük parçalara ayrılırsınız. Bu parçalara genellikle yığınlar . Bu parçalar sürekli bir dünya oluşturabilir, ancak ayrı seviyeler / örnekler de olabilirler. Terminoloji, türe ve hangi tekniği kullanmak istediğinize bağlı olarak çılgınca değişir.

Sonra ilgilenen parçaları yüklersiniz - yani, oyuncunun çevresindeki parçalar. Çok uzaktaki parçalar disk / kalıcı depolama birimine kaydedilir ve bellekten çıkarılır.

Ve son adım olarak, gerçekte neyin görünür olduğunu belirler ve görsel temsili yaratırsınız. ve mevcut oyun durumunun ve ekranda görüntüler.

Tabii ki, tüm görsel temsili her seferinde yeniden oluşturmamaya çalışacaksınız, ancak önbelleğe alınmış ve zaten inşa edilmiş parçalarınız varsa tekrar kullanacaksınız, ancak bu ana prensip.


Bu, çıktısı olan tüm programlar için geçerlidir. Metin düzenleyicisi gibi normal bir GUI ile bir program yazarsanız, büyük olasılıkla belgeyi modellersiniz ve ardından GUI belgenin durumunu ve görünür kısımlarını belirler ve ekrana getirir. Veya form alanlarını uygun şekilde doldurun veya başka bir şekilde.

Ana özüm: Verileri ilk önce nerede ve nasıl sakladığınızı düşünün (muhtemelen nasıl temsil edeceğinizle birlikte). Hemen hemen her program veri depolama ile uğraşmak zorundadır. Herhangi bir veri saklamadığınız çok az sayıda durum vardır.


7
parçaları? Bu küçük parça seviyeleri derdim .
gbjbaanb

3
Bu, "böylece bağımsız olarak yüklenebilen ve kaydedilebilen daha küçük parçalara ayırırsınız. Bu parçalar, genellikle çok büyük dünyalara sahip oyunlara özgü gibi görünen" parçalar olarak adlandırılır "dışında iyidir. Birçok oyunun böyle bir şey yapmasına gerek yoktur. Şimdiye kadar oluşturulan her 2D sidescroller için tüm seviye verilerini hafızaya sığdırabilirseniz şaşırmazdım.
user253751

3
@gbjbaanb 'Seviye' tarihli bir terimdir ve 'yığın' çok daha kapsamlı ve açıkça ayırt edilen bir kavramdır. Tüm parçalar seviye değildir ve tüm seviyeler parça değildir.
Lilienthal

3
Bunu düşünmenin yararlı bir yolu, tüm oyunu tek bir piksel oluşturulmadan oynamanın teknik olarak mümkün olması, yani oyunun tamamı görsel sunumdan ayrı olması gerektiğini düşünüyorum.
Nathan K

1
@Lilienthal emin, ama seviye hala ortak kullanımda olduğunu düşünüyorum, ve birçok oyun hala kavram var - emin değilim yeni bir "arena" getirilirken bir "yükleme yığın" ekran pop sonra oyuncu onları geçer. Bu nedenle, özellikle oyunlarda yeni olan OP için daha önce hiç görmediği nispeten teknik bir terimden daha anlaşılır olabilir.
gbjbaanb

6

Diğerlerinin söylediği gibi, bir haritayı (örneğin bir dizide) tutar ve görünür kısmını ekrana çizersiniz ve ekrandan tekrar okumazsınız.

Ancak bazı eski sistemlerde tam anlamıyla verileri ekran dışında tutarsınız. Örneğin, 320x200 ekran için 400x300 piksel video belleği olurdu ve buna bir görüntü alanı tanımlarsınız ("X = 10 Y = 30'da başlar"). Böylece sadece bir kaydı ayarlayarak ekranı kaydırabilirsiniz. Baytları hareket ettirmek için gereken yüz bin döngüyü harcamak zorunda kalmazsınız, sadece video donanımının bunları okumaya başladığı yeri değiştirirsiniz.

NES, karo tabanlı bir sistemle birleştiğinde: http://wiki.nesdev.com/w/index.php/PPU_scrolling

NES hiçbir zaman bellekte tam görüntüyü oluşturmaz, çünkü yeterli RAM'e sahip değildir. Bunun yerine, iki ekran genişliğindeki döşemeleri tanımlayan bir RAM dizisi vardır. Her karo türü için bir bayt. Herhangi bir noktada hangi pikselin görünmesi gerektiğine karar vermek için video donanımı döşemeyi ve X / Y ofset koordinatlarını arar.


6
Doğru olsa da, bu bir uygulama detayıdır - ana prensip hala mantıklı bir duruma sahip olmanız ve bunu render etmenizdir (ve bazı kısımları önbelleğe söylediğim gibi, zaten bir sonraki bakış açısına gelecek bazı şeyler hazırlar vb.).
Polygnome

2
@Polygnome Eh, ekran oyunların çok yazdım oldu oyun durumu. 4000 bayt VRAM ile yapabileceğiniz şey inanılmaz! :)
Luaan

1

Eğer bu tür bir soru soruyorsanız, bir oyun yapabileceğiniz noktaya ulaşmak için uzun bir yolunuz olacak. Ancak, sorunuzun kalbine ulaştığınızda, program, programınızın arka ucundaki değişkenlerde birçok farklı şeyin durumunu kaydedebilir. Birkaç örneğe bakalım.

Mario Kardeşler (ya da benzeri) bulunduğunuz seviyenin durumunu kaydeder. Bu, bir blok vurulsa ya da vurulmasaydı ölmeden önce ne kadar ileri gittiğinizi içerebilir. Daha nesneye dayalı bir anlamda, oyun sadece "burada bir blok ol" diyor ve blok var. sonra bloğa vurduğunuzda, blok "Ben vuruldum" demek için kendi iç durumunu değiştirir. Bunun gibi veriler çeşitli şekillerde saklanabilir.

Kelime işlemciniz verilerini bir veri yapısına kaydeder. Şimdi bunların birçoğu ve bunların uygulanabileceği birçok yol var, ancak muhtemelen bir ağaç türü kullanıyor. Bir ağaçta en az bir düğüm var. Sola gitmeden önce eklenen her şey. Bundan sonra eklenen her şey sağa gider. Üç düğüm ekledikten sonra, orta düğümden iki tanesi asılı kalır. Ve ağaç her yere yeni parçalar eklenerek daha da büyüyebilir ve ağaç kendini yeniden oluşturur. Ağaç örneği Ya da düşmanınızın dolaştığı atıcı oyunları düşünün. Her birinin konumlarını, yaşamlarını vb. İzleyen değişkenleri vardır, böylece birini yaraladığınızda, yaralandığını hatırlar.

Bütün bunlar veri yapıları hakkında bilgi gerektirir. Ekranda gördüklerinizin çok ötesine geçiyor. Diziler, listeler, karmalar (bazen sözlükler veya haritalar olarak adlandırılır) hakkında okuma ve ardından sorununuza geri dönmeyi öneririm.

İşte bazı iyi başlangıç ​​malzemeleri:


0

Bir dereceye kadar, bu 3D'nin nasıl oluşturulduğunun bir fonksiyonudur. Örneğin, OpenGL, geometriyi XY ekran alanındaki -1.0, +1.0 aralığının dışında otomatik olarak keser (Z daha karmaşık ama benzerdir). Çıkarılan geometri asla parça oluşturmaz (yaklaşık piksel) ve bu nedenle oluşturulacak sisteme gönderilmesine rağmen hiçbir zaman gerçek görüntülere dönüştürülmez. Her durumda, oluşturma penceresinin dışındaki boşluğa yazmak imkansızdır (her şey olması gerektiği gibi çalışıyorsa).

Bazı bağlamlarda, bir optimizasyon olarak bu davranışa güvenmek yeterlidir. Bununla birlikte, video kartının neyin görünür olduğunu bilmeden önce tüm oyun verilerinizi en az bir oluşturma aşamasından (tepe noktası gölgelendiricileri) geçirmeniz gerekir. Skyrim gibi bir şeyde bu pratik değildir. Dünyadaki her tepe noktasını oluşturma hattı üzerinden göndermekle kalmaz, aynı zamanda her tepe noktasını sistem / video belleğine yüklemeniz gerekir . Mümkünse bu verimsizdir.

Bu nedenle, birçok oyun CPU tabanlı kaldırma işleminden yararlanacaktır. Tipik olarak, varlıkların kalitesi ve varlığının belirli bir bağlamda ne kadar önemli olarak değerlendirildiklerinden etkilendiği bir çeşit LOD (ayrıntı düzeyi) sistemi uygulayacaklardır. Piramidal örgü, dağdan 50 mil uzaktaysanız, bir dağ için kabul edilebilir bir yaklaşım olabilir. Hiç göremiyorsanız (diğer dağlar tarafından engellendiği gibi), yüklemenize bile gerek yoktur. Bunu yapmak için, bu soru tarafından istenen derinlikle doğrudan alakalı olduğunu düşünmediğim konular için daha karmaşık yöntemler vardır, ancak en yaygın örneklerden biri için mozaiklemeye bakın.

Bunun asıl amacı, görsellerin sadece oyunun ürünü olması. Gerçek verilerin, çoğu zaman gördüğünüz veya görmediğiniz şeylerle doğrudan ilgisi yoktur ve veriler, bir resmin ekrana yazıldığı noktaya gelmeden önce gereksiz bilgileri kaldırmak için çeşitli aşamalarla filtrelenir. Motor tasarımına bağlı olarak, görseller gerçek oyun mantığından son derece ayrılabilir, ancak aynı oyuna 2D ve 3D arayüze sahip olmak gibi bir şey mümkündür. Birçok oyun motorunun hiç çıktı olmadan çalışması bile mümkündür; bazen bu oyun AI test etmek için kullanılır.

Yine de işler karmaşıklaşabilir. Bir Mario oyunu gibi basit bir şeyde, görünür olmasalar bile, seviyedeki tüm düşmanların hareketini hesaplamak çok yasaklayıcı değildir. Modern bağlamlarda, ekran dışında olup biten gerçek ciddi bir sorudur. Birden fazla NPC şehri varsa, oyuncu tamamen farklı olduklarında nasıl davranırsınız - oyuncu farklı bir şehirde olduğu gibi? Gerçekten yüzlerce NPC'nin kararını harita boyunca hesaplamak istiyor musunuz? Cevap genellikle hayırdır, ancak bunu yapmamak için kesin yaklaşım değişebilir ve oyun üzerinde bazı etkileri olabilir.

Şu an işlerin böyle çalıştığını belirtmek önemlidir . Eski Mario oyunları, o zaman aşırı donanım sınırlamaları göz önüne alındığında, muhtemelen çok farklı şekillerde programlanmıştı (kesin yollarla konuşamam). 3D kavramı o zamanlar yoktu; Oysa bugün neredeyse tüm oyunlar, hatta tamamen 2D olanlar bile, bilmediklerini bilmeseler bile 3D render'i bir şekilde kullanıyorlar. Modern video donanımı önce 3D'dir ve 2D oluşturma (en azından donanımı doğru kullandığında) yalnızca 3. boyutu göz ardı eder.


LoD tekniklerine ek olarak, bu cevaba bir sahne grafiği eklemek iyi olur - burada bir dünya hafızada tutulabilir ve görünümde olana bağlı olarak 'CPU culled edilebilir'.
gbjbaanb

0

Sorunuzu cevaplamak için: video oyunları, ekran dünyasıyla ilgisi olmayan bazı soyut veri yapılarında oyun dünyasının durumunu korur. Bu daha sonra gerektiği gibi ekrana getirilir (yani oynatıcının bulunduğu yere bağlı olarak).

Video RAM'i doğrudan devlet amaçları için kullanan oyunlar, 8 bitlik 80'lerde, hatta 16 bitlik dönemlerde bile vardı, ancak bu platform için veya RAM'ini KB olarak oynayan bazı µC için geliştirmediğiniz sürece GB, unut gitsin.

Bununla birlikte, programlama ile ilgili her şey için çok yeni gibi görünüyorsunuz, yoksa soru ortaya çıkmazdı. Öncelikle çok kolay şeyleri programlamak için adım adım gitmenizi öneririm; belki sadece metinsel girdi / çıktı (basit istemler ve tüm bunlar) olan bir şey. Dürüst olmak gerekirse, yaptığım zaman yaklaşık 30 yıl geçti, bu yüzden sizin için gerçekten iyi bir kaynağım yok, ancak yerel kütüphaneniz programlama konusunda size gerçekten iyi bir başlangıç ​​yapmak için internetten daha iyi olabilir .

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.