为什么 128 KB 的魂斗罗可以实现那么长的剧情 ?

【Pygame小游戏】魂斗罗经典BOSS都回来了 准备好再次击败他们了吗?(附源码) 前言 🚀 作者 :“程序员梨子” 🚀 **文章简介 **:本篇文章主要是写了使用Turtle写了几款表白的小代码啦~ 🚀 **文章源码免费获取 : 为了感谢每一个关注我的小可爱💓每篇文章的项目源码都是无 偿分享滴💓👇👇 所有文章完整的素材+源码都在👇👇 粉丝白嫖源码福利,请移步至优快云社区 ...... 阅读详情

来源:www.zhihu.com/question/

50076174/answer/1101330430


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

6de7b81e48f2cfac2d59e85f82cf0dc9.png

现代程序员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字节

b3f93e5aa431f274e200e9acefa0e5da.png

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

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

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

b7d6396e7725fb08b6277270dbf79680.png

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

2、FC时代的图形技术

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

以红白机FC为例,它的分辨率为256x240。分辨率不算低,但却只有2KB显存,而且还要实现全屏卷轴效果。

所以在FC设计之初,从硬件上就提供了充分利用显存的方法——使用Tile(瓦片)。

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

具体一些原理讲解可以看一些科普,比如这个:

https://www.bilibili.com/video/BV19J411e763

19b7c172c23c54a96715bd910ffe5a05.png

3、音频容量和代码容量

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

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

365e21e3457132eb98780afe4edadc53.png
下:理光2A03

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

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

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

e7ec42c33761b428a973cc558037098b.png

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

代码也是类似的。

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

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

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

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

7acce98eb676dd2a53d24acadf572d4b.png

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

实战指南:如何用Frida绕过某梆加固的Anti-Frida检测(附完整脚本) 本文深入剖析了企业级加固方案中的Anti-Frida检测机制,并提供了实战对抗策略。通过分析基于文件系统、内存特征、行为及环境的多层次检测原理,文章详细介绍了如何定位检测逻辑、绕过maps文件扫描、对抗内存与行为特征检测,并附上了针对某梆加固的完整绕过脚本与系统化工程方案。 阅读详情

相关推荐

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖与web.xml配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5的完整流程,包括依赖改造、web.xml配置降级等关键步骤。通过实战案例和避坑指南,帮助开发者高效完成国产中间件适配,确保项目平稳运行。特别针对Tomcat依赖排除和BES适配器选择提供了专业建议。

weixin_30689307的博客 742

Python魂斗罗小游戏源代码

Python魂斗罗小游戏源代码源程序,主程序Contra.py,游戏简易使用说明:A:向左,D:向右,W:跳起,S:趴下,J:射击,P:退出程序。 程序运行截图: Contra.py ''' 公众号:Python代码大全 ''' import pygame import sys from pygame.locals import * from settings import Settings from game_player import Game_Player import game_functions

Python代码大全 1万+

STM32CubeMX+FreeRTOS实战:3步搞定LED任务配置(附代码解析)

本文详细解析了如何使用STM32CubeMX图形化工具配置FreeRTOS实时操作系统,并创建LED闪烁任务。通过剖析MX_FREERTOS_Init()函数和CMSIS-RTOS封装层,深入理解任务创建、调度及osDelay()协作机制,帮助开发者从点击生成进阶到内核原理掌握,实现高效的多任务嵌入式开发。

weixin_29192141的博客 469

【免费下载】 Python版魂斗罗源码和素材完整版

Python版魂斗罗源码和素材完整版 【下载地址】Python版魂斗罗源码和素材完整版 本仓库提供了一个完整的Python版魂斗罗游戏的源码和素材资源。通过使用`pygame`库,你可以轻松地运行和修改这个经典游戏的Python版本。无论你是想学习如何使用`pygame`开发游戏,还是想重温童年经典,这个资源都将为你提供...

gitblog_09740的博客 1869

单片机入门说明书:从本质到架构,一文看透MCU核心原理

其实你每天用的洗衣机、刷的智能门锁、开的汽车里,都藏着它的身影。相当于工厂里的“运输轨道”,CPU算出的结果通过总线送到RAM存储,ROM里的程序通过总线传给CPU执行,外设的信号通过总线交给CPU处理,整个过程每秒能重复上百万次,确保各模块协同高效。高端单片机(比如STM32F4系列)还会配备DMA(直接存储器访问)单元,相当于“专用传送带”——不需要CPU干预,就能直接让外设和RAM之间传输数据(比如让ADC采集的温度数据直接存进RAM),大大降低CPU负担,让CPU能专注处理更重要的任务。

IAMIF12的博客 1046

【AI Infra】【RLHF框架】VeRL中WorkerGroup与Ray资源调度的协同机制剖析

本文深入剖析了VeRL框架中WorkerGroup与Ray资源调度的协同机制。通过解析Ray Placement Group的资源抽象和VeRL的RayResourcePool封装,详细阐述了WorkerGroup如何与底层资源精确绑定,并实现RLHF训练中异构、多阶段任务的灵活资源分配与动态调整,为大规模分布式强化学习训练提供了高效解决方案。

weixin_29204205的博客 392

探索复古游戏的现代演绎:魂斗罗开源项目深度剖析

探索复古游戏的现代演绎:魂斗罗开源项目深度剖析 项目介绍 在这个充满创新与怀旧情怀的时代,一个令人怀念的名字——魂斗罗,以开源的形式重新进入了我们的视野。该项目由开发者ZhanChaoHan倾力打造,不仅是一次对经典游戏的致敬,更是一扇通向复古游戏现代化探索的大门。借助于强大的社区支持和全面的技术文档,这个项目已经吸引了众多开发者和游戏爱好者的关注。 项目技术分析 魂斗罗的开源实现并非简单的复刻,...

gitblog_00023的博客 713

5G协议栈逆向工程:基于开源模拟器的核心网信令分析实战

本文详细介绍了基于开源模拟器Free5GC和UERANSIM的5G协议栈逆向工程实战,涵盖核心网信令分析、环境搭建、认证协议解析及安全漏洞验证。通过NGAP/NAS信令交互解密和异常流量注入测试,帮助研究人员深入理解5G网络安全机制,并提供实用的安全加固建议。

weixin_29250573的博客 678

【强化学习】开源环境集(魂斗罗、星际争霸等都有!)

游戏环境OpenAI Gym RetroOpenAI 发布的增强的游戏强化学习研究平台,Gym Retro。其中包括对任天堂 Game boy,NES, 世嘉游戏等各种模拟器的支持。通过...

fengdu78的博客 2133

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5514

从0开始图形学(光栅化)

从0开始图形学

A112459的专栏 2397

为什么魂斗罗只有128KB却可以实现那么长的剧情?

虽然不是业内人士,但也玩了近20年,算是可以叨叨两句。个人认为其实是因为游戏的高难度造成所谓的“流程长”的假象。其实魂斗罗的剧情并不长,每个关卡有一个自己的背景,主线就是消灭外星心脏拯救地球,比起现在很多动作游戏来说,或者就拿《阿卡姆》系列来说,光是一条支线就要比这个剧情线要长了。而当时游戏的开发周期也并不比现在的游戏开发周期短,所以当时普遍的思路就是增加游戏难度以增加玩家在游戏中的游戏时间从而...

伊莱文 1924

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

图像增强(Image Enhancement):指不考虑图像降质原因,利用各种数学方法和变换手段,增强图像中人们感兴趣部分或提高有用的图像特征的清晰度。从图像质量来看,图像增强提高了图像的可懂度,改善了图像的视觉效果例如在现实场景中,针对那些对比度较差、视觉效果不好的图像,我们就可以利用图像增强改善视觉质量图像增强可分为如下几种基于灰度级变换的图像增强基于直方图修正的图像增强基于照度反射模型的图像增强基于模糊技术的图像增强基于伪彩色处理的图像增强其他图像增强方法分段线性灰度级变换。

快乐江湖的博客 3335

为什么魂斗罗只有128KB却能实现那么长的剧情有答案了

PPU 首发公号:Rand_cs 本文继续讲述 NES 的基本原理,承接上文的 CPU,本文来讲述 PPU,较为复杂,慢慢来看。例子基本都是使用的魂斗罗,看完本文相信对那问题“为什么魂斗罗只有128KB却可以实现那么长的剧情”有一定答案。废话不多说,直接来看,先是 PPU 的地址空间部分。 地址空间 PPU 有自己的总线,再来看看这张图: 可以看出通过 PPU 总线能够访问到的地址空间主要由三部分组成:PatternTable, NameTable, Pallete,其中 PatterTable 是映

weixin_46645613的博客 3877

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

为什么 128 KB 的魂斗罗可以实现那么长的剧情?

为什么魂斗罗只有 128KB 却可以实现那么长的剧情?下面来给新生代程序员讲讲这里面的奥秘吧。现代程序员A和1980年代游戏程序员B的对话:A:为什么你用128KB能实现这么多画面、音乐、...

程序IT圈 257

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

从程序员角度分析为什么 128 KB 的魂斗罗可以实现那么长的剧情?

文末有彩蛋 为什么魂斗罗只有 128KB 却可以实现那么长的剧情?下面来给新生代程序员讲讲这里面的奥秘吧。 现代程序员 A 和 1980 年代游戏程序员 B 的对话: A:为什么你用 128KB 能实现这么多画面、音乐、动画? B:128KB 还不够么?其实为了表现力已经相当奢侈了,加了很多不重要的细节。 A:就说你们的音乐,这个音乐,我压到最低码率的 MP3,也得至少 1MB 吧。 B:你怎么压的?一首背景音乐怎么可能超过 1KB。 A:那你实现全屏卷轴,用了多少显存? B:一共就只有 2KB 显存,

Yuki1127918的博客 1075

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

为什么魂斗罗只有 128KB 却可以实现那么长的剧情?

大家好,我是一行~从小我就只需要3条命就可以通关魂斗罗,而且是魂斗罗1、2、3全通关的那种。但是自己用代码写游戏之前,也会思考过为什么魂斗罗只有 128KB, 却可以实现那么长的剧情?现代...

一行玩python 1711

为什么《魂斗罗》只有128KB却可以实现那么长的剧情?

经常看到有同学在抱怨现在的游戏、APP占用非常大的空间,基本都是 10G 起步。这让我想到初中时玩过的一款游戏魂斗罗,为什么它只有 128KB 却可以实现那么长的剧情呢?现代程序员 A 和 1980 年代游戏程序员 B 的对话:A:为什么你用 128KB 能实现这么多画面、音乐、动画?B:128KB 还不够么?其实为了表现力已经相当奢侈了,加了很多不重要的细节。A:就说你们的音乐,这个音乐,我压到最低码率的 mp3,也得至少 1MB 吧。B:你怎么压的?一首背景音乐怎么可能超过 1KB。

z1ztai的博客 759

为什么《魂斗罗》只有 128KB 却可以实现那么长的剧情?

在《魂斗罗》的年代,硬件资源极其有限,开发者必须发挥极致的创造力,才能让游戏呈现出最好的效果。而现在,我们拥有了海量的存储空间和强大的计算性能,但很多软件却越来越“臃肿”,甚至写个简单的应用都要几百 MB。游戏的场景是由一个个“图块”拼出来的,不同关卡的布局可以复用相同的图块,只需要稍微调整排列方式,就能呈现出完全不同的关卡。而且,红白机的图像是用 8x8 的小格子拼接出来的,叫“图块”。红白机的硬件虽然性能有限,但开发者非常熟悉它的架构,会利用硬件的特性优化游戏表现,比如图形的缓存机制、音频的波形合成。

m0_61562916的博客 1046

为什么128KB的魂斗罗可以实现那么长的剧情?

为什么魂斗罗只有 128KB 却可以实现那么长的剧情?下面来给新生代程序员讲讲这里面的奥秘吧。 现代程序员 A 和 1980 年代游戏程序员 B 的对话: A:为什么你用 128KB 能实现这么多画面、音乐、动画? B:128KB 还不够么?其实为了表现力已经相当奢侈了,加了很多不重要的细节。 A:就说你们的音乐,这个音乐,我压到最低码率的 MP3,也得至少 1MB 吧。 B:你怎么...

程序员生活志的博客 561

为什么魂斗罗只有 128 KB 却可以实现那么长的剧情?

点击上方Java后端,选择设为星标优质文章,及时送达来自 | 知乎链接 |https://www.zhihu.com/question/50076174编辑 | 深度学习这件小事公...

公众号:Java后端 612
上一篇: 年后跳槽必看!50家互联网公司年终奖情况!(1.30 日最新版)
下一篇: ChatGPT 之父传奇:8岁学编程,16岁出柜,37岁颠覆科技圈,网友:“天选 CEO!”...
公众号:【GitHub爱好者社区】
博客等级 码龄6年 357粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值