【游戏引擎之路】登神长阶(六)——雅达利2600汇编学习,任天堂居然还真不是抄袭起家

5月20日-6月4日:攻克2D物理引擎。
6月4日-6月13日:攻克《3D数学基础》。
6月13日-6月20日:攻克《3D图形教程》。
6月21日-6月22日:攻克《Raycasting游戏教程》。
6月23日-7月1日:攻克《Windows游戏编程大师技巧》。

7月2日-7月6日:攻克《雅达利2600汇编游戏开发》

下个目标:X86汇编语言学习

这个阶段的目标是学习汇编语言,所以我正好选择一个和自已专业对路的东西来学习。就是“Atari 2600”这款经典的游戏机,国人可能对这款游戏机不怎么熟悉,但是大名鼎鼎的红白机FC就是“山寨”这款机型来的。(日本叫FC,美国那边叫NES),这两个哥们用的就是6502芯片。

我第一次看到雅达利2600介绍的时候,我都吓了一跳。上面写着雅达利2600的内存是128Bytes。我看时看到这个的时候,我都怀疑自已是不是眼花了,不是128K,是128Bytes。这是什么意思?一个汉字需要2个字节来保存,也就是说他的内存只能保存64个汉字。

而你的游戏设计,需要进行的游戏开发,就只能在这128个字节里面进行。其实我在原来学这个汇编的时候,我想在这个游戏机上做一个“吸血鬼幸运者”来着,因为我以前从来没有看见过旧的游戏机上有这种游戏。现在想想,真的太天真了。128个字节你能干嘛啊?

所以我现在想起雅达利2600那些经典的游戏,以前我只是觉得这些人有想法有创意,但是我真没想到这些人是如此的有想法,如此的有创意。他们居然在这种条件下做出这么精彩的游戏。

我之前也学过不少语言,我是学C/C++入行的,后来做网页的时候学了VB,C#,用来做ASP.NET,然后又学Java,Java是我用得时间最长的语言,用了十年。后来学Unity,又转回c#了。我掌握的语言是Java>C#>C/C++。脚本语言方面,PHP,Python我也学过,我现在的个人网站就是用PHP自已做的。还有就是LUA,因为做游戏脚本用,我也非常熟悉。Python不怎么熟悉,但是能用,LUA和PHP可以用于工作。其它什么吉里吉里,RPGMAKER脚本等等这些语言就只是用到一会,不能算“会”。

我在学编程的时候,每一种语言对我来说都像是一杯不同滋味的美酒。又或者说像是自已走到了一个不同的异域风情的土地上面。让我感觉非常新奇,有趣。我总想在这个环境中多待一会,多了解一些这种语言,

但是,我学雅达利2600的汇编,我真的有种进入了外星人领域的感觉,而且是那种遍布异形的外星球。我无时不刻都有那种想逃离的感觉,简直是太可怕了。怎么可能有这样的环境?

比如说,在普通的游戏编程时面,有Sprite的概念,你在游戏中的角色,这些,都是一个个的Sprite,包括红白机,也有64 个角色,但是雅达利2600只有两个,一个P1,一个P2,只有两个主角,我学到最后也只有办法渲染出两架飞机。当然,这毕竟是我没有深入研究,毕竟雅达利2600有那么多游戏在那儿,他们是有办法的。可是我学了一个星期,你让我做“小蜜蜂”出来,我真的找不到思路,不知道他怎么做出来的。

我在最后,也只做出了一个最简单的打飞机的游戏。敌人从上方袭击,因为敌人只有一个,所以一次只有一架飞机,而你发射子弹把他打下来,得1分。让他逃走了,不得分。

有人会说,你这玩意别说创意了,连最普通的射击游戏都比不过。哥们,不是我想这样啊。你知道雅达利2600的导弹有多少个吗?在现代的游戏编程里面,从来不会有“多少个导弹”的样的蠢问题,因为你想创建多少个就是多少个。而雅达利2600里在,导弹只有两个!一个是P1的导弹,一个是P2的导弹。当然,你可以把P2的导弹借来,这样,你就能发射2颗子弹了。

对的,没错,雅达利2600,你只能发射2颗子弹,不能再多了。因为他的碰撞检查就只支持这么多。

有人会说,那你不会自已写碰撞检查吗?很遗憾,不能。这个不能,不是说不支持这样的运算,实际上是可以的。但是,雅达利2600编程你的计算必须是在每一根扫描线之间进行。而这扫描线之间的时间周期是有限的。

我不知道给现在的游戏程序员怎么解释这个事情,我当时听到的时候也是一脸懵逼,心想:什么?怎么可能是这样?

这什么意思?其实就是好比,你的游戏就是一个酒家,你有个店小二上菜,他把菜从你的厨房端到食客面前,比如说需要12秒,然后他就会回来找你要下一个菜。也就是说,你做菜的时间只有12秒,你纵然有天大的本事,你有无数的奇思妙想,你如果在12秒种做不出来,那都没用。

而每个扫描线的时间周期就只有100多(好像更少,我记不住了,因为压根没想去记),你别以为100很多。执行最简单的CPU指令也需要2个时钟周期,如果要取内存数据,则更多。而雅达利2600的CPU是不支持乘法和除法的。怎么算乘法?用加法算,怎么算除法?用减法算。

一个加法,需要LDA,CLC,ADC两个配合起来用(是的,雅达利2600没有ADD这个加法指令,因为6502CPU是一个阉割版的CPU)。这就6-8个时钟周期走了。你就只能算那么N次加法,时间就没了。

所以说当我把这一套学完,而我回去看雅达利2600上面那些名作的时候,我的感觉完全不一样了。对这些前辈们的敬仰有如滔滔江水连绵不绝,又如黄河泛滥一发不可收拾。

这就好比你听说有一只部队有10个高达战胜了100个高达,因为你现在都开着高达,你觉得这没什么啊,虽然这件事很难办到,但也不是不可能。但是,当你了解实情后,你才发现那只部队里面没有高达,就用的步枪,把100个高达干了。

你不禁陷入沉思,这些人是怎么做到的?

雅达利2600上面奇葩的地方还不止这一点。总之,在雅达利2600上面编程,就是和时间赛跑,老师说,以前的雅达利程序员,有50%以上的时间,都在算时钟周期,因为你的“舞台”就只有这么大。

我学完了雅达利2600的汇编,感觉只有两个字:

亏贼!

但是这样的环境也造就了我对于汇编和机器更深的理解。这段旅程真的太有价值了,虽然我再也不 想在雅达利2600的世界里面待了。

想到这里,我想到了另外的一个话题,就是“任天堂抄袭起家”这个事情。其实很久以来任天堂就一直背着这锅的。FC是山寨雅达利2600的,任天堂进军游戏产业的第一个作品是《Radar Scope》,这个被认为是抄袭《太空侵略者》。在《原神》抄袭风波的时候,这个事情又被捡起来说。

其实我当时对这个事件的看法是虽然确实看上去像抄袭,但是那个时代不一样啊,就好比我们以前玩的“小霸王”,其实就是“FC”的盗版,但那时候我们能做点东西出来都不容易,谁会纠结你是盗版不盗版呢?

我看有些人为这个事件辩护,说“任天堂不是抄袭起家”,理由是任天堂在《Radar Scope》就早已经“起家”了,已经干了几十年生意了。我寻思这不是高级黑吗?这种说法不就是坐实了《Radar Scope》是抄袭作品吗?我是真不能理解为什么有任天堂的粉丝会支持这种说法,真的是醉了。尤其是这东西从任天堂的死忠粉口中说出来,这不就是向大家证明,《Radar Scope》抄袭是没得洗的,我们找另外的角度洗吧。

如今学了雅达利2600,我发现其实当时对于《Radar Scope》的控诉,还真有点像当时《原神》受到的控诉。

其实一个作品是不是抄袭,大家各自有各自的称。但是大家也有一些共同的认知的。你在一个游戏中,创新足够多,自然不会被认为是抄袭。

但是,如果你没有专门的知识,又或者说,你是用现在的眼光去看当时的创新,你的确会觉得《Radar Scope》就是抄袭的作品。但前提是“现在”。

就比如《Radar Scope》,在现在来看,大家会有一个疑问,你为什么“是太空射击”游戏。大家知道射击就射击,我们小时候在街机上也有很多打飞机的游戏啊,为什么你对标的产品是《太空侵略者》,你不能改成不是太空吗?

我做了雅达利2600之后,我才发现,还真不是。这不是说绝对不能,而是说,你的背景如果是一个黑色,那你要好做很多。这就相当于,你有12秒的上菜时间,但是,如果你的背景是全黑(即没有背景),那你就能省下4秒种干其它的,所以,你如果有背景(不是黑的),你就得花4秒种来处理背景。当然实际上编程不是这样的,你懂我意思就行。

那么,没有背景,背景就是黑的。你的游戏背景是黑的,你怎么解释?不就是用太空射击游戏来最好解释吗?因为太空就是黑的。

所以为什么当时《GALAXI》(就是我们俗称的小蜜蜂)也是太空射击游戏。大家都是。

所以说,我在学了雅达利2600之后,发现如果你用现代的眼光去要求之前的游戏,我觉得不对。如果你知道了,当时人们拥有的资源是如此之少,你就不会这么看了。

比如控诉《Radar Scope》的一个说法就是,他”只不过“做出一个近大远小的效果,因为敌人在远方时是非常小的,到近处就变大了。没错,如果你用现代的编程技术,你用Unity引擎,这是入门的程序员就能做到的事情。可是,如果你站在当时的硬件条件,你能做到吗?

而且《Radar Scope》是有自已的机板,有自已的一套叫”Radar“系统的。这本身就是一种创意。包括《Radar Scope》在美国遭遇滑铁卢之后,新的《金刚》(是叫这个来着吗?我没空去查资料了,反正是一个“碰瓷”《金刚》电影IP的作品),也是基于这个系统做的。

当时别人觉得《金刚》能够成功,是因为碰瓷IP。我觉得这只是一方面的原因,更重要的原因是因为《Radar Scope》的版机中是有自已的创意的,所以之前《Radar Scope》的机器能刷上新的《金刚》。

因为现代人的条件和以前是完全不一样的,现代游戏编程,没有什么能够扼制你的想象力。但在那时候完全不一样,《Radar Scope》能够加上一个“雷达”系统,这已经是一个很了不起的创意,而之后的作品也证明了这一点。

《Radar Scope》在当时展现的“差异化”,在现在的人眼中,这些“改变”是“微不足道”的,觉得你“只不过”改变了这些。但是,如果你真的理解了当时的条件,你就明白,这实际上已经跨出了一大步,而且这种创新也为之后的游戏成功做出了铺垫。

所以我之前觉得《Radar Scope》抄袭这事,属于历史问题,虽然那时候抄袭,但那个年代大家都干这事,没什么值得黑的。不过现在看来,它还真不是抄袭,而是被带了抄袭的节奏。

没想到米哈游和任天堂居然在这事情上还是难兄难弟。哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/780857.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于海思Hi3403V100方案开发双目1600万拼接相机测试截图

海思Hi3403V100平台SOC内置四核A55,提供高效且丰富和灵活的CPU资源,以满足客户计算和控制需求,并且集成单核MCU,已满足一些低延时要求较高场景。 多目相机PE108CB板是针对该芯片设计的一款多目凭借相机PCBA,硬件接口支…

node.js_HTTP协议

Hypertext Transfer Protocol 超文本传输协议 1.HTTP报文 请求行 请求头 请求体 它的内容形式很灵活,可以设置任意内容 2.HTTP响应报文 响应状态码 响应状态的描述 遇到陌生的状态码可以参考一下这个网址: https://developer.mozilla.org/zh-C…

期末成绩发布方式

期末考试结束后,成绩单的发放总是让老师们头疼不已。想象一下,每个学生的成绩都需要老师一个个私信给家长,不仅耗时耗力,而且极易出错。 在传统的成绩单发放方式中,老师往往需要通过电子邮件、短信或者微信等方式&…

python爬虫入门(一)之HTTP请求和响应

一、爬虫的三个步骤(要学习的内容) 1、获取网页内容 (HTTP请求、Requests库) 2、解析网页内容 (HTML网页结构、Beautiful Soup库) 3、存储或分析数据 b站学习链接: 【【Python爬虫】爆肝两…

数据合并 26-30题(30 天 Pandas 挑战)

数据合并 1. 知识点1.27 左连接1.28 数据填充与交叉连接1.29 获取列值列表 题目2.26 合作过至少三次的演员和导演2.27 使用唯一标识码替换员工ID2.28 学生们参加各科测试的次数2.29 至少有5名直接下属的经理2.30 销售员 1. 知识点 1.27 左连接 datapd.merge(employees,employ…

什么是五级流水?银行眼中的“好流水”,到底是什么样的?

无论是按揭买房还是日常贷款,银行流水都是绕不开的一环。规划好你的流水,不仅能让你在申请贷款时更有底气,还可能帮你省下不少冤枉钱。今天,咱们就来一场深度剖析,聊聊如何在按揭贷款、个人经营抵押贷款前,…

什么是SysTick?

一,滴答定时器SysTick SysTick,即滴答定时器,是内核中一个特殊的定时器,用于提供系统级的定时服务。是一个24位递减计时器,具有自动重载值寄存器的功能 。当计数器到达自动重载值时,它会自动重新加载新的计…

深入探索Python库的奇妙世界:赋能编程的无限可能

在编程的浩瀚宇宙中,Python以其简洁的语法、强大的功能和广泛的应用领域,成为了众多开发者心中的璀璨明星。而Python之所以能够如此耀眼,很大程度上得益于其背后庞大的库生态系统。这些库,如同一块块精心雕琢的积木,让…

【Linux详解】进程等待 | 非阻塞轮询

引入: 为什么?是什么?怎么办 是什么? 进程等待是指父进程暂停自己的执行,直到某个特定的子进程结束或发生某些特定的事件。 为什么? 僵尸进程刀枪不入,不可被杀死,存在内存泄露…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…

【python】OpenCV—Feature Detection and Matching

参考学习来自OpenCV基础(23)特征检测与匹配 文章目录 1 背景介绍2 Harris角点检测3 Shi-Tomasi角点检测4 Fast 角点检测5 BRIEF 特征描述子6 ORB(Oriented Fast and Rotated Brief) 特征描述子7 SIFT(Scale Invariant Feature Transform) 特征描述子8 SU…

从一个(模型设计的)想法到完成模型验证的步骤

从有一个大型语言模型(LLM)设计的想法到完成该想法的验证,可以遵循以下实践步骤: 需求分析: 明确模型的目的和应用场景。确定所需的语言类型、模型大小和性能要求。分析目标用户群体和使用环境。 文献调研&#xff1a…

【全面讲解下iPhone新机官网验机流程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

实现多数相加,但是传的参不固定

一、情景 一般实现的加法和减法等简单的相加减函数的话。一般都是写好固定传的参数。比如: function add(a,b) {return a b;} 这是固定的传入俩个,如果是三个呢,有人说当然好办! 这样写不就行了! function add(a…

protobuf及其使用

首先打开proto文件,定义一个类(数据结构),并编写成员变量 使用protobuf编译器protoc编译proto文件为.pb.h和.pb.c文件(c) 看绿色注释部分:从左至右为,编译器,.proto文件的路径,编译的…

YOLO V7网络实现细节(2)—网络整体架构总结

YOLO V7网络整体架构总结 YOLO v7网络架构的整体介绍 不同GPU和对应模型: ​​​​​​​边缘GPU:YOLOv7-tiny普通GPU:YOLOv7​​​​​​​云GPU的基本模型: YOLOv7-W6 激活函数: YOLOv7 tiny: leaky R…

微深节能 煤码头自动化翻堆及取料集控系统 格雷母线

微深节能格雷母线高精度位移测量系统是一种先进的工业自动化位置检测解决方案,它被广泛应用于煤码头自动化翻堆及取料集控系统中,以实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制。 系统原理简述: 格雷母线系统的工作原理基于电磁…

有趣的算法

目录: 1、百钱买百鸡 2、韩信点兵 1)概述 2)正常取余算法 3)循环算法 1、百钱买百鸡 我国古代《算经》中的“百钱买百鸡”问题: 鸡翁一,值钱五;鸡母一,值钱三;鸡…

机器学习第四十六周周报 FMP

文章目录 week46 FMP摘要Abstract1. 题目2. Abstract3. FMP3.1 优化框架3.2 优化器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现1. FMP2. fairGNN小结参考文献 week46 FMP 摘要 本周阅读了题为Chasing Fairness in Graphs: A GNN Architecture Per…

初识java—jdk17的一些新增特性

文章目录 前言一 : yield关键字二 :var关键字三 :密封类四 :空指针异常:五:接口中的私有方法:六:instanceof关键字 前言 这里介绍jdk17相对于jdk1.8的部分新增特性。 一 &#xff…