游戏数据
游戏数据分几个部分,1客户端内存里的,2客户端和服务器交互的网络数据包,3是服务端内存里的,4是数据库里的。我希望能尽可能简洁地处理这些数据,减少开发的工作量。最近我在独立开发客户端和服务端,才有机会来尝试或者说才会产生这样的想法。
服务端是skynet框架,lua环境,和数据库用connect之类的库连接,这些事都不用我管。设计完数据库以后,数据库请求语句返回的lua table就长成设计的样子了。如果我不希望改变table结构,不去封装这些数据,就可以把它们序列化成二进制串发给客户端,那么,protobuf的设计结构就必须和数据库相同,参数名和类型全都一一对应。
lua可以通过setmetatable,来给table加上方法,这样就近似于把table变成了一个带有很多定义好的function的class。客户端这里,Unity是c#,protobuf生成的partial数据类也可以定义方法。
我现在在服务端是用的上述方法做的,客户端用了不同的逻辑。我给一些数据创建了代理类,来操作数据。感觉这么做蠢蠢的,但是比创建不同的抽象逻辑结构,手动复制数据来说,应该是好多了。我之所以不用partial类,是考虑到数据从服务器发回来全量更新的时候,partial里如果有一些逻辑数据,并不需要提交到服务器的客户端缓存,此时就又变成只能手动复制数据了。而这种困扰在服务器好像不太会遇到,毕竟服务器的数据都是有持久意义的。我不太清楚这些想法是否正确,等再写多一点,再来完善这篇。
如果做到了这些,偷懒时间就到了。
Written on October 9, 2018