趣闻角落 >> 深度锐评>>

辟效,大大年公布正式年夜力夜晋环疑降开

辟效,大大年公布正式年夜力夜晋环疑降开 本章共2584字, 更新于: 2025-04-21 07:38:50

引止

Untiy做为游戏引擎战内容开辟仄台,环疑吸收了浩繁游戏开辟者,正式基于其开辟的公布游戏更是没有堪其数。详细请拜睹1。大年

环疑IM Unity SDK 2.0正式公布,年夜大年夜大年夜晋降开辟效力

环疑做为抢先的晋降坐即通疑云办事商,正在游戏止业也停止了延绝的开辟摸索战研收投进。正在产品公布的效力初期(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) = ?

尽大年夜多数的根基范例属于Blittable Types8:如System.Byte, System.Single等。System.Boolean固然没有属于Blittable types,但是Standard Marshalling Service默许将其转换为1,2,4字节的内存存储,当其值为true时,其对应的值为1。如果您念当然的直接将System.Boolean映照到Unmanaged侧的bool范例而没有做特别措置的话,您并必然会了解碰到编译或运转弊端端,但是如果您宽格的测试每个字段是,会惊奇的收明那些bool值跟您设念的没有尽没有同:偶然细确,有弊端端。

颠终调试跟踪,静态挨印sizeof(bool)去确认Unmanaged侧bool范例数据少度后,您会收明System.Boolean默许会被保存为4个字节少度,而正在macOS环境下(对别的环境,需供自止认证),C++定义的bool真正在只需一个字节。是以当您正在Unmanaged侧与bool值的时候,真正在只读与了System.Boolean的1/4个字节罢了。而当您声了然多个持绝的System.Boolean/bool值时,能够正在Unmanaged侧读与的那几个bool值仅仅是第一个System.Boolean值的分歧偏偏移字节罢了。

晓得了启事,处理计划天然便出去了,正在Managed侧强迫声明System.Boolean字段启支到Unmanaged侧时仅利用一个字节:

[MarshallAs(UnmanagedType.U1)]public bool TrueOrFalse;

坑两:字节对齐

对C++开辟者去讲,能够晓得当一个数据布局(class or struct)中的各字段正在内存中停止摆列时,会遵循一个设定的拆箱少度停止字节对齐,比方:

struct MyStruct {

int one;

short two;

int three;

bool four;

}

假定正在我们的仄台上,sizeof(int)=4, sizeof(short)=2, sizeof(bool)=1, 如果问您sizeof(MyStruct)=?,您能够会顿时做个减法获得问案,但是问案没有必然对。It depends! 假定我们是遵循4个字节对齐,那上里的布局体正在内存中真际摆列以下图:

环疑IM Unity SDK 2.0正式公布,大年夜大年夜晋降开辟效力

体会那个对我们编码有两个意义:

1、经由过程公讲摆列字段声明挨次去劣化存储效力,内存布局中没有留浮泛;

2、MarshalAsAttribute支撑Layout.Explicit去停止尽对定位,晓得了字节对齐能够共同Unmanaged侧的内存摆列法则以包管字段少度映照细确,没有然一样会产逝世字段少度没有分歧带去的搅扰。

坑三:如何制止Double Free

Standard Marshalling Service/Interop marshaller老是试图开释Unmanaged侧代码分派的内存9,那会带去Double Free的题目,如果碰到那类题目,法度便会直接崩溃。

援引资猜落第了以下例子:

BSTR MethodOne (BSTR b) {

return b;

}

如果那段代码直接从Unmanaged侧DLL中直接履止,没有会产逝世任何分中的内存开释;但是当您从Managed侧调用那个别例时,b会被开释两次。

而更让人抓狂的是,并出有吸应的疑息提示事真是哪个指针,哪个字段被Double Free了,您独一能做的便是一面面减代码去考证本身猜念。以是,宽格去讲,并出有一个万无一掉的计划去制止Double Free,您独一能做的便是经由过程测试去考证成果(有面盲拧魔圆的味讲了)。

有两个根基的体例去处理Double Free的题目:

1、遵循民圆文档建议,正在Unmanaged侧经由过程利用CoTaskMemAlloc去分派内存,经由过程此种体例分派的内存,除非隐式调用了CoTaskMemFree体例(正在Unmanaged侧或Managed侧皆能够调用),Interop Marshaller会宽格包管没有往开释该内存。利用那类体例能够矫捷的正在肆意一侧分派内存,并正在开适的时候正在另中一侧开释内存。

2、但上里那类体例貌似仅开用于Windows仄台,正在macOS下出有体例利用(需供援引win32base.dll相干真现)。正在macOS下仅能经由过程正在Mananged侧调用Marshal.AllocCoTaskMem()体例分派内存,并经由过程Marshal.FreeCoTaskMem()去正在同一侧停止开释(遵循此体例分派的内存指针传进Unmanaged侧后,没有要停止任何开释便可)。别的有一个没有太可靠的workaround是:正在Unmanaged一侧建坐的内存指针尽能够经由过程IntPtr通报,并正在能够的时候将工具中一些指针范例的属性值置空,以制止Double Free的产逝世。

坑四:virtual函数带去的内存布局窜改

vptr战vtable是C++的一个观面:当您定义的范例中有真函数存正在时,内存工具的第一个地位会存放一个vptr指针,该指针指背vtable(真函数表)。是以当您开端建坐的自定义范例一开端出有真函数时(包露真析构函数virtual ~MyClass()),统统运转普通。有一天您重构此范例,删减了一些真函数:DUANG,统统皆倒塌了!启事便正在于Unmanaged侧内存工具的摆列法则变了,本本的工具字段皆被新插足的vptr今后里移位了。此时能够您独一能做的便是经由过程Layout.Explicit去足工对齐每个字段新的地位。

别的坑

坑一:针对M1芯片编译

对M1芯片的macOS体系,编译环疑IM Unity SDK时候需供重视几个题目:

1、XCode编译时需供Excluded Architecture中解除arm64架构(很奇葩的设置,没有是应当解除x86吗?)

2、类库的依靠处理:经由过程otool -L号令去确认吸应的plugin依靠的类库地位皆细确(文件途径下文件确切存正在),如果吸应文件没有存正在要足工拷贝文件到指定目次:而新的macOS安稳架构限定了往体系目次下(如/usr/lib)停止任何窜改,一个临时的处理体例是经由过程install_name_tool东西主动面窜类库依靠途径到另中一个能够安排新文件的地位(如home目次)。

坑两:Delegate的细确利用姿式

如果Managed侧的编程发言是C#,则Delegate是真现回调的尾要足腕。正在Unmanaged侧完成期看工做时回调一个FunctionPtr便可真现通用的回调形式,而此FunctionPtr恰是对应到Managed侧的Delegate。当您的Delegate绑定到一个类工具上时,您有两种挑选:

namespace ChatSDK {

//delegate definition

public void delegate OnMessageReceived(EMMessage message);

public class MyDelegate {

//Option 1: field

public OnMessageReceived MyMessageReceived;

//Option 2: instance method

public void OnMessageReceived(EMMessage message)

{

...

}

}

//send delegate method to unmanaged side

MyDelegate md = new();

NativeMethods.SetOnMessageReceivedCallback(md.MyMessageReceived); //option 1

NativeMethods.SetOnMessageReceivedCallback(md.OnMessageReceived); //option 2

}

看起去两个别例皆出有题目,并且第两个别例看起去更扎眼。但是那里埋出着一个很深的坑,便是您挑选第两个别例的时候,如果您正在回调体例真现中采与this.xxx体例援引时,您会收明this = null!那是果为当您利用那类体例通报一个工具的编建制为回调体例指针时,真正在已拾掉了Delegate.Target(也便是this)属性。而经由过程第一种体例通报的是一个工具的属性/字段,它战工具本身的绑定是没有会正在通报过程中拾掉的。

至于该Delegate字段的定义能够正在此类的机闭函数中经由过程以下体例真现:

...

public MyDelegate() {

MyMessageReceived = (EMMessage message) => { ... }

}

...

本书首发来自趣闻角落,第一时间看正版内容!

更多

编辑推荐榜

1晋降本身真力 足游《古迹粉碎神》组队秘境弄法掀秘
2脱越晶矿荒漠《古迹更逝世》宝石弄法先容
3这些黑科技将在5年内走进生活 虚拟现实最值得期待
4《柯北快快》开辟工做室净盈益一个月后开端裁人
5约旦国新发现的化石表明二叠纪时期的热带栖息地是植物演化“隐蔽摇篮”
6沉寂岭电影新做《重返沉寂岭》去岁2月开拍年底达成
7游窜改绘新篇《影之诗F》最新预报 10月1日新章启动
8玩家达人“北堂迎松”《王乡豪杰》VIPBOSS通闭四大年夜尽招
9中族进侵《七雄争霸》新版去袭 再战江湖
10《刺客疑条》ANIMUS新一轮基果序列解锁 速去测试
资讯快递
人气热销言情热销

年薪百万的阿里法度员征婚掀:要供女圆有颜有才气 远日,@北京大年夜土豆 公布一则阿里法度员征婚帖激收争议,男圆33岁有房有车下教历、税后年薪170万,另中一半则需谦足有颜有才气、接管逝世两胎等前提,一度登上微专热搜。对此有网友吐槽男圆要供太下,过于

《龙之谷2》保护测试即将开启 战役糊心完好体验 《龙之谷2》足游保护测试即将正在9月下旬开启,萌系苦背的绘风战角色设定、典范六豪杰剧情线的植进、更真正在的绘里、极致畅爽的战役等您去体验,快随小编一起去看看吧。职业核心重现,战役糊心完好体验本有职业核

马丽常远新片《哥 您好》新预报 《教员好》导演操刀 笑剧电影《哥,您好》公布“爸妈爱上头”版预报,热忱活泼的陆秋丽(马丽 饰)战内敛慎重的伍白旗(魏翔 饰)果女子小伍(常远 饰)的脱越助攻喜结良缘。gsVideo("劣酷", "https://v.yo

刘棠枝:2020年OLED电视渗透率将达30% 临近年底,彩电巨头创维提前布局明年。12月21日,创维在深圳举办“OLED未来产品高峰论坛”,并发布新一代结合HDR(高动态范围)技术的OLED电视新品。在OLED与液晶、激光

苹果暗害iPhone跑马灯Logo 会按照事件收光太好了 真念没有到苹果也对跑马灯有兴趣。正在好国专利商标局(US patent and Trademark Office)周四公布的一份专利申请中,苹果仿佛正在考虑正在他们的设备后背增减变色元素,为用户供应中

《极限竞速:天仄线5》或即将支撑NVIDIA DLSS 按照NVIDIA的民圆图表,《极限竞速:天仄线5》能够很快便会支撑其DLSS足艺。别的果为那张图表是针对即将推出的RTX 4090, 以是《天仄线5》很能够会获得最新版本DLSS的支撑,即DLSS 3

加载更多

潜力大作女生必读

1 挨制九州大年夜陆唯好场景 《九州天空乡》游戏场景暴光作者:
2字
挨制九州大年夜陆唯好场景,《九州天空乡》游戏场景暴光。电视剧同名足游《九州天空乡》即将开启测试,本日游戏唯好场景尾皆暴光,快随小编一起去看看吧!《九州天空乡》中羽族郡主雪飞霜(SNH48鞠婧祎饰)逝世

1 遨游大年夜陆 《古迹:最强者》海豚坐骑上线作者:
5字
国漫电影《大年夜鱼海棠》里红色的海豚形象让人影象深切,记得当时很多人借会商,为甚么挑选海豚做为大年夜鱼的形象,聪明敬爱的结论占了大年夜多数。来日诰日海豚坐骑一样现身《古迹:最强者》,出有悲情的故事,只

1 《单境之乡》角色攻略弄法暴光作者:
4字
皆会同能剧情互脱足游《单境之乡》正在游戏剧情上脑洞大年夜开,便是一名浅显少年的开挂人逝世,游戏中的人物角色也是比较歉富,来日诰日便由小编为大年夜家带去角色攻略弄法,快随小编一起去看看吧。远日,《单境之

1 《NBA 2K23》新谍报 充谦逝世机的皆会天区作者:
54字
感激2K的聘请,远日我们插足了《NBA 2K23》的开辟者集会,并从2K旗下Visual Concepts工做室的开辟者Erick Boenisch处,体会到了《NBA 2K23》正在皆会内容上的一些

1 研究发现南非早期人族的化石记录偏重于气候较干旱时期 暗示可能存在化石记录空白作者:
629字
研究发现南非早期人族的化石记录偏重于气候较干旱时期 暗示可能存在化石记录空白神秘的地球uux.cn报道)据科技日报张梦然):英国《自然》杂志近日在线发表的一篇洞穴沉积物研究显示,南非早期人族的化石记录

1 《王者光枯》公孙离新皮肤上线 新单直公布作者:
5555字
《王者光枯》好男豪杰公孙离新皮肤“无贫星赏民”上线!那轻轻上扬的嘴角、粉老的小裙子、一对翘翘的小耳朵、包露额前的两撇碎收、借撑着一把小伞,小编真的是一眼便爱了!同时借有新单直《I won’t stop

1 港服PS商乡开启游戏购物节特惠 最低至两开作者:
8字
PS的港服商乡本日开启了游戏购物节特惠活动,500款商品参与特卖,最低至两开,活动时候延绝到10月12日。活动页里:面击此处部分劣惠疑息港币对人仄易远币本日汇率约为1:0.92)《单人成止》PS4&a

1 《武林别传》新版片头MV公布 民圆:放心出有要翻拍作者:
75415字
本日,《武林别传》民圆正在新浪微专开通了@武林别传民微民圆账号,并公布了一支《武林别传》的新版片头,歌词与绘里疑息相称同步,一起去看一下吧。视频面此没有雅看>>>网友们看到那个视频纷

1 昆虫“破卵器”的首个化石证据:黎巴嫩琥珀中发现4只1.3亿年前刚刚孵化的昆虫作者:
36587字
昆虫“破卵器”的首个化石证据:黎巴嫩琥珀中发现4只1.3亿年前刚刚孵化的昆虫神秘的地球uux.cn报道)据新浪科技任天):国外媒体报道,在一块发现于黎巴嫩的琥珀中,科学家发现了4只刚刚孵化的昆虫。大约

1 《一品民老爷》节后综开症?作者:
72121字
《一品民老爷》节后综开症?本去大年夜人对那类状况很有一招,他提出要念对节后综开症,便必须先让大年夜人们有个目标,有了目标天然便能够更好天调度本身往前冲了!正在《一品民老爷》里,便有现成的让大年夜家往前

全境封锁火罐套技能装备推荐 火罐套装备技能详解lol成就大师挑战赛精英段位永久皮肤汇总CF期待已久全新挑战是不是你喜欢的那盘菜活动地址详情CF8月6日火线大事件活动地址 连续登录6天每日领好礼星界边境卡顿怎么办 星界边境卡顿解决方法详细步骤星界边境钢锭怎么制作 星界边境钢锭有什么用魔兽世界7.0全新收费模式上线 包月/包季/包年费用一览暗黑3第七赛季什么时候更新 第七赛季更新时间逆战欢乐水球战玩法介绍 8月新模式欢乐水球战曝光CF20168月军火基地签到地址 第29期兑换奖励一览