以前有人跟我说

不要重复造轮子

那时候我还很单纯, 简单理解成了

不要把时间花在一成不变的东西上, 做学术研究.
而是多想想如何做好产品, 将知识变现.

可多年之后, 我发现事情并非我想的这么简单.

重复的轮子总有人造. 计算机界也没有什么一成不变的东西.

就拿AI这个概念, 早就无法和图灵当时喊出的口号同日而语, 从人脸识别到图像合成, 内容丰富得多.

对于重复的轮子, 如果没有买不起操作系统的托马斯, 很难想象如今的我们会活在怎样的技术垄断之下.

没准会和 <1984> 里描绘的一样.

我没读过 没有读过 <黑客, 计算机革命的英雄> 反倒是这本在计算机还没有发明的年代写成的未来科幻小说在启发我计算机可能会带来什么, 而那些计算机先驱们曾经让世界避免陷入了一个怎样可怕的时间分支.

再说 lua, 胶水语言放在今天来讲已经不是知道语法就没事了,

luajit UniLua ulua slua xlua

等各类版本的比较问题中, 更别说 lua 的各种绑定库和其他第三方库. 相信 Python 从业者的选择也是如此丰富.

用的人多了, 自然就会有人发现它的不足, 去造更新的轮子.

自由软件都这样, Linux系统也因此这么多版本.

说到 OpenGL, 已经发展到”想不想了解由不得你”的程度.

如今的图形工具/软件/手机APP, 各种五花八门的功能会自动推送到你眼前, 无论是B站录制的demo, 还是某个爆火的换性APP.

QT 底层用的 OpenGL
各种客户端引擎为了支持跨平台自然会用到 OpenGL/DirectX
美图秀秀/抖音特效用的 OpenGL
然后你很难说某些AR效果 全景图 换脸视频 没有用到 OpenGL
毕竟涉及到三维视锥变换到屏幕投影+裁剪, 肯定用的都是类似的算法.

我也异常排斥 Unity 的那些入门视频, 点开就是教你认识界面布局. 又某些官方论文, 上来就介绍 Global Illustration 这么高大上的概念.

img???

不, 这些我都不要, 也都不重要. 我想知道的是

这是什么概念?
用代码如何实现?
算法上有什么优化空间?

所以, 我用了一段时间, 把坐标系变换/光照/材质/纹理/模型加载/天空盒/阴影/深度测试/模板测试/帧缓冲 亲手打了一遍.

因为我知道, 我只有把这个重复的轮子造出来才能解答心中所有的疑惑.

我也只要把重复的轮子造出来, U3D/Unreal/QT/图片处理/视频处理 就几乎没有什么秘密可言.

它们不过都是挂在轮子上的旋转木马罢了.

我若有时间或者工作需要, 可以熟悉某个工具的使用, 看看它对图形学的API封装是否足够人性化. 若没有, 那也无所谓了.

至少我不会被那些烂大街的”九块九把你打造成Unity高级工程师”的广告唬住.

读过论文, 敲过代码的我, 再回头看看这些入门视频, 就感觉是热水器推销员, 在耐心给你阅读使用说明书一样乏味.

这也让人不觉惊出一身冷汗, 我们正处在一个处处都讲究 “封装/继承/多态” 的世界.

流于表面的工具在商业的推动下得到大肆的宣传
而那些被包装在内核中的"基类"
如果不去主动搜索和学习
恐怕一辈子都不会知道"原来它这么简单"

OpenGL 超级简单
我也超级后悔: 为什么小时候不是物理学和计算机一起学呢?

卡马克在试卷的背后给老师留言: 这些死记硬背的东西都太无聊了, 你为什么不给我个项目做呢? 你说什么我都能给你做出来.

这个试卷不是线性代数就是物理吧.

img银装素裹的世界,也同时丢失了真实感

忘了这句话吧, “重复的轮子不要造”, 取而代之的是

越是简单的东西, 越值得反复把玩.

lua 就很简单, 所以才这么多人会改造它. 面试的时候也会遇到很多

long(在不同平台上)占多少个字节
空类占多少个字节
怎么解决粘包问题
如何编程增加CPU缓冲的命中率
内存池的设计

都是很小的问题, 用一个main函数就可以搞定, 但值得去制定丰富的测试用例, 反复把玩.

特别是垃圾回收机制的话题, 似乎从人们吐槽指针之后出现的各类语言, 不论号称自己是”托管式”, 还是说”虚拟机实现跨平台”, 它的易用性的卖点最终都会落到”垃圾回收”上. 总的离不开两大分类, 引用计数 + 标记清除. 剩下的, 循环引用/内存碎片/分代回收等等, 都是在此基础上的细化罢了.

因为语言不同, 叫法还五花八门. 比如引用计数可以理解成智能指针, 标记清除(trace)有时候被翻译成追踪算法, 标记的过程是通过标记可达对象, 然后反向计算得到垃圾(不可达)对象, 其实就是’排除法’, 有的人会叫它’孤岛算法’. 甚至会有问题讨论’分代回收和增量GC’有什么区别, 感觉就没啥区别, 它俩其实是一回事.

再说CPU的缓存的多核设计, 不就是硬件层面的分布式架构, 你敢信? 皓哥 提到的 缓存更新的一致性问题 不就是游戏中跨服活动(例如跨服团购)的数据同步问题么? 逻辑服gas的数据是从中心服gcc中拉取下来的, 那么用MESI状态模型(修改/独占/共享/无效)似乎就能解决数据同步问题. 但前提是, CPU总线不是TCP链接, 它不是全双工的, 也没有网络延迟. :)

imgMESI模型

这里说的垃圾回收和分布式芯片, 也都是从简单的东西出发, 会接触的各种概念和特性. 但说真的, 不一定工作中用得到, 去记这些杂名, 或者看了源码就想背下来更是没有意义的事情. 何不化整为零, 落个轻松自在, 若是实际项目中会用到, 到了落实到代码的层面, 再讨论那些连拼写和标点符号都不能错的细节. :)

还有计算机网络和邮递员之间千丝万缕的关系. 我们花了那么多钱学的各种网络协议, 没准都是从80年前的<邮递员从业指南>演化而来的, 你敢信? :)

imgTCP粘包问题

说了这么多, 其实是因为工作需要, 要搁置 OpenGL 一段时间, 转头去研究 skynet 了.

我手上还有很多图形引擎的书没来得及读, 时间都花在了敲代码/调试上了.

尽管如此, 也没有悔意, 毕竟搞懂代码要比搞懂书/读完书重要得多.

我大概还有两三个特别想自己敲出来的原理和相关算法, 留到以后有机会再看吧

  1. 碰撞检测
  2. 动画
  3. 全景图/VR 成像

然后能确定的一个方向是 id-software 的代码应该含金量很高, 没读过至少看几篇翻译来的研究论文也好.

最后附上一句话

一切的独裁都来自于加密. -- 黑客

多在生活中发现一些”教诲”中暗藏的玄机, 更新自己的人生坐标.

怀恋上世纪八九十年代的编程氛围.

怀念那些自称为Wizard的程序员们.

怀念讲解自己的代码会闪着光芒的眼神.

为兴趣而活. 希望我的代码, 不全是为了谋生.

附: LearnOpenGL源码

imgUnity中的万向锁

imgblinnPhong光照+Gamma校正

img实例化小行星

img嗯, Unity不会死循环

img改变fov就像是使用一个可伸缩的望远镜