单片机技术网|技术阅读
登录|注册

您现在的位置是:单片机技术网 > 技术阅读 > 为什么128KB的魂斗罗可以塞下这么长的剧情?

为什么128KB的魂斗罗可以塞下这么长的剧情?

点击上方“嵌入式与Linux那些事”,选择“置顶/星标公众号”

福利干货,第一时间送达

时候用小霸王游戏机玩魂斗罗的时候,三条命就可以打通关,感觉自己还挺厉害的。因为魂斗罗的关数还是很多的,剧情也比较长……


那么问题来了,为什么魂斗罗只有128KB,却可以实现那么长的剧情?下面就给新生代程序员讲讲这里面的奥秘吧!



现代程序员A与1980年代游戏程序员B的对话:


A:为什么你用128KB能实现这么多画面、音乐、动画?


B:128KB还不够么?其实为了表现力已经相当奢侈了,加了很多不重要的细节。


A:就说你们的音乐,这个音乐,我压到最低码率的mp3,也得至少1MB吧。


B:你怎么压的?一首背景音乐怎么可能超过1KB。


A:那你实现全屏卷轴,用了多少显存?


B:一共就只有2KB显存,多了也放不下啊。


A:……


1、我们对“数据量”无法直观认识


除非是专家,一般人根本无法估算到底多大算大、多小算小。


一般人对“数据量”并没什么概念,一篇800字的作文有多少数据量?按照GBK编码,约1.6KB;按照UTF-8编码,则是2.4KB。


只写了1个字的作文,按理说1字节~3字节就够了。但是,只写1个字的word文档,有10956字节,而由于硬盘格式化要求,再多占用1332字节。


我就写了一个字,真的什么都没干


现实中常见的产品、流行的技术,实际上和时代背景密切相关。


当你抱着15寸笔记本还嫌小的时候,1990年代初的家庭,可是一家人围着14~18寸的球面电视看的。把雪碧拿给古代人喝一口,估计他会齁得要死,必须喝点水压压惊……



当物质基础变得十分丰富的时候,一定会产生无法避免的“浪费”。而这种“浪费”会进一步改变人感受的阈值,对度量的估计都变得紊乱了。


2、FC时代的图形技术


由于早期的记忆芯片(ROM)非常贵,而且大容量磁盘的技术也不成熟,所以暂且不论硬件计算能力,仅仅是想增加游戏的总容量也非常困难。所以,自然会使用符合当时水平的数据结构。


以红白机FC为例,它的分辨率为256x240。可以说分辨率不算低,但却只有2KB显存,而且还要实现全屏卷轴效果。所以,在FC设计之初,从硬件上就提供了充分利用显存的方法——使用Tile(瓦片)。


对每一个场景来说,使用若干数量的瓦片,场景用有限的瓦片拼接即可。这种“二级”表示方法能极大地节约存储量。


至于具体的原理讲解,大家可以看一些科普,比如:www.bilibili.com/video/BV19J411e763



3、音频容量和代码容量


现代音乐格式往往直接保存声道的波形,这种做法虽然保真度高、通用性强,但却占用空间多,一首曲子的容量以千字节、兆字节计算。


而8位芯片时代的音频解决方案,关键是一颗专用芯片,例如FC用的理光2A03:


理光2A03


音频芯片可以产生合成音效,能提供的音色可以在一定程度上配置,但非常有限。听听FC游戏的音乐,可以体会到常用的音色几乎一样。


我觉得这个音频芯片最厉害的地方,就是可以同时播放几个音轨(但不能是和弦那种“同时”),《魂斗罗》、《沙罗曼蛇》、《忍者龙剑传》的殿堂级音乐,主要是靠多个音轨的交替配合实现的。


每个音符只要记录音色、频率和音高就足够了,音频芯片自然会识别出来。把音符按时间排列好就是“乐谱”了,可以简单理解为“简谱”。



这种简谱需要的数据量十分有限,而且大部分游戏音乐都是循环播放,数据量更是小的可怜。


代码也是类似的。


FC时代的游戏,没有所谓的“引擎层”,或者说引擎层就是“硬件层”。任天堂的主机完全是为游戏而设计的,瓦片、调色板、音乐、音效等基本功能已经预先考虑到了,这样一来就节约了大量底层代码。


程序员要仔细研究文档,在硬件框架下思考问题,比如如何显示图片、如何卷动屏幕等等,而且还要非常熟悉硬件底层和汇编,不要浪费代码空间。


一来二去,代码也能写的非常小。


总的来说,128KB的游戏大作,在30年前稀松平常,放到现在简直就是“黑科技”。



科技的剧烈变革,带来技术指标非线性的变化,让我们的记忆和直觉彻底落伍。



作者:皮皮关原文地址:www.zhihu.com/question/50076174/answer/1101330430版权归原作者所有,如有侵权,请联系删除。

赠书活动

图书介绍

本书对早期Linux内核(v0.12)全部代码文件进行了详细、全面的注释和说明,旨在帮助读者用较短的时间对Linux的工作机理获得全面而深刻的理解,为进一步学习和研究Linux打下坚实的基础。虽然选择的版本较低,但该内核已能够正常编译运行,并且其中已包括了Linux工作原理的精髓。

书中首先以Linux源代码版本的变迁为主线,介绍了Linux的历史,同时着重说明了各个内核版本的主要区别和改进,给出了选择0.12版内核源代码作为研究对象的原因。

在正式描述内核源代码之前,概要介绍了运行Linux的PC的硬件组成结构、编制内核使用的汇编语言和C语言扩展部分,并且重点说明了80x86处理器在保护模式下运行的编程方法。

接着详细介绍了Linux内核源代码目录树组织结构,并依据该结构对所有内核程序和文件进行了注释和详细说明。

有关代码注释的章节安排基本上都分为具体研究对象的概述、每个文件的功能介绍、代码内注释、代码中难点及相关资料介绍等部分。

为了加深读者对内核工作原理的理解,书中后一章给出了围绕Linux 0.12系统的多个实验,其中涉及的程序均可从本书配套网站(www.oldlinux.org)上下载。木书适合Linux爱好者作为学习内核工作原理的自学参考书籍,也适合作为高校计算机专业学生学习操作系统课程的辅助和实践教材,还可供一般技术人员作为开发嵌入式系统的参考书使用。

感谢机械工业出版社对本次活动的赞助!

赠书规则

我会把本文分享到朋友圈。大家给本条朋友圈点赞,点赞排名第1,5,10位的各送出一本《Linux 内核完全剖析——基于0.12内核 》。

扫码即可加我微信,朋友圈经常有赠书/红包福利活动。


end


往期推荐




扫码加我微信

进技术交流群


                               

             文章都看完了不点个 吗