【游戏引擎之路】登神长阶(七)——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。
加油!
相关文章:
【游戏引擎之路】登神长阶(七)——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月…...
在 Windows 平台搭建 MQTT 服务
引言 MQTT 是一种轻量级、基于发布/订阅模式的消息传输协议,旨在用极小的代码空间和网络带宽为物联网设备提供简单、可靠的消息传递服务。MQTT 经过多年的发展,如今已被广泛应用于资源开采、工业制造、移动通信、智能汽车等各行各业,使得 MQ…...
jdevelope安装
准备 1.jdk1.8(已经安装不做记录) 2.下载jdevelope安装包 3.安装包安装jdevelope开发工具 4.创建或导入项目 下载jdevelope安装包 官网下载地址:https://edelivery.oracle.com 安装包安装jdevelope开发工具 cmd管理员权限运行安装脚本…...
排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)
欢迎来到繁星的CSDN,本期的内容主要包括冒泡排序(BubbleSort),直接插入排序(InsertSort),以及插入排序进阶版希尔排序(ShellSort)。 废话不多说,直接上正题! 一、冒泡排序 冒泡排序…...
synchronized关键字详解(全面分析)
目录 synchronized关键字详解1、synchronized关键字简介2、synchronized作用和使用场景作用使用场景①、用在代码块上(类级别同步)②、用在代码块上(对象级别同步)③、用在普通方法上(对象级别同步)④、用在静态方法上(类级别同步)总结: 3、synchronized底层原理&am…...
数据建设实践之大数据平台(三)
安装hadoop 上传安装文件到/opt/software目录并解压 [bigdatanode101 software]$ tar -zxvf hadoop-3.3.5.tar.gz -C /opt/services/ 配置环境变量 [bigdatanode101 ~]$ sudo vim /etc/profile.d/bigdata_env.sh export JAVA_HOME/opt/services/jdk1.8.0_161 export ZK_HO…...
TypeScript中的交叉类型
交叉类型:将多个类型合并为一个类型,使用&符号连接。 type AProps { a: string }type BProps { b: number }type allProps AProps & BPropsconst Info: allProps {a: 小月月,b: 7} 我们可以看到交叉类型是结合两个属性的属性值,那…...
CNN -1 神经网络-概述2
CNN -1 神经网络-概述2 一:神经网络(operator)1> 线性层(Fully Connected Layer)2> 卷积层(Convolutional Layer)3> 池化层(Pooling Layer)4> 循环层(Recurrent Layer)5> 归一化层(Normalization Layer)6> 激活函数(Activation Function)7>…...
利用js实现图片压缩功能
图片压缩在众多应用场景中扮演着至关重要的角色,尤其是在客户端上传图片时。原始图片往往体积庞大,直接上传不仅消耗大量带宽资源,还可能导致上传速度缓慢,严重影响用户体验。因此,在图片上传至服务器前对其进行压缩处…...
2024.7.10 刷题总结
2024.7.10 **每日一题** 2970.统计移除递增子数组的数目 Ⅰ,这道题是一个考察双指针的题目,也考察了数组的基本性质。题目的意思是要统计有多少个子数组能满足移除后剩下的元素为严格递增的关系,刚开始没考虑到移除的元素要是连续的ÿ…...
ES6 async 函数详解 (十)
async 函数是什么?一句话,它就是 Generator 函数的语法糖。 const gen function* () {const f1 yield readFile(/etc/fstab);const f2 yield readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };const asyncReadFile …...
【安全设备】入侵检测
一、什么是入侵检测 入侵检测是一种网络安全技术,用于监测和识别对计算机系统或网络的恶意使用行为或未经授权的访问。入侵检测系统(IDS)是实现这一目标的技术手段,其主要目的是确保计算机系统的安全,通过及时发现并报…...
07浅谈大语言模型可调节参数tempreture
浅谈temperature 什么是temperature? temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性: 控制确定性: temperature参数可以控制模型生成文本的确定性,大部分模型中temperatur…...
Redis数据同步
文章简单介绍基于redis-shake的redis数据同步,该工具基于每个节点同步数据,即每个主节点需同步一次,才能完成整个redis集群的数据同步。 1、redis节点操作 ### 查看redis版本 ./bin/redis-server --version### 登录redis ./bin/redis-cli -…...
快手矩阵源码,快速拥有自己的短视频矩阵
在数字化浪潮席卷全球的今天,短视频已成为内容传播的新宠,而如何高效、精准地管理多平台、多账号,实现短视频内容的快速制作与发布,是每个自媒体人都在思考的问题。快手矩阵源码,作为一款集多平台管理、多账户管理、短…...
notes for datawhale 2th summer camp NLP task1
//I wrote this note in obsidian and copied it here. The strange format in this note is due to lack of obsidian plugins. tags: AI-studyML status: done 目标:跑通baseline,体验NLP模型解决问题的流程,基本了解赛题要求,…...
攻防世界(PHP过滤器过滤)file_include
转换过滤器官方文档:https://www.php.net/manual/zh/filters.convert.php#filters.convert.iconv 这道题因为convert.base64-encode被过滤掉了,所以使用convert.iconv.*过滤器 在激活 iconv 的前提下可以使用 convert.iconv.* 压缩过滤器, 等…...
PostGIS2.4服务器编译安装
PostGIS的最新版本已经到3.5,但是还有一些国产数据库内核使用的旧版本的PostgreSQL,支持PostGIS2.4。但PostGIS2.4的版本已经在yum中找不到了,安装只能通过本地编译的方式。这里介绍一下如何在Centos7的系统上,编译部署PostGIS2.4…...
虚拟机安装Linux CENTOS 07 部署NET8 踩坑大全
首先下载centos07镜像,建议使用阿里云推荐的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.59b5f5ad5Nfr0X 其实这里就已经出现第一个坑了 centos 07 /usr/lib64/ 的 libstdc.so只支持到19; GLI…...
【C++】CMake入门
CMake 是一个跨平台的构建系统生成工具,可以生成用于编译和链接应用程序的构建文件(如 Makefile 或 Visual Studio 工程文件)。 安装 CMake Windows 可以从 CMake官网 下载并安装 Windows 版本的 CMake。安装完成后,确保将 CMak…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
