旧版游戏中的数据结构


10

我对编程诸如NES的Super Mario Brothers和SNES的Super Mario World之类的旧游戏进行编程时使用的数据结构感到好奇。我的理解是,这段时期的游戏是汇编形式的。程序员是否定义/使用任何数据结构?

例如:当一组硬币出现在屏幕上时,如何存储它们?程序员只是使用数组吗?也许他们有链接列表?

干杯!

编辑:我对各种方法感兴趣...不一定是通用方法。

编辑2:在我的一些游戏中,我对收藏使用了一种(可能很糟糕的)方法,并且我想知道是否有任何较旧的游戏使用了类似的方法。我喜欢执行以下操作:

// 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
没有普遍的答案。这取决于给定的程序员如何针对给定的问题实施解决方案。
Ed S.

1
虽然我不认为所有这些游戏都是用汇编编写的,但我要说,汇编程序员收集它们的小组件以便在程序之间进行复制/粘贴重用是相当普遍的。毕竟,您要编写几次printf()函数?:)
詹姆斯

好点子。我真的很好奇动态分配的集合与静态分配的集合
MrDatabase 2011年

1
有什么具体问题?您为什么要关心旧游戏的功能?
四分

2
在第二次编辑中得到的是“数组结构”布局的示例,该布局在现代游戏中仍然很常见,因为它具有并行性和SIMD操作的优势。索尼几年前做了一次演讲,介绍了传统的C ++数据结构方式如何会带来严重的隐性性能成本:research.scee.net/files/presentations/gcapaustralia09/…–
Crashworks

Answers:


13

即使在16位的日子里,游戏机基本上也只是小型的,运行实时软件的嵌入式计算机,而我们使用的数据结构与计算机科学中任何地方都可以找到的相同:数组,矩阵,堆,树。链接列表不多,因为它们太慢了(间接查找的等待时间很长)。

不同之处在于,在使用STL之前,并且由于性能至关重要,我们通常必须自己编写结构和算法!

戴维·布拉贝做了一个有趣的演讲在2011年GDC,他谈到了所有的招数疯狂的他用适合精英BBC微在1984年你可以免费观看在GDC库


凉。您是否使用了动态分配的数组?还是大多数都具有静态尺寸?我很好奇这样的情况,比如说五枚硬币会出现在屏幕上,并一直留在屏幕上,直到玩家将它们收集起来(或者它们滚动到屏幕外)为止。
MrDatabase

2
@MrDatabase-尽可能进行静态分配。对于您所描述的情况,我们通常只会静态分配一个数组,例如可能存在的32种可能的硬币。当硬币问世时,我们将在阵列中填充一个点。当他们离开时,我们将其清空。动态分配并非不可用,我们只是避免使用它,因为当您只有2MB的RAM时,您确实需要确保程序在恒定内存中运行!
Crashworks

凉。我做类似的事情(请参阅问题的编辑2)。在我的更新功能中,我if(coinsActive)在遍历maxNumCoins和更新之前检查“ coinsActive”位集。这样,如果零个硬币处于活动状态,我将完全避免循环。
MrDatabase

由于GDC保险柜链接而+1。彼得·莫利纽克斯(Peter Molyneux)进行的事后调查(Popolous)演讲一定是我见过的最搞笑的演讲。
TravisG 2011年

MeDataBase-您将最后一个活动对象复制到已变为非活动状态的硬币所占用的插槽中(即,如果您有10个硬币,则硬币5变为非活动状态,将硬币10复制到插槽5中并减少数字硬币),您可以进行迭代numCoins并更新所有这些元素。您不需要'if'。当然,这仅在不活动的硬币不需要维护状态且更新顺序不重要的情况下才有效(如果阵列存储指向硬币的指针而不是实际硬币,则可以保持状态,但是这样会得到分散的缓存行为,即可能比'if'更糟)
Kaj

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.