语言本身其实还算适合吧,没union、重载会导致矩阵库不太好看,用法也有点丑,但问题不大。
大的障碍是库和基础设施的缺乏。
1.GL/input:
SDL 和 GLFW 都有 Go 绑定,用起来和 C/C++ 没大区别,Go 用起来其实还方便一点,API 调用方式和跨平台编译都比用 C++ 整 Makefile 更简单。
Learnopengl 的例子我用 C++ 写了一半,后来用 Go 全写了,法线贴图,AO,阴影,Bloom ,AA,半透明,PBR,这些用哪种语言做没大区别,工作量在 shader。 要效率的时候需要上非主流手段,Go 比 Java Python 优势大,比如清大片内存、调 C 库汇编,Go 更好搞。
2.图像解码
有两种选择,直接用 Go 自带的标准库,或调 stb_img 这类 C 库。
后者效率更高(差距大约30%-40%),但稳定性有问题,Go 标准库容错更高。我浏览大量模型,一些贴图用 stb 解码会崩(概率大概万分之几)。
两者都不支持 HDR 和 DXT 7/ETC 都得自己撸。我撸了 HDR /DXT 5,BC7 难度高没去研究。
3.模型加载
没现成的万能库,各种教程里面推荐用 assimp 导模型我也不建议。mod 爱好者们导的模型太容易出问题,你用 assimp 这种第三方出问题很难定位,而且早晚你得自己定模型贴图和打包格式,建议自己造轮子写导入器。
Go 的 IO 库很好,只要你能弄清模型文件规格写起来很快,这个倒比代码实现更要费时间。
有同好私信让我删掉资源站信息,因为国内太多倒爷,那就删了吧。我也说下,大 mod 组发布模型都会要求使用者不将模型用于色情和牟利,无关道德,而是如果用于这两方面,惹怒游戏公司走法律制裁,倒霉的是这些最初的发布者,好几个大 mod 组也因此销户了。mod 是个灰色地带,活一天算一天,爱玩模型的自己也能找到我说的站。
4.动画
没现成的,自己撸吧。我撸了简单的骨骼动画和帧压缩,120秒动画大概4m。插帧、 Dual blending 没撸。做 ps2 级的水准应该问题不大。
https://www.zhihu.com/video/11808507454135091205.脚本
Go 有不止一个 Lua 实现,市面也有用 Go 实现 Lua 的书,造轮子的资料算多的了。
6.GUI
比较好的参考
前者思想比较好,以树为中心设计,后者本质是 imgui,nanovg 的go 移植版。
两者都能抄,但直接用不行, nanovgo 用的 glfw 是基于另一套 binding 实现,event 也不通用,原版 nanovg 为了美观用了很多贝塞尔,draw call 高,都得改。
7.碰撞&物理
还没沾,不好说。但没发现 Go 有现成能用的,binding的都没,这块得自己撸。这应该是所有轮子里难度最大的。
8.执行效率
Go 不用操心内存释放,但得避免频繁申请堆内存。很容易写出逃逸代码,效率差运行时内存还不断往上窜。
Go C call 有成本,但小规模场景和低模没问题。后端如果 VulKan 可以池化,问题可能更小,不过这是猜测得实际 profile。
显卡在低功耗状态,cpu 消耗是在动画矩阵更新,这版矩阵写得很烂各种逃逸效率很差,后面改良了但没实现动画。
9.网络
没搞过,扫过黑沙的私服的代码,感觉 Go 做这块应该不难,开发效率和内存可能还有优势,难的是具备游戏后端的工程经验和业务知识。
上面整完,runtime 的技术拼图可能差不多了,剩下工具链一大摊事。
严格说应该还有场景管理,camera,遮挡剔除,流加载,水体,大气, 天气,特效,人群,粒子,但语言上如果能搞定前面那些部分,那也就能搞定剩下这些部分,只是工作量和时间的问题。
如果做 stg ,低劣的伪 3d 格斗或银河城这种,Go 也许可以试试。实现ps2级的动画/物理+ps3,ps4中下水准画面,单干或几个人合作花3,5年也许能做到,不过要撸的依然非常多。
学习路线:
我能推荐的就是 Learnopengl 先用 C++ 上手写些例子,再往 Go 移植。
图形学我也是半吊子,入门都没脸说,知乎这块厉害的人很多,多跟专栏受益匪浅。
我没搞过游戏研发,以上算纯扯淡。