December 18, 2018

lua 5.4 可能会增加 to-be-closed 特性

如果你有关注 lua 在 github 上的仓库,就会发现,最近一段时间增加了一个新特性:to-be-closed 的 local 变量。

鉴于历史上 lua 每次的大版本开发过程中都会增加很多有趣的特性,却无法保持到版本正式发布。本文也只是介绍一下这个有趣的特性,并不保证它一定会被纳入语言标准。正式的发布版中即使有这个特性,语法上也可能有所不同。

我认为 Lua 加入这个特性的动机是它缺乏 RAII 机制。过去,我们必须用 pcall 来确保一段代码运行完毕,然后再清理相关的资源。这会导致代码实现繁琐,几乎无法正确实施。比如,如果你用 C 函数申请了一块资源,期望在使用完毕后可以清除干净,过去就只能依赖 __gc 方法。但 gc 的时机不可控,往往无法及时清理。如果你把释放过程放在运行过程的末尾,是很难确定整个运行过程中没有异常跳出的可能,那样就无法执行最后的释放流程。

阅读全文 "lua 5.4 可能会增加 to-be-closed 特性" »

December 03, 2018

惰性编译资源仓库中的源文件

我们的 3d engine 的资源仓库使用 Merkle tree 储存在本地文件系统中,我们称呼它为 vfs ,虚拟文件系统,其结构和 git 的仓库非常类似。关于这部分的设计,之前已写过好几篇 blog 了。

现阶段已完成的版本,已经做到把 lua 虚拟机和所有 C/C++ 实现的 lua 库静态编译打包为一个执行文件,可以零配置启动运行,通过网络远程访问一个 vfs 仓库,完成自举更新和运行远程仓库里的项目。

最近在开发的过程中,发现了一点 Merkle tree 的局限性,我做了一些改进。

阅读全文 "惰性编译资源仓库中的源文件" »

November 30, 2018

ECS 中的 Entity

我认为 ECS 框架针对的问题是传统面向对象框架中,对象数量很多而对象的特性非常繁杂,而针对对象的不同方面 aspect 编写处理逻辑会非常繁杂。每个针对特定的方面执行业务,都需要从众多对象中挑选出能够操作的子集,这样性能低下,且不相关的特性间耦合度很高。

所以 ECS 框架改变了数据组织方式,把同类数据聚合在一起,并用专门的业务处理流程只针对特定数据进行处理。这就是 C 和 S 的概念:Component 就是对象的一个方面 aspect 的数据集,而 System 就是针对特定一个或几个 aspect 处理方法。

那么,Entity 是什么呢?

我认为 Entity 主要解决了三个问题。

阅读全文 "ECS 中的 Entity" »

November 21, 2018

3d engine 项目招聘

我们的 3d engine 项目从 2018 年 1 月底开始,已经过去 10 个月了。比原计划慢,但是进度还可以接受。目前已经大致完成了运行时的基础渲染框架(基于 ecs 模式),整合了 bullet 物理引擎,开发了一个基于网络的虚拟文件系统,可以不依赖本地的资源/代码直接远程运行。另外还开发了一个 lua 的远程交互调试器,可提升 lua 的开发效率。

单从 runtime 角度,引擎的完成度已经较高。但和之前开发 ejoy2d 不同,这次希望把引擎的侧重点放在工具链上。所以虽然有计划开源,但在工具链不成熟的现阶段,暂时还是闭源开发。

目前团队有全职程序 3 名,我个人没有全职加入,但也花了颇多精力在上面。所以在关键节点上,我们已有 4 个人全力开发。

现在想再招聘一名成员,主要想补充工具链,尤其是开发环境/编辑器的开发。让引擎可以在半年内可用于新游戏 demo 的开发。对于这个职位,可以列出下列明确的需求:

阅读全文 "3d engine 项目招聘" »

November 07, 2018

判断点是否在三角形内的算法精度问题

今天一个同事反应,在使用 recastnavigation 库时,判断一个点是否在一个三角形内,遇到了精度问题,而且精度误差很大。

具体是 dtClosestHeightPointTriangle 这个函数。

他给出了一组测试参数,abc 三点为 {261.137939, 8.13000488} , {73.6379318, 8.13000488}, {76.9379349, 10.2300053} ,测试 p 为 {74.4069519 , 8.6193819 } 应该在这个三角形内,但是这个函数计算出来并不是。

阅读全文 "判断点是否在三角形内的算法精度问题" »

November 06, 2018

Skynet 1.2.0

今天我发布了 skynet 1.2.0。

距离上次发布 1.1.0 已经有一年了。虽然我觉得给 skynet github 仓库里某个特定版本起个有意义的名字并无太大意义,因为我也不会刻意去维护一个所谓稳定版。但在 issues 中还是发现有一些同学还在基于上个 1.1.0 的 release 版提问题,我认为还是保持一年一个版本号比较好。

其实,对于活跃项目,最好的方法还是始终跟进 github 上的 master 比较好。我也刻意在维持代码的向前兼容性。skynet 的 api 已经很稳定,不用太担心更新造成项目跑不起来。话说回来,即使某次更新打破了兼容性,每次一小步的跟进也比隔上一年才同步一次,或是永不升级来得好。

跟进及时可以减少更新带来的新问题。有麻烦可以马上反馈,我更容易帮助解决;不更新容易让 bug 滞留,原本已经解决的 bug 可能在未来再次困扰你。随着 skynet 的用户越来越多,隐藏在犄角旮旯的 bug 更容易被找出来。在 issues 板块,已经有很多问题其实是在 issue 提出时已经被解决了的,仅仅只是因为未更新代码。这种问题无疑浪费了大家的时间。

阅读全文 "Skynet 1.2.0" »

October 21, 2018

Lua 的多线程支持

单个 Lua 虚拟机只能工作在一个线程下,如果你需要在同一个进程中让 Lua 并行处理一些事务,必须为每个线程部署独立的 Lua 虚拟机。

ps. 在少量多线程应用环境,加锁也是可行的。你可以在编译时自定义 lua_lock(L)lua_unlock(L) 去调用操作系统的锁。

比较成熟的 lua 多线程库有 LanesEffil 。它们都试图隐藏多虚拟机的细节,让用户使用起来好像多线程在使用同一个虚拟机一样。比如 Effil 就用了 effil.table 去模拟 table 并让多个虚拟机可以共享数据;Lanes 则有 deep userdata 可以在不同线程间共享。

阅读全文 "Lua 的多线程支持" »

Misc

Categories

Archives

Recent Comments