如何实现游戏服务端跨LUA状态机线程安全访问对象TABLE?
摘要:今天较深入学习了skynet游戏框架,提出接口函数改进方法。 游戏当中,基本是对游戏实体操作(全局对象玩家怪物物品地图等),而在多状态机(线程模式下)对游戏实体的操作更加麻烦。skynet.call和send函数没有直接定位到实体对
今天较深入学习了skynet游戏框架,提出接口函数改进方法。
游戏当中,基本是对游戏实体操作(全局对象/玩家/怪物/物品/地图等),而在多状态机(线程模式下)对游戏实体的操作更加麻烦。skynet.call和send函数没有直接定位到实体对象身上。本文抛弃了消息概念和Actor概念,提出了四个可以直接对接到游戏实体身上的函数,基于状态机(线程)、跨状态机调用函数这两个概念来进行游戏开发:
1. 跨状态机同步调用目标虚拟机模块函数:
function call_sync({entity_id1, entity_id2}, module_name, method_name, ...)
2. 跨状态机异步调用目标虚拟机模块函数:
function call_async({entity_id1, entity_id2}, module_name, method_name, callback, ...)
3. 跨状态机同步在目标虚拟机执行函数:
function exe_sync({entity_id1, entity_id2}, exe_func, ...)
4. 跨状态机异步在目标虚拟机执行函数:
function exe_async({entity_id1, entity_id2}, exe_func, callback, ...)
函数1、2是调用另外虚拟机模块方法对实体对象进行操作,函数3、4是把函数发送到目标状态机上对实体对象进行操作(模块化代码结构更加清晰,性能有所下降适合低频操作)。
依托上面四个函数,可以进行二次封装实现跨状态机(线程)的物品消耗、血量、发送聊天对话、查阅对方战力等操作。
同理,在纯C++/golang语言开发的游戏服务器当中也可以借鉴实现,便于提高游戏开发效率。
