当前位置: 首页 > news >正文

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

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汇编游戏开发》。
7月7日-7月11日:攻克《x86/x64汇编语言》。

下个目标:《3D游戏编程大师技巧》

这次又是一次“异形”星球的征战。我昨天去骑行了60公里,这不是一般的60公里,最后20公里全是山路,回来把我累死了。 今天的精神状态不是很好,可以说“咬牙”把教程学完了。

但是,我发现我还喜欢上这种感觉了。不像是雅达利2600汇编那样陌生。

学汇编真的像那种顶尖的对局,真的一点错误也不能犯。我记的笔记比我一个学期记得还多。虽然就是几条语句,但我都密密麻麻地写上了注释。我以前读大学的时候如果能这么用功就好了。

这次教程我学了两个,一个是X86-32位的。一个是x86-64位的。两个都各有所长,也各有所短。比如第一个教程教到最后都没教怎么调用函数。而64位的基础讲得很好,但高级应用一点也没有。

这一通学习下来,我有一个最大的感悟,以前觉得汇编是比较“底层”的东西,比较“落后“的东西,毕竟现在的语言都冠上了一个“高级语言”的帽子。

这给我一种那要样的印象,如果我用的编程语言是枪和炮,那汇编语言就是冷兵器。怎么想都觉得有一种比较“落后”的印象。我学雅达利2600汇编的时候也是这个印象。

但是,当我学了x86的汇编之后,这个印象完全改观了。汇编简直是一种“次世代”的武器,他不是冷兵器,而是“高科技”,是激光剑。

他只是“难用”,而不是“弱”。相反,他强的离谱。

以前我听别人说学汇编,不止一次看到说现在的编译器很先进了,即便你学了汇编,写出的代码也不会像以前一样提升很多效率。我现在知道了,这东西就纯属放屁。从MMX到AVX,这种并行处理的能力,你是无论如何用写代码也写不出来的,什么编译器也做不到,必须得用汇编才能把这个强大的功能用出来。

而我的应用正是游戏引擎,最是需要批量处理图形的地方。

我之前学汇编其实只是看到了我的书上说有些注意性能的地方还是得用汇编。就是这么简单的一个作者的感受。我其实并没有想到汇编语言能够如此强大。

这其实也得益于我现在的“少即是多”的思想。因为我之前想着做游戏,总想着跨平台,做PC,做手机,现在我自已做引擎了,要求不能那么高了,跨平台是别想了,所以我专心把PC平台做好。所以我才有了学汇编的念头。如果我总想着跨平台,可能不会有这个念想。

以前金一南教授的一个讲座里面有一句话让我印象非常深刻:

凡做难事,必有所得。

这几乎成为了我人生的信条之一。这次又是印证了这句话的力量。

学汇编给我的收获比想象中大多了。我都有点迫不及待地去修改我之前的一些代码。比如以前我有一个Alpha混合的代码,因为DirectX的DirectDraw并不支持Alpha通道。所以我自已写了一段Alpha混合来支持半透明物体。这东西巨慢,本来800帧的,可以一瞬间拉下到200帧。而仅仅只是主角的飞行器用这个算法而已。如果用汇编,相信可以高很多。当然,这个也只是去尝试改进而已,其实主要的还是得靠硬件。如果只有Blt,我的帧数可以达到4000多。这是怎么换算法都达不到的。

不过,能够改进的地方还是得改进。比如,我的SpritePack的功能。这东西是硬件管不了的,都是靠我的算法来实现。这其中的效率提高汇编能够提供巨大的价值。

其实我本来想再学一下Python+机器学习的。这段时间也不知道怎么了,什么都想去了解。感觉AI将是我游戏开发中非常重要的一块拼图。我现在用AI制作图像,原画,用得非常顺手。这方面的知识想更深入的了解一下。

但是这段时间没有看书,一直是学教程,所以一直坐着,腰都受不了了。如果是拿着书本学,我可以看书的时候还躺一下,所以我选择学《3D游戏编程大师技巧》。这样缓解一下我的腰的压力。

过了这段时间,再看看能不能学Python。

加油!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uni-app iOS上架相关App store App store connect 云打包有次数限制
  • 【四大高校支持】第四届互联网金融与数字经济国际学术会议(ICIFDE 2024)
  • AJAX是什么?原生语法格式?jQuery提供分装好的AJAX有什么区别?
  • python-小理与他的画(赛氪OJ)
  • 智能无人机控制:STM32微控制器与机器学习集成(内附资料)
  • 【数据结构】09.树与二叉树
  • 【银河麒麟高级服务器操作系统】数据中心系统异常卡死分析处理建议
  • 算法·二分
  • 24.js获取元素尺寸、元素偏移量、获取文档尺寸
  • 高职Web全栈式开发实训室解决方案
  • 用微客云搭建一套外卖霸王餐系统赚CPS佣金
  • MySQL InnoDB存储引擎
  • 网信大数据信用报告查询怎么查?网信大数据有什么作用?
  • Excel的Index+MATCH组合使用方法
  • laravel设计模式详解
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Android组件 - 收藏集 - 掘金
  • IndexedDB
  • Linux Process Manage
  • PhantomJS 安装
  • tensorflow学习笔记3——MNIST应用篇
  • Vue UI框架库开发介绍
  • vue 配置sass、scss全局变量
  • vue的全局变量和全局拦截请求器
  • webpack+react项目初体验——记录我的webpack环境配置
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 使用 QuickBI 搭建酷炫可视化分析
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 《码出高效》学习笔记与书中错误记录
  • 从如何停掉 Promise 链说起
  • #07【面试问题整理】嵌入式软件工程师
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (二)pulsar安装在独立的docker中,python测试
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十)Flink Table API 和 SQL 基本概念
  • (十)T检验-第一部分
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)setTimeout 和 setInterval 的区别
  • (转)平衡树
  • .java 9 找不到符号_java找不到符号
  • .NET C# 使用 iText 生成PDF
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ C++ ] STL---仿函数与priority_queue
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [ABC275A] Find Takahashi 题解
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C#] 如何调用Python脚本程序
  • [C++初阶]list的模拟实现