那些年我们趟过的坑,环信IM Unity SDK 2.0正式发布

 头条123   2023-10-25 20:07   2428 人阅读  0 条评论
那些年我们趟过的坑,环信IM Unity SDK 2.0正式发布

  Untiy作为游戏引擎和内容开发平台,吸引了众多游戏开发者,基于其开发的游戏更是不胜其数。具体请参见1。

1.jpg

  环信作为领先的即时通讯云服务商,在游戏行业也进行了持续的探索和研发投入。在产品发布的早期(2015年)就推出了Unity SDK,帮助游戏开发者快速实现游戏场景下诸如世界频道,游戏公会、组队群聊,1对1私聊等功能,安全稳定的服务也为游戏玩家带来了极佳的实时沟通体验。

  2021年 二季度,环信IM Unity SDK进行了重构改版,环信IM Unity SDK 2.0正式发布,主要改进包括如下:

    1、迭代更新,更加实用的API接口

    2、IM+Push增强功能的补全

    3、C#语言层面引入了版本7.0 – 9.0之后的一些新语法改进

    4、特别的,增加了PC端Unity Editor环境下编译调试支持,大大提升了开发效率

  在过去的一段时间里,笔者也参与了相应的研发工作。在整个过程中,为了解决各种问题,不仅要到处翻阅资料,还要尝试各种方法和参数组合。其间也经历了各种程序崩溃甚至系统崩溃,诡异的程序表现一次次让开发人员束手无策,四处碰壁,当真像深夜里行走在迷宫之中,手里还拿着一个待破解的魔方。“此路不通,请绕行!”,是在一次次的尝试后无奈的慨叹和难舍的放弃。而一旦问题 后得到圆满解决,又宛如飞入云端,以上帝视角俯瞰一片片迷宫,一切又显得那么理所当然,繁复琐细但又丝丝入扣,这样的苦尽甘来也算是做程序员能享受到的巨大喜悦和满足。

  不敢独享,特记录下一些心得供大家参考,也欢迎.NET平台资深玩家批评指正。以下,Enjoy!

  开发概览:非托管插件开发(Native/Unmanaged Plugin)

  Unity是基于Microsoft .Net Framework开发的游戏引擎2,它采用了开源的.NET Platform,并依赖此框架来实现跨硬件设备和运行时(操作系统)的目标,也是所谓的”Write once, run anywhere”。在语言方面,Unity选择C#作为主要的脚本编程语言,虽然.NET平台本身支持的语言有很多种。

  进一步,Unity支持Mono和ILC2PP两种脚本框架(Scripting Backends)。特别的,Unity Editor采用的是Mono脚本框架。

  一般的,游戏类库开发者可以选择直接用C#语言开发,目标类库可以实现基于.NET Framework基础功能之上的高级功能,这类插件称之为Managed Plugin(托管插件)。由于环信IM核心SDK已经基于C++开发,因此我们选择另一种Native Plugin(本地插件)的方式,正是它把我们引向了迷宫之旅。两种类型的Plugin介绍,参见3。

  不幸的是,Unity网站上关于Native Plugin的相关介绍少只又少,想要了解它的具体细节还要去参考Microsoft MSDN文档。作为中规中矩的文档介绍,微软的文档是合格的,但是,当你真正上手编程时就会发现,这些远远不够:下面记录的一些坑点就很难在相应的文档中得到直接的提示;而要通过Google大法,结合其他程序员留下的蛛丝马迹,再加上自己不断的调试来 终确认。

  在微软文档上下文中,Unity Native Plugin有个另外的名字:Unmanaged Plugin,即非托管插件。简单来讲,Managed Plugin生存在.NET Framework的运行时环境(类似于Java的JVM),而Unmanaged Plugin则生存在这个运行时环境之外,也即和运行时环境是兄弟的关系。如果你原本的类库实现满足微软的COM(Component Object Model)规范,那自然 好是使用COM Interop4的互操作方式;而环信IM SDK本身是纯C++实现,因此采用了Platform Invoke5(简称P/Invoke)方式,本文剩下的内容均是基于P/Invoke。

  下图则概要描述了Managed和Unmanaged区域代码之间互相操作的方式:

那些年我们趟过的坑,环信IM Unity SDK 2.0正式发布

  更具体的,为了实现对于Unmanaged DLL function的调用,只需要简单的4步6:

  1、确认DLL类库中需要被操作的函数;

  2、创建一个C#类来关联被操作的这些函数(给函数穿上一个马甲,以便集中管理和反复调用);

  3、使用DllImport标志在受管侧(C#)定义函数原型;

  4、在受管侧随意调用相关非托管区域函数。

  上图中,Standard marshalling service即负责将数据在两个区域进行封装/解封装传送(marshall/unmarshall),它主要定义了数据在两个不同内存区域进行拷贝(Copy)和引用(Reference)的规则7,而迷宫中的坑主要是和这些具体规则有关。

  坑王驾到之封送(Marshall/Unmarshall)中的那些坑

  坑一:sizeof(bool) = ?

本文地址:https://www.toutiao123.net/news/2760.html
版权声明:本文为原创文章,版权归 头条123 所有,欢迎 本文,转载请保留出处!