Unity使用C#与C++服务端通讯协议探讨

作者:雨辰 发布于:2015-10-11 20:15 Sunday 分类:游戏架构

最近在做u3d的网游,服务器端用的是比较成熟的C++。
客户端用的是C#,所以在数据协议上遇到一些问题,希望和大家交流交流。
 大家有木有好方法!!!

1、传统模式
直接从结构体转换成byte流,C#提供了Marshal类,基本可以实现:
        public static byte[] Struct2Bytes<T>(T obj)
    {        int size = Marshal.SizeOf(obj);
        byte[] bytes = new byte[size];        IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
        Marshal.StructureToPtr(obj, arrPtr, true);        return bytes;
    }    public static T Bytes2Struct<T>(byte[] bytes)
    {        IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
        return (T)Marshal.PtrToStructure(arrPtr, typeof(T));    }
该方法有几个限制:1)是不能在web中使用。2)在IOS中使用的话,只能是结构体,不能是类。
2、使用messagePack、protobuf、json等流行的序列化技术
1)、json的效率方面不太有优势,没有去研究
2)、messagePack 的C#源码用了大量的.net4.0中的新功能,对于只支持.net2.0的unity3d来说,简直是噩梦。(代码是开源的,或许哪位牛人可以基于它修改下,那就太好了!)
3)、protobuf,谷歌大神的东西,也有.net版(还没研究,希望全放在它身上了...)


3、自暴自弃型
对每个消息类重写S2B(Struct2Bytes),和B2S方法,这尼玛...


4、unsafe 指针        unsafe byte[] S2B(int size, byte* obj)
       {
           byte[] b = new byte[size];
           for (int i = 0; i < b.Length; i++)
           {
               b = *(obj + i);
           }
           return b;
       }
unity3D默认是不允许unsafe 的,不过可以开起的。
另外unsafe 也只能作用于结构体(而且默认情况下不开起,是不是开起后有些问题,没有具体去测过,充满各种不确定性啊!)

标签: C++

发表评论:

雨辰 joyimp|@2011-2017 京ICP备16030765号