August 16, 2018

虚拟文件系统的自举

我们给游戏引擎设计了一个虚拟文件系统,可以挂接不同的文件系统实现,比如本地文件系统模块,内存文件系统模块,网络文件系统模块。比如前几天谈到的资源仓库,就是一个文件系统模块。

这个虚拟文件系统是用 lua 编写的,这就有了一个小问题:lua 代码本身也是放在虚拟文件系统中的,那么就需要解决自举。这些代码很有可能需要从网络更新(网络文件系统模块),而网络模块也是 lua 编写的,代码同样放在这套文件系统内。

这篇 blog 我想谈谈自举是怎样完成的。

阅读全文 "虚拟文件系统的自举" »

August 15, 2018

Lua 虚拟机的封装

我打算就我们在开发客户端引擎框架时最近遇到的两个问题写两篇 Blog ,这里先谈第一个问题。

我们的框架技术选型是用 Lua 做开发。和很多 C++ 开发背景(现有大部分的游戏客户端引擎使用 C++ 开发)的人的认知不同,我们并不把 Lua 作为一个嵌入式脚本来看待,而是把它当成一种通用语言来设计整个引擎框架。

其实这更接近 HTML5 流行之后,用 javascript 设计游戏引擎框架:虽然 javascript 的虚拟机本身是用 C++ 开发的,但和游戏引擎相关的部分全部用 javascript 实现,直到涉及渲染的部分,又通过 WebGL 回到 C++ 编写的代码中。这里,我只是把 javascript 换成了 Lua 而已。

选择 Lua 有很大成分是因为我的个人偏好,另一部分原因是 Lua 有优秀的和 C/C++ 代码交互的能力。可以方便地把性能热点模块,在设计上做出良好的抽象后,用 C/C++ 编写高性能的模块,交给 Lua 调用。

但和 Javascript 不同,我们在做原生 App 时,和操作系统打交道的部分还是得用操作系统的语言,C/C++/Objective C/Java 等等。Lua 虚拟机还是要通过一个 C 模块实现嵌入到 App 中去,这个工作得我们自己来完成。

让 Lua VM 置入 App 和操作系统打交道的这部分代码显然是平台相关的,Lua 的 C API 固然简洁,但是还是很庞大的。如果每个平台都直接用 Lua C API 控制虚拟机,这些平台相关的代码还是略显繁杂。我认为,把平台相关代码约束到一个足够小的范围,还需要对 Lua C API 再做一次抽象。

阅读全文 "Lua 虚拟机的封装" »

August 14, 2018

游戏资源仓库及升级发布

去年底,我为我们的 3d engine 设计了资源仓库的结构

随后交给开发组的一个同学实现,这半年来,一直在使用。最近做了引擎一个小版本的内部验收,我感觉这块东西还有比较大的改进余地。因为资源文件系统目前和开发期资源在线更新部分现在掺杂在一起,而网络更新部分似乎还有些 bug ,偶尔会卡住。我觉得定位 bug 成本较高,不如把这块重新实现一遍,顺便把新的改进想法加进去。

这段时间,我重新思考了资源仓库应该怎样设计更合理。越细想越觉得和 git 要解决的问题基本一致。我们的引擎的一个重要特性就是,在 PC 上开发,在移动设备上运行调试。我们需要频繁的将资源同步到设备上,这其实和 git 的运作方式是类似的。我们重新实现的该模块在本地文件系统上的数据组织结构最终也和 git 仓库差不太多了。

阅读全文 "游戏资源仓库及升级发布" »

July 25, 2018

三人合租的房租公平分配方案

今天在读《数学也荒唐》时读到分蛋糕问题,想起之前写过一篇 blog 谈房租分配,其实是同一个问题:

当多个人要切分资源时,如何让每个人都满意。

因为每个人对价值判断是不一样的,就租房来说,有人追求性价比;有人追求舒适,对价格不敏感;按某种固定的方案定价就不太公平。

如果是两人合租,最简单的公平方案就是你定价,我来选。A 来提一个自己认为公平的定价方案:例如大房间 1000 ,小房间 800 ;B 来选择住大房间还是小房间。如果 A B 都是理性的,这就是让双方都满意的方案。

但是三人或更多人分配就没有这么简洁的策略。我在前篇 blog 中讨论了这个问题,在回复中,也有同学给了知乎上分蛋糕问题的链接。

过了这些年,今天读书时又看到,感觉有趣,那么再写一次。

阅读全文 "三人合租的房租公平分配方案" »

July 12, 2018

数学运算的实时编译及 Lua 中的一点奇技淫巧

我为 3d engine 项目设计的向量运算库 已经用了一段时间了。在使用过程中也一直在改进 。从一开始,我就考虑过,这个库的设计主要考量是减少 lua 和 C 交互间的开销,提高内聚性。而易用性方面,计划再上面再做封装。这段时间继续在想怎样从更自然的表达形式转换到这个库的逆波兰指令流上。

大致的方向有两个:

其一,实现一个小语言,用字符串输入表达式组。

其二,利用 Lua 已有的语法解析设施,把 lua 的一个函数翻译成对应的数学运算指令流。

两者都可以看成是一种 jit 的过程,在第一次运行的时候,做一些翻译工作,把要进行的数学运算打包成 C 代码可以处理的指令流,或翻译成现有数学库支持的指令流;或者,增加一个 lua 源码的预处理流程,在预处理阶段做好编译工作(aot)。

这个需求可以分解成三个问题:

首先,如何把更易用的的源码对接到 lua 原生代码。

其次,如何转换为正确的数学运算指令流。

最后,为以上过程选择 jit 或 aot 集成。

阅读全文 "数学运算的实时编译及 Lua 中的一点奇技淫巧" »

July 06, 2018

线程安全的 log 回调函数

最近在做 3d engine 时发现,我们使用的渲染 api 库 bgfx 提供的 log 回调函数是需要自己保证线程安全的。也就是说 bgfx 有可能在不同线程(采用多线程渲染时)调用这个 log 回调函数。

如果回调函数仅仅只是把 log 串写入文件(例如标准输出),那么可以由 crt 本身来保证线程安全。但如果想自己处理 log ,例如把 log 串压回 lua 虚拟机,那么就必须自己负责线程安全的问题。

阅读全文 "线程安全的 log 回调函数" »

June 20, 2018

有时候还真要信命

我们公司最近预研了一款对战游戏,是我的创新实验室中一个同事原创的玩法,同时他做了几乎所有的实现工作:包括客户端,服务器,还有从别的老项目借出来的美术资源……

在独自开发了大半年后,我们又加了几个同事协助他把最后的工作完成。上个月,终于告一段落,所以在公司内部做了一次大规模的试玩。游戏还是挺有意思的,试玩的同学非常踊跃,昼夜不休的打天梯。试玩期结束后,我们决定对最活跃的数十个玩家进行一次奖励。用抽奖的形式奖励自选 switch 游戏卡。天梯排名靠前的同学可以有更高的权重(是排名靠后的同学的 6 倍)。我的排名很低,所以只拿了一张抽奖票,最后一共发放了 106 张奖票。

阅读全文 "有时候还真要信命" »

Misc

Categories

Archives

Recent Comments