首页 存档 技术 查看内容

Git被自己写的代码美哭是一种什么样的体验?

2018-3-30 13:00 |来自: 互联网 308 0

摘要: 文 / 安柏霖(知乎) 工作第二年时候的一个经验,第一次实实在在感觉到简洁代码的威力,整洁代码实乃保命保平安神器。 当时开发的是这个游戏: 实际游戏画面: 这个巅峰时期团队过百,一共前后做了 4,5 年,代码量 ...

文 / 安柏霖(知乎)

工作第二年时候的一个经验,第一次实实在在感觉到简洁代码的威力,整洁代码实乃保命保平安神器。


当时开发的是这个游戏:


实际游戏画面:


这个巅峰时期团队过百,一共前后做了 4,5 年,代码量那是大大的,我这里参与的是 ps3 版,使用的是 unreal3 引擎。


xbox360/ps3 这一代,unreal 在微软平台上做的很是不错,在ps3上面各种原因吧,做的很不到位,对应出的 unreal tournament 3 在 ps3 上面各种缩水。


一定程度上也和 ps3 的机能不足以及奇怪的架构有关。


ps3 的在 cpu 端基本架构是这样:


其中可以重点关注大家不太常见的叫做 SPE 的这个东西,这个可以说是 ps3 的一大特色,就是一个很强的协处理器,非常善于做 vector 类的“傻算”,单个能力超过现在的普通I7的单核 cpu 的计算能力,而且这样的东东有 8 个。。。


甚至sony开始希望这个 spe 搞定一切,连 GPU 都省了,但是后来发现不行,急急忙忙上的 nvidia 的缩水 GTX7800 级别的 GPU。


但是 SPE 毕竟设计时候牛逼,后面大家拿这个东西来做计算蛋白质序列啊,在 ps3 的中后期,大家开始研究怎么用 SPU 做一些渲染的工作,一度能承担40%的 GPU 的工作,其战斗力可见一斑。


当时sony底层系统方面的能力比微软差不少,所以底层一大特色就是“裸”,你有两个选择,一个是opengl的api,这样使用默认的驱动,但是效率就是一个普通效率。


还有一个版本的就是叫 gcm 的一个 api,就比较的底层,你自己来管理一切,从显存的管理到 command buffer 的 flush 都是自己来做。


近乎等于开发者自己来实现一个类似 driver 的东西了,为了效率这个是大家普遍的选择。


然后 sony 文档上有介绍说,SPE 可以支持去执行这些 gcm 的命令的构建,也就是说可以把整个驱动实现出来,然后放到 SPE 上去跑,这样就进一步解放核心 CPU 的工作,达到更好的性能。


当时花了一些时间把 ps3 版的底层写好了,driver 也都跑顺了,然后就开始做把 driver 往 SPE 上移植的工作。


这个过程就是一个把 unreal 底层进行拆解分离,把 driver 部分独立出来,然后实现到 SPE 上面,由 SPE 把命令构建好,送往 GPU; 为了进一步优化性能,自己实现的这个部分还可以提供更高层的一些 api,把一些游戏常用的 api 直接打包成一个包,定制出一个比 opengl 更简单样子,但是效率非常的高。


刚刚写了第一版,直接就一团乱,跟了代码一瞅。。。代码段被冲了,这个之前都没见到过,正常系统上对代码段会有保护,冲过去会有 warning 什么的,SPE 上面就是完全裸的,没有任何保护。


然后说回 SPE,上面一个很小的 local storage,需要把命令送过去,然后管理本地的内存,进而执行代码等等,然后代码的执行是通过 gpu 来看的,所以如果出错了,你只能知道错了,不知道哪里错了。


而且 ps3 的早期,各种 debug 工具也不完整,debug 能力就各种抓瞎。


当时工作也不久,经验也不足,就这样,扛着一个这种大游戏的底层,没日没夜的在 SPE 里面一直泡着,一个坑出来再进到另外一个坑。


中间一个问题憋了一个多星期,没有一点进展,甚至开始怀疑是不是这个 SPE 做 driver 是不可能的,毕竟只是文档上提一嘴。


在 sony 论坛上求教,还真有一个哥们,欧洲一个公司的,做网球游戏的,给我发来邮件说他也这么干的,能行;这真给我相当大的希望,继续又怼了 1 个星期,代码都快全背下来了,终于能够继续前进,刚刚长舒一口气


leader 把我叫到办公室里问我还有多长时间能弄完,有点担心这个能不能行,在考虑要不要把任务 cancel。。。当时的表情是这样的:


和 leader 晓之以理动之以情,软磨硬泡,最后 leader 再给 2 星期时间,必须能够跑得比较稳定,否则还是要卡擦掉。


然后继续猛怼,后面进展还算可以,但是由于项目已经比较靠后了,比较担心上了之后会出各种难查的问题(这个的情况比多线程要更棘手了)。


中间开发的过程已经明显感觉到,对于这种难以 debug 的情况,把设计做清晰,把代码写整洁有多么重要。


所以到最后就是不停的去重构代码,一直到代码已经整洁到自己想吐了,就是那种中考前复习的实在烦了,去 tmd 的考就考吧的感觉。


开始合入了主干,提测 QA,然后买好红牛,等着 bug 彻夜奋战。


然后过了一天。。。没事,QA 只是反映,帧数是更好了一些。


2 天。。。没事


最后一周下来,就是零星 2 个小问题。


这对于这种规模应该说是比较少见了,最后实际 profile 下来,能节省 6-8ms(面向 30 帧的游戏,一共 33ms,所以对于性能来说是非常关键的一波)。


这波下来,有这样的感觉

●整洁代码绝非装逼用的,简直就是保命保平安神器


●变得特别喜欢欣赏整洁代码的美妙之处,后来看 insomniac 的 spu 实现的计算水的fft(刚刚查了下已经没有了),真是如同欣赏水墨风景的怡然的感觉


总的说来,谈不上美哭了,但是也有美的一面,整个过程连滚再爬也快哭了。。。


本文系作者授权计蒜客发布,如需转载请与作者联系。

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除


路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部