重新启程

今天,是我在广州阿里中心办公的最后一天。虽然 Last day 设定在了 5 月 20 日,但后面全部是假期,应该不会再回来这里。这些年的年假我都没有用过,总是到年底自动作废,今年算是休全(一小半)了。 回顾我的职业生涯,2001 年之前在北京经历了创业,而后又短暂的工作了数月。之后便在网易工作了十年 ,直到 2011 年离开 。2011 年底,我们创办了简悦,原本以为会把这家公司一直开下去,但在各种机缘下,于 2017 年底被阿里巴巴收购。之后,我便退出公司的管理,专心开

大批量动画模型的优化

最近和公司一个开发团队探讨了一下他们正在开发的游戏中遇到的性能问题,看看应该如何优化。这个游戏的战斗场景想模仿亿万僵尸(They are billions)的场景。在亿万僵尸中,场景中描绘了上万的僵尸潮,但我们这个游戏,超过 500 个僵尸就遇到了性能问题。固然,手机的硬件性能比不上 PC ,但 500 这个数量级还是略低于预期。 对于游戏中大量类似的动画物体,肯定有方法可以优化。我们来看看渲染这些动画可行的优化方向: 常见的方式是把僵尸先预渲染成图片,而动画自然就是多个

死亡

早上上班的路上,在必经的一条马路,看到一个蓝衣人趴在路中间隔离带的水泥桩上。车流比较大,一晃就开过去了。我问坐在副驾驶的老婆:刚才那个人好奇怪啊。她说是啊,那个人怎么了?我说,昨天你没看到吗?他保持那个姿势已经一整天了,感觉连手指头都没动过。 说到这里,我赶紧把车靠边停下来打了 110 ,附近的派出所联系了我,说马上派人过去看看。我的心情久久不能平静。走在路上,我喜欢观察四周的细节,其实昨天就感觉不对了。路上没有血迹,我以为他/她(看不到脸)是在翻越隔离带时身体不舒服想休息

Ant Engine 的一些优化

最近一段时间都在公司内寻找项目可以合作推进 Ant Engine 的使用。我觉得自研引擎的一个重要优势在于我们可以针对具体游戏更好的做性能优化。在目标设备硬件性能允许的范畴内,把画面质量和交互体验做到更好。而同样的优化手段,在通用商业引擎上面做会困难的多,甚至无法顺利完成。 我们用 Ant Engine 制作的第一款游戏 Red Frontier 在一年前是性能完全不达标的。它在 iPhone 8 上甚至都达不到 30fps ,无法流畅游戏。很多性能问题是已知问题,比如我们

重构 ltask 的任务调度器

ltask 是 Ant engine 的基础设施之一,在对 Ant engine profile 的过程中,我们发现了 ltask 的一些值得提升的地方。 我们希望尽可能的提升游戏帧率,缩短渲染每一帧的的时间。因为 Ant engine 是由很多并行任务构成的,任务调度器的策略会直接影响单帧需要的时间。 ltask 虽然和 skynet 想解决的问题是一样的:管理 m 个线程(任务/服务),让它们运行在 n 个 cpu 核心上。而它们的应用场景不同,ltask 目前用在游

以非阻塞方式执行一个函数

在 skynet 中,服务之间并行运行,而每个服务自身的业务都是串行的。一个服务由开发者自行切分成多个时间片,每个时间片串行运行在不同的工作线程上。最常见的做法是在每个服务中运行一个 Lua 虚拟机,用 coroutine 切分时间片,这样从编写代码的角度看,任务是连续的。 这个设计的目的是,让开发者轻松享受到多核带来的并发性能优势,同时减轻编写多线程程序带来的心智负担。 用过 skynet 的应该都碰到过:当我们在服务中不小心调用了一个长时间运行而不返回的 C 函数,会

关于虚拟文件系统的一些新想法

虚拟文件系统 (vfs) 是 Ant 引擎的核心模块。在 wiki 上有介绍 ,blog 上也有总结。 最近在按前段时间拟定的思路重构编辑器。在这个过程中对 vfs 有了一些新想法。短期内不打算把工作重心放到重构 vfs 上面,先记录一下。 最早设计 vfs 的时候,是从网络文件系统的角度看待它的。我把它设想为一个类似 git 的组织方式,带版本控制的网络文件系统。所以,很多设计思路都是延续这个而来。但是,经过了这些年的数次重构,我对最初的思路产生了一些怀疑。 其中,最

为 log 实现的无锁 Ringbuffer

这两天在改 log 模块。我们需要一个并发写 log 的模块,它有多个 log 生产者一个消费者,这个唯一的消费者在 log 线程中把 log 数据持久化。 大多数 log 生产者是在第三方库的 callback 函数中调用的,比如 bgfx ,如果写 log 不够快的话,就会阻塞渲染。这个 callback 需要自己保证线程安全。因为 bgfx 支持多线程渲染,所以写 log 的 callback 可能在不同的线程触发。 过去在实现 bgfx 的 luabinding

一个格式化文本信息版面的小玩意

bgfx 提供了一组调试文本输出的 api ,可以把一些文本信息显示在屏幕上。这些 API 非常简陋,只是提供了一个文本模式缓冲区。离控制台还很远。 具体见 文档中 的 dbgText* 系列函数。 随着我们的游戏引擎中越来越多的信息需要展示,直接使用这些 api 就越发简陋了。最近萌发的想法是干脆使用 imgui 来绘制调试信息界面。但我又觉得保留 bgfx 自带的这个文本模式也有一些好处。 这个周末,孩子被爷爷奶奶带回老家去了。难得有不需要陪娃的一天

Ant Engine 开源

我在自己研发的游戏引擎上已经工作了 6 年了。在 2017 年底,我写下了对这个新引擎最初的构想 。现在回头来看,当初的想法居然都落实了,只有一点例外:我们中途把编辑器从 IUP 转移到了 ImGUI 上。 2022 年,我们启动了第一个用这个引擎开发的游戏项目,它是一个和日本公司合作的动作游戏。后来,这个项目没有走下去就取消了。之后,因为我们的引擎开发组喜欢 Factorio ,便想用自己的引擎在手机上重现一个 Factorio Like 的游戏,这一干就是一年多。 现