使用Lua作为序列化格式

2020-06-18 09:39:50

这在某种程度上是我几天前关于Lua集成的帖子的后续内容。

作为今年我的高级研究项目的一部分,我编写了一个万有引力模拟器,旨在帮助学习/教授物理。我们的目标是让它尽可能地可访问/可用,所以我把90%的时间花在了UI上。该项目的主要功能之一是您可以保存和加载预设场景,例如,等质量物体的栅格或双星系统。

这个项目是用Rust编写的,所以在这一年里,我决定使用超级强大、流行的serde库,它与我使用的ECS库spes集成得很好。我没有特别的原因将其序列化为RON格式,只是因为理论上它是人类可读的。

结果相当不错,我对结果很满意;序列化/反序列化性能并不那么重要,因为模拟不能处理超过1000个主体,所以文件非常小。我最大的问题是有很多不必要的数据被序列化,并且有很多空格,使得它对人类来说有点难以辨认。尽管如此,我还是没有足够的心思去修好它。

最近,我将Lua集成添加到我的项目的力学模拟器部分的重写中,并对它的简单性感到非常惊讶。最初,我只计划使用Lua作为serde/RON序列化的替代方案,只是为了对非编码器用户更友好,但是考虑到Lua的语法,您可以生成实际上是标记的输入文件。

力学模拟器的重写现在非常不完整,所以我还不想编写序列化程序,但我决定将我的重力模拟器完全移到Lua。结果相当不错。

其中一种预设的情况是BASE_GRID,它只是一个巨大的~1000个身体网格,由于负质量而相互排斥。它只是用来进行基准测试的。使用RON序列化时,它以25k行、534kb的文件表示。每个.ron序列化正文如下所示:

EntityData(标记:SimpleMarker(0),组件:(Some(位置([0,0,]),Some(运动学(vel:[0,0,],Accel:[0,0,],Past_Accel:[0,0,],)),Some(质量(-0.2)),Some(绘制(颜色(r:1,g:1,b:1,a:1,),Some(半径(5)),Some(轨迹。),),

虽然从技术上讲,它是人类可读/可编辑的,但它非常令人不快。这真的不是罗恩的本意。

当然,这对Lua来说是最好的情况。Lua文件是这样的:

对于i=1,32 Do对于j=1,32 Do add_body({x=20*i,y=20*j,quality=-0.。1,rad=2})结束端。

对于没有任何逻辑的场景,Lua实际上只是标记。这是一个双星系统:

添加主体({x=125.。000,y=70。000,x_vel=0。000,y_vel=1。000,质量=80。000,rad=4。500},{x=175.。000,y=70。000,x_vel=0。000,y_vel=-1。000,质量=80。000,rad=4。500},{x=-30.。000,y=70。000,x_vel=0。000,y_vel=-1。000,质量=0。500,rad=1。000},{x=330。000,y=70。000,x_vel=0。000,y_vel=1。000,质量=0。500,rad=1。000})。

一如既往,当允许用户编写脚本时,这只是冰山一角。我确信,一个精明的用户可以做一些数学计算并编写一个Lua脚本来生成n星系统,而不是通过硬编码来创建双星系统。