历史之2018

2018年已经成为历史,当我想总结一下过去一年的所得时,却发现什么都想不起来。借着过去一年的blog和github,总算可以粗略回溯一下历史。

去年的今天,我定下三个目标:

1. 阅读lua源码,并实现虚拟机
2. 阅读《计算机程序设计艺术》
3. 实现一个软件光栅器

到今天为止,lua源码只完整阅读了GC部分,计算机程序设计艺术几乎等于没看,只有软件光栅器做了个七七八八(但其实连光照都没做完)。

下面来说一说流水帐。

过完农历年后,我先挑了“软件光栅器”来做。

一方面是因为《计算机程序艺术》和阅读lua源码都需要比较大的时间片,而软件光栅器相对来讲可能更像是快程课。同时在三个目标中,我的渲染知识最弱,对于一直致力于全栈的我来讲,肯定也要先补齐短板。

从另一方面来讲,前两个更属于内功,软件光栅器更偏向招式,容易被人看出来,早点学可以防身。

在此过程中,主要的叁考书籍就是《3D游戏编程大师技巧》,这本书介绍了如何利用《3D数学基础》中的知识,将图形渲染出来。

但是这本书实在太老了,老到作者为了程序可以流畅跑起来,做了很多优化,比如这个坑其实最后的修正版,就是一个lerp而已。但是作者没有提示出这一关键,导致我最开始渲染出的图形一直有问题。甚至都搞了半个多月。

之后断断续续踩了几个坑,不带光照版的光栅器总算将就能看了。

然而,我这个人有个大毛病,一直想克服,但是至今没有成功。当我认为我会了,我就懒得进行下一步了。

刚好这时lua5.4 work1发布了。增加了分代GC支持,我一看这是个高级特性了,得跟上潮流,下载代码一看,其实lua5.4的分代GC是在5.3的增量三色GC算法上改进而来的,加上年初定的目标,就咬咬牙花了大概一周的时间,把lua5.3的GC源码大致看了一遍。

但是由于每次我看lua源码时,闭包上值的实现,总是让我有意无意的略过去了,因此其实算不上真正把lua GC看懂,应该说是基本看了个七七八八。

刚看完luaGC没两天,差不多五月份左右,我们项目中一个战斗系统刚好也算正式定下怎么做了。

这个系统有一个极特殊的地方,就是同屏人数可能上百,这就意味在数据同步量会非常大,那么如何尽可能的降低数据同步量,成了整个系统设计的重中之重。

这时我开始困难的回忆我所知道的所有知识,比如帧同步,状态同步。每一种都有自己的适应场景,但是都不太适合我们现在这种游戏模式。当然这里所说的帧同步,其实已经退化成行为同步了。

最终,我终于打破了自己的思维局限。

谁说一定只能用一种模式,以我们游戏的模式,其实是可以两者之间进行折中,每走到一片土地后,我们可以先用状态模式拉一下所有状态,然后只要视野不变,就采用行为同步方式进行同步。这样需要广播的数据量大大减少。

其实现在想一想,我以前做过的FPS游戏,中途加入游戏,其实跟我们切视野的思路差不多,这再次印证了太阳底下没有新鲜事。

解决完这个问题,我的周末终于又是我的了。

这时我自认能写软件光栅器了,就想去解决一个我心中的痛投影贴花,这个效果我在做FPS时,别人给我说过之后,我就开始研究了。然而一都没有办法去实现,即使找到文章都看不懂为何能达到这样的效果。幸运的是这次竟然真的看懂了。

解决了,又不知道要干啥了,刚好看到想到最近微服务这么火,那就研究微服务吧。即然都说docker好用,那就把我VPS上的进程全部Docker化吧。

在docker化时,发现了rssreader的一些bug。

在修改bug过程中,发现了一个奇怪的现象,在某些情况下杀死silly会进入死锁状态。其实之前也出现过几次,只是当时没有在意。这次打算认真查一下到底是什么原因。

最后发现,其实是因为lua中的__gc函数使用不当,造成了GC竞争, 这种情况只会以程序退出进行清理资源时才会出现。

具体情况是,由于GC竞争,导致在不同的GC函数中double free了同一个指针,而在进程退出时,jemalloc由于这个double free死锁了。

在做上面这些事的同时,我还有一条支线任务,就是阅读《计算机程序设计艺术》,由于这本书很多地方都会计算指令级开销,让我有种过早优化的倾向。

所以周末翻了翻软件工程神作《Unix编程艺术》,没想到这次解决了一个我当时工作中碰到了一个很棘手的问题。

这时,已经八月份了,时间已经溜走了将近三分之二了。也就是从八月份起,我需要处理很多生活中的问题。

因此后三分之一的时间,我其实并没有太多的精力去探索了。在这期间只是把以前的想法落实到代码上去。

比如我做了一个客户端差量更新工具,这个工具其实我早在三年前,就有打算做了,只是当时一来没需求,二来兴趣也不是很大。这次之所以动手做,还是因为我对他们引入的第三方框架的更新工具,很不满意。

再比如,我封装了一个lua框架forUnity,同样是因为我对现有的框架很不满意。

总结到现在,我发现一个规律,不管有没有生活上的其他事,我每年在10月分之后,基本代码和灵感都呈现断崖式下跌。

是时候定一下,2019年的目标了:

1. 断续阅读lua源码
2. 继续阅读《计算机程序设计艺术》
3. 为软件光栅器加上实时光照和阴影
4. 转向Unreal阵营,这次一定要先下手为强
5. 如果有精力的化,尽量涉及一下深度学习,以打码工具做为项目驱动

再见! 2018。



发表评论