项目踩的一些坑

项目总结

王者猎人

使用技术:skynet,lua,mongo

代号血月服务器架构

skynet.cluster的小坑

1
2
3
4
5
6
7
8
9
let node = nil
function test()
    skynet.queue(function()
        if node then
            return;
        end
        node = cluster.proxy(service, args)
    end)
end

查到的问题是:在cluster.proxy进行rpc调用的时候,会先node赋值一个指向未知的地址,导致node不为nil。在让出协程的时候,其他协程访问这段代码的时候,会提前跳出队列,然后访问node的时候就有可能出问题。(暂时没有深入探索原因)

后面改成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
let node = nil
function test()
    skynet.queue(function()
        if node then
            return;
        end
        let tmpNode = cluster.proxy(service, args)
        node = tmpNode
    end)
end

道具一键合成:

同一套逻辑,lua用时100ms,js用时<1ms。 分析原因:

  1. 本身背包设计问题,检查消耗无法用键值对map去表示一组道具,而是用一个数组,导致合成过程中插入新的消耗,合并消耗,检查消耗等操作会产生更多的遍历。
  2. 设计lua深拷贝,lua深拷贝是用递归实现的,频繁深拷贝导致函数入栈出栈,也有一定的性能消耗。

协程让出,代码执行顺序问题

英雄多阵容

需要把英雄站位,装备穿戴情况保存下来,在副本中直接上阵。直接全盘保存数据占用会很大,有一些养成模块的字段是非必须是,比如名字,uid等

只需要把跟属性计算相关的字段存盘就可以,这样就可以根据简要的信息算出阵容当前属性

skynet自带的mongo接口

skynet中mongo的aggregate操作,用aggregate条件查询数据,同一条语句可能会查出不同的结果

代号血月

实用技术:node.js,typescript,Redis

王者猎人-服务器架构

rpc

在a,b结点非直连,中间隔着一个网关结点gateway的时候,ab结点相互通信的时候,rpc消息都需要在gateway中转发到对方。

在数据同步的时候需要注意rpc消息是否可达。两个结点都要在连上网关之后各自向对方请求数据同步。

比如:a是b的上级结点,a连上gateway之后,a结点需要广播消息给下级b结点。b结点连上gateway之后,需要向b结点发起请求。

聊天的消息队列

旧版本是队列直接用js的数组,js的数组pop第一个元素,会使后续元素都往前移动一位,很耗时。

Built with Hugo
Theme Stack designed by Jimmy