Eski oyunlarda veri yapıları


10

NES için Super Mario Brothers ve SNES için Super Mario World gibi eski oyunları programlarken kullanılan veri yapılarını merak ediyorum. Anladığım kadarıyla bu döneme ait oyunlar mecliste yazıldı. Programcılar herhangi bir veri yapısı tanımladı / kullandı mı?

Örneğin: ekranda bir grup bozuk para göründüğünde nasıl saklanırlar? Programcılar sadece diziler kullandılar mı? Ya da belki bağlantılı listeler vardı?

Şerefe!

Edit : Çeşitli yaklaşımlarla ilgileniyorum ... ille de evrensel bir yaklaşım değil.

Edit 2 : Oyunlarımdan birkaçında koleksiyonlara karşı (potansiyel olarak kötü) bir yaklaşım kullanıyorum ve eski oyunlardan herhangi birinin benzer bir yaklaşım kullanıp kullanmadığını bilmek istiyorum. Aşağıdakileri yapmayı seviyorum:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
Evrensel bir cevap yoktur; belirli bir programcının belirli bir sorunun çözümünü nasıl uyguladığı ile ilgilidir.
Ed

1
Tüm bu oyunların montajda yazıldığını düşünmese de, montaj programcılarının programdan programa kopyala / yapıştır yeniden kullanımı için küçük bileşenlerini toplamasının oldukça yaygın olduğunu söyleyeceğim. Daha sonra printf () işlevini kaç kez yazmak istersiniz? :)
James

İyi bir nokta. Dinamik olarak ayrılmış koleksiyonlar vs statik olarak ayrılmış koleksiyonlar hakkında gerçekten merak ediyorum
MrDatabase

1
Ne belirli sorun yok sen var? Eski oyunların ne yaptığını neden önemsiyorsun?
Tetrad

2
İkinci düzenlemenizde, paralellik ve SIMD işlemi için faydaları olduğu için modern oyunlarda bile yaygın olan bir "dizilerin yapısı" düzeninin bir örneği var. Sony, birkaç yıl önce geleneksel C ++ veri yapılandırma yönteminin nasıl gizli gizli maliyetlere sahip olabileceğine dair bir sunum yaptı: Research.scee.net/files/presentations/gcapaustralia09/…
Crashworks

Yanıtlar:


13

16-bit günlerde bile, oyun konsolları temelde sadece gerçek zamanlı yazılım çalıştıran küçük, gömülü bilgisayarlardır ve kullandığımız veri yapıları bilgisayar biliminde herhangi bir yerde bulacağınız gibidir: diziler, matrisler, yığınlar, ağaçlar. Çok yavaş olduğu için bağlantılı birçok liste yok (dolaylı aramaların uzun bir gecikmesi var).

Fark, STL'den önce ve çok kritik bir performansla, genellikle yapıları ve algoritmaları kendimiz yazmak zorunda kaldık!

David Braben , 2011 GDC'de eğlenceli bir konferans yaptı ve 1984'te Elite'i bir BBC Micro'ya sığdırmak için kullandığı çılgın numaralardan bahsetti . GDC Kasası'nda ücretsiz olarak izleyebilirsiniz .


Güzel. Dinamik olarak ayrılmış diziler kullandınız mı? Yoksa çoğunun statik bir boyutu var mıydı? Diyelim ki, beş jetonun ekranda görüneceği ve oyuncu onları toplayana (veya ekranın dışına kaydırılana kadar) ekranda kalacağı durumları merak ediyorum.
MrDatabase

2
@MrDatabase - Mümkün olan her yerde statik ayırmalar. Açıkladığınız gibi, genellikle statik olarak tahsis edilmiş, örneğin var olabilecek 32 olası para dizisine sahip oluruz . Paralar dünyaya geldiğinde dizide bir nokta doldururduk. Gittiklerinde boşaltıyoruz. Dinamik ayırma yapılamıyordu, kullanmaktan kaçındık çünkü sadece 2MB RAM'e sahip olduğunuzda, programınızın sabit bellekte çalışacağını garanti etmeniz gerekiyor!
Crashworks

Güzel. Benzer bir şey yapıyorum (2. soruya bakınız). Güncelleme fonksiyonumda maxNumCoins if(coinsActive)üzerinde döngü yapmadan ve güncellemeden önce "coinsActive" bitsetini kontrol ediyorum. Bu şekilde sıfır para aktif ise döngüden tamamen kaçınırım.
MrDatabase

GDC Apps Kasası bağlantısı nedeniyle +1. Peter Molyneux'un ölüm sonrası Popolous konuşması, şimdiye kadar gördüğüm en komik konuşma olmalı.
TravisG

MeDataBase - son aktif nesneyi etkin olmayan bir madeni para tarafından işgal edilen yuvaya kopyalarsınız (yani, 10 madeni paranız varsa, madeni para 5 devre dışı olur, madeni para 10'u yuva 5'e kopyalar ve sayısal madeni paraları azaltır) ve tüm bu öğeleri güncelleyin. 'İf' a ihtiyacınız olmaz. Tabii ki bu sadece aktif olmayan paraların durumu sürdürmesi gerekmiyorsa ve güncelleme sırası önemli değilse çalışır (dizi işaretçileri paralara değil gerçek paralara depolarsa durum korunabilir, ancak daha sonra dağınık önbellek davranışı elde edersiniz. muhtemelen 'if' den daha kötü)
Kaj

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.