zoukankan      html  css  js  c++  java
  • cocos2dx-lua采用pbc解析proto问题修正

    在cocos2dx-lua中应用pbc解析protobuf协议格式发现,其对嵌套消息的解析很不友好。 经过for pairs循环检验发现,decode方法并没有解析内部嵌套的子消息。

    进一步检查发现,子消息的输出格式为table:第一个字段为子消息的名字, 第2个字段为一个奇怪的字符串(一般为子消息的第一个字段)。进行了各种尝试,发现只要访问一次子消息实际存在的字段,则子消息的结构自动输出为正常。

    很奇怪吧!大神的代码总是用各种元表奇奇怪怪的实现来追求效率, 而实际游戏开发中总是需要各种通用的写法。

    如果不能对字段进行打印调试毫无疑问是没办法正常开发的,最后发现只要针对子消息结构调用一次decode则可以解决嵌套消息无法正常输出的问题。需要编写下面代码

    function decodeAll(typename, buffer)
       local ret = decode(typename, buffer, length)
       if ret then
          decodeTable(ret)
       end
       return ret
    end
    
    function decodeTable(tbl)
       for k,v in pairs(tbl) do
           if type(v) == "table" then
              --这里的xxxx请自行替换成protobuf的package
              if(type(v[1]) == "string" and string.find(v[1],"XXXXX.")) then
                   local ret = decode(v[1], v[2])
                   if ret then
                      tbl[k] = ret
                   end
              end
              decodeTable(tbl[k])
           end
       end
    end
    

      游戏中调用protobuf.decodeAll即可正常解析了

    另外发现decode后的lua table在访问不存在的字段会报assert, 修改下面这个方法可以解决这个问题

    function _decode_type_meta:__index(key)
        local t, msg = c._env_type(P, self._CType, key)
        --local func = assert(_reader[t], key)(msg)
        local reader = _reader[t]
        local func
        if reader then
            func = reader(msg)
        else
            func = function() end
        end
        self[key] = func
        return func
    end
    

      这样我们就可以在游戏中比较友好的使用pbc来解析proto格式了

  • 相关阅读:
    noip模拟70
    noip模拟测试62
    noip模拟66
    noip模拟67
    noip模拟64
    QATF自动化测试框架
    自动化领域谁主沉浮
    TestComplete9.2增强支持 Embarcadero RAD Studio XE3、Ext JS
    QTP对SAP的支持
    如何将makefile构建的工程导入C++test?
  • 原文地址:https://www.cnblogs.com/ColaZhang/p/5156105.html
Copyright © 2011-2022 走看看