众所周知luacluster是第一个实现万人同屏的游戏服务器框架。然后就有无数人来问我为啥呀?思路呀?架构呀?雀实程序员现在都不看代码的呀!可我发了哪么多技术文章也都没人看!你敢信?哎~可是你们不看我也得发呀。真怕哪天我老死了,游戏服务器这门手艺怕是就失传了呀!哎,做技术不容易,关注得兄弟给点个赞吧!
https://github.com/surparallel/luaclustergithub.com/surparallel/luacluster
话说过来能不能在服务器使用物理引擎呢?使用物理引擎是没得问题的。把Bullet封装到DLL给LUA调用就可以。Bullet是多线程不安全的,所以在每个线程(luacluster中的docker)里创建一个物理引擎实体。在某个需要计算物理的场景时。可以把所有相关的物品放入物理引擎并计算想要的结果。在多线程或分布式状态下不能只创建一个物理引擎。因为很明显这个物理引擎会成为分布式下位置同步的瓶颈。但创建多个物理引擎就不能实时同步数据。因为也会导致性能瓶颈。这样物理引擎实际就变成每个服务器对象的一个计算工具。
在应用场景下。例如NPC发射了炮弹。哪么这个炮弹可以放到物理引擎里计算每帧的轨迹。然后在每帧把轨迹同步给AOI内的可见对象。如果炮弹在空中被拦截,对就是爱国者干的事情。哪么就要重新计算碰撞的轨迹。直到炮弹到达指定落点爆炸。
这里问题来了,如果每个物理引擎计算轨迹并在每帧同步位置。哪么相当于一个帧同步的消息广播源。这个帧同步的消息广播源。一直在服务器内引发消息动荡!!在《luacluster总体架构》中我说过要消灭纯粹的帧同步。因为任何帧同步的方式都非常低效。帧同步相当于玩家从A移动到B点。然后每帧都发起广播说A移动了0.1米。即使高频的枪战游戏。大部分时间里玩家的操作都是按秒计算的。