25年前,开发者如何将游戏塞进内存?

百万红包、火热开启!!!有你更精彩!

25年前,开发者是如何将游戏塞进那么小的内存中的?

这个问题获得了50万人的阅览,Dave Baggett对问题的回答也获得了六千多的点赞,其中不乏游戏大师。

Crash Bandicoot游戏封面

问题描述

家庭游戏系统软件采用了64K~128K的磁卡(cartridge),然而却能够提供玩好几个小时的各式各样的图形、精灵鬼怪和声音。游戏系统好像要提供大量的功能(功能性的函数、库、硬件加速和图形指令等等)似的,大量的图片、音乐和音效、动画效果、游戏算法能放入如此小的存储空间中,是多么得令人吃惊,更别提是25年前!

上面提到的存储空间大小目前看来也就等同于一个采用中等分辨率压缩(moderate-resolution compressed)的JPEG文件——一张图片而已。我十分好奇,在那个年代软件开发究竟是怎么一回事。我坚信在当时,开发者肯定没有一个所谓编写开源软件的协作开发环境,更别提在那样一个软件开发能收获巨大经济回报的时代。

我十分好奇,那个年代的开发者究竟基于哪些知识、技术、想法或者洞察力完成了这样的开发。有没有可能一些想法已经丢失或者没有被记录下来?曾经的电子游戏种类如此丰富,并且使数以百万的人花费数百小时在上面获得快乐,更别提游戏开发采用了这样高效的方式——这显然是一项壮举。这种效率让我想起了录制音乐demo。结合这些,我想提出下列的问题:如何更好理解计算机科学的原则和技术的使用方式,比如,如何将64K的demo进行编码。

这个问题的重点是那个时候的专业技能:那时的开发者为何如此成功?他们使用了哪些已经失传的技术、解决办法,或者算法技巧?

Dave Baggett的回答

下面是20世纪90年代末的一个相关轶事。当时,我和Andy Gavin共同为PS1编写游戏“古惑狼”(Crash Bandicoot)。

在当时,RAM依然是最主要的问题。PS1只有2MB的RAM,然而我们不得不做一些疯狂的事情使游戏适配硬件。我们的游戏数据大约有10MB大小,所以我们不得不进行动态的分页输入输出(paged in and out dynamically),虽然加载滞后帧速率就会下降到30Hz,但是我们并没有任何故障。

之所以能成功运行,是因为Andy写了一个令人难以置信的分页系统,可以将64K数据页进行交换,从而作为古惑狼这款游戏的数据遍历水平。这就是当时的 “全栈”能力,在这个分页系统中,运行了上至高级内存管理,下至操作码级别的直接内存访问系统(DMA)的全部代码。Andy甚至控制了CD-ROM磁盘上字节的物理布局,这样一来,即使磁盘的速率是300KB/s,PS1还是能在游戏执行到某个位置时加载到相应的数据。

我当时主要负责编写打包工具,这个工具的功能是将资源文件,比如声音、图形图像、小动物的声音控制代码(译者注:lisp control code)等打包为64K的数据分页,塞进Andy的系统当中去。(顺带一提,这个问题——将任意大小的对象打包成固定大小的数据分页,生产数据包——是一个NP完全问题,所以看起来在合理的时间或者线性复杂度下得到最优解是不可能的。)

然而有些时候算法并不合适,我的打包工具采用了各种各样的算法(如最先适配、最好适配(first-fit,best-fit)等等),只为找到最好的打包方案,包括使用随机搜索类似于Simulated annealing中用到的梯度下降的过程。基本上,我写了一大堆不同的打包策略,一一尝试,并择优选择。

像那样使用随机指导搜索(a random guided search)的问题在于,你永远不知道你能否再次得到同样的结果。有些古惑狼的关卡只能靠“碰碰运气”来进行随机打包,并放入最大允许页数(我印象中是21)。这意味着,一旦你将这个关卡打包,可能更改了一个乌龟的代码,就永远不会再找到这个21-分页的数据包了。有几次,一个美术设计修改一些内容,就会毁掉现行的分页计数,所以我们不得不半随机似的改变其他内容,直到打包器能再次找到可用的数据包。并且我还要在凌晨3点给这个倔强的艺术家解释清楚。

现在回忆起来,到目前为止最好的部分,也是当时最糟糕的部分,正是使核心C/汇编代码(C/assembly code)适配。那时距离“最终测试版”的发版期限没有几天了,而这几天是我们抓住假期发行游戏的最好机会,在此之前,我们失去了整整一年的时间。当时我们正在将语义上相同,而语法上具有不同表现(semantically identical but syntactically different manifestations)的C语言代码进行随机排列(permute),以此希望编译器能够生成200字节、125字节、50字节然后是小于8字节的代码。

作为当时排列所采用的方法“for (i=0; i < x; i++)”——如果我们采用上面用到的变量,并使用while循环来重写这段方法,以用作他用,那么会发生什么呢?这是我们尝尽各种一般方法——比如像将数据塞进指针的最低两位(这个方法只能在R3000上生效,因为所有的地址都是4字节对齐的(4-byte aligned))——之后的解决之道。

最终,古惑狼成功了的适配了PS1的内容,还多出了4字节的空闲空间。是的,2097152之外的4字节。那真是美好时光啊~

时间: 2024-09-28 07:18:38

25年前,开发者如何将游戏塞进内存?的相关文章

全世界第一个可穿戴设备,是中国大学生25年前发明的,有专利为证

最近整理资料,发现了25年前,自己大学期间(90年)的发明:数据手套 申报过专利,专利编号, 91220988,可惜太超前,当时还没有谷歌 这个专利,可能是国内,甚至全球第一款,或者第一批,可穿戴电脑设备. (专利号, 91220988,一种电子计算机数据输入装置,http://so.baiten.cn/results?q=91220988&type=63) 此专利虽然超过时限,但和现代的电脑图像.机器视觉,以及无线传感器结合,以及与微软kinect.谷歌眼镜等现代技术结合,升级扩展,可以作为新

蓝讯数卡api接口,可以接通25家话费充值卡、游戏点卡官方通道,轻松完成客户快速消耗

为互联网提供多种卡类消耗渠道.回收.解决客户手中闲置充值卡或换卡,零门槛,提供丰富的销卡体验 通过蓝讯数卡api接口,可以接通25家话费充值卡.游戏点卡官方通道,轻松完成客户快速消耗. 为客户创造更大的价值.蓝讯数卡相信务实.双赢的合作态度必将赢得客户的信赖,蓝讯数卡 也期待能与广大客户一起发展壮大! 业务特点 - 全面覆盖:支持全面值话费卡,游戏点卡消耗 - 快速消耗:平均消耗时间 3-30 秒,如遇高峰期,会有适当延时 - 接入便捷:标准接口.开发简单

ios开发-------将一个tablevirew塞进callout中

默认callout的只有一个title和detailtextlabel,所显示的信息量实在太小,虽然在地图中弹出一个小框显示一点关键信息很合理,但是有些客户需要框变大一点,信息量多一个那也是没有办法的. 效果: 我采取的方法是直接将一个tableview塞进去,但是tableView根本不能直接塞进calliout中,但可以将一个view塞进callout,我用的方法就是将tableview加到一个view上,然后在塞进callout中,上代码: self.mapView.callout.acc

【WP 8.1开发】如何把自定义字体塞进应用里

或许,系统自带的字体不足以体现应用程序的魅力,对于表现极强的汉字来说,更是如此.这时候,我们就会想,要是能把网上下载的艺术字体塞到应用包中,那岂不美哉?那么,这可以实现吗?答案是Yes的. 接下来,阿拉就给大家分别演示WP 8.1两个开发框架中如何嵌入自定义字体. 为啥是两大框架?我们知道从7x到8.0的开发框架是Silverlight for Windows Phone,为了便于兼容和直接项目升级,在8.1中,微软的开发团队依然保留了这个框架:另外一个框架是从Win RT应用移植的API集,这

Unity3D 游戏开发之内存优化

项目的性能优化主要围绕CPU.GPU和内存三大方面进行. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大量项目中,90%以上的项目都存在不同程度的内存使用问题.就目前基于Unity引擎开发的移动游戏和移动VR游戏而言,内存的开销无外乎以下三大部分:1.资源内存占用:2.引擎模块自身内存占用:3.托管堆内存占用. 如果您的项目存在内存问题,一定逃不出以上三种情况.今天,我们就这三种情况逐一进行解释. 资源内存占用 在一个较为复杂的大中型项目中,资源的内存占用往往

把大图片加载进内存

把图片加载进内存,要对图片进行缩放,否则内存溢出 代码: 1 package com.example.loadimage; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.graphics.Bitmap; 6 import android.graphics.BitmapFactory; 7 import android.graphics.BitmapFactory.Options; 8 i

把WinXP装进内存 性能飚升秒杀固态硬盘

现在用户新配置的电脑,内存很少有小于2GB的,配置4GB内存的朋友也有不少.容量如此大的内存,我们在使用电脑的日常操作中绝对用不完.而目前制约系统性能最大的瓶颈就是硬盘的传输速度,所以,这里教你怎么把XP系统装进内存,性能顿时秒杀固态硬盘. 第一步:安装及精简XP系统 先将自己早已备份的GHO格式的XP系统镜像恢复到C盘,然后对系统进行适当精简,比如将垃圾文件删除.将虚拟内存转移到D盘或其他分区.关闭系统休眠等.经过精简后的XP系统,其体积最好不要超过1GB. 第二步:安装firadisk 将下

cocos2d-x与ios内存管理分析(在游戏中减少内存压力)

Cocos2d-x与ios内存管理分析(在游戏中减少内存压力) 猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 年 原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过Cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详细的.不知道是谁写的,我记录下. 一,iOS与图片内存 在iOS上,图片会被自动缩放到2的N次方大小.比如一张1024*102

幼儿被塞进后备箱疑似被拐? 警方:父子俩开玩笑c6

"这还只是保守估计的数据,"巴迪奥维说,"等到星期五(伊斯兰教徒的聚礼日),这些乞丐在清真寺门口正式'开工'时,还有可能赚到更多的钱."巴迪奥维还说,他们在这次行动中发现,大部分的职业乞丐都是使用为期3个月的商务或旅游签证来到当地,并在这段时间内尽可能地乞讨到更多的钱. 为适应全球对中医药专业人才的需求,世界中医教育正在迅速发展,中医学已经成为一门全球性的专业.中国作为中医学发源国,在引导世界中医教育发展潮流上率先发力. 在去年11月的美国总统大选中,民主党总统候选