范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

使用PInvoke从Unity高效地与非托管代码对话

  在上一篇关于P/INVOKE的文章中,我们学习了如何从Unity内部调用非托管方法,以及如何跨互操作屏障传递参数和返回值。
  现在让我们开始DllImport在我们的代码库中到处撒播以获得乐趣和利润!对?好…这种做法将违反单一责任原则多平台支持会有很多代码重复这将使任何使用DllImport更难或不可能进行单元测试的类我们还没有真正的策略来安全地管理非托管对象的生命周期——基本上避免内存泄漏。
  那么让我们来看看我们是如何在 Baracoda 的项目中应对这些挑战的!支持多种目标平台
  假设您有一个针对静态库编译的 iOS 代码的现有版本,libios_plugin.a. 因此,让我们添加插件的 Android 版本libandroid_plugin.aar,其中包含内部libandroid_plugin.so.
  然后在尝试执行本机代码时观察它失败:
  E/Unity: DllNotFoundException: __InternalDllImport 和程序集命名
  我们的第一个问题是,在 iOS 上,我们使用的是静态链接库,它要求传递给的名称DllImport是__Internal.
  但是,我们有一个名为 的 Android 版本的动态链接库libandroid_plugin.so,并且该名称需要在DllImport.
  我们可以使用///指令和Unity的平台脚本符号来使用条件编译#if,如#elif或选择#else将基于当前平台编译的属性的版本。#endifUNITY_ANDROIDUNITY_IOS
  万岁,它有效!但是,呃……如果我们需要更多方法,那就太冗长了,而且我们现在只支持 2 个平台。那么我们能做些什么来避免重复这个巨大的块呢?
  好吧,库名称必须是一个常量字符串,所以const string也可以。让我们重构:
  现在声明一个新方法只是坚持LIBNAME下去的问题,而支持另一个平台只是#if所有方法中的一个例子!SRP和DRY,让代码更好
  我们编写的内容适用于单个类,但随着 API 表面变大,我们可能希望将这些本地方法分组为对象——根据单一责任原则——每个对象代表我们想要的不同服务访问。
  但是因为这个LIBNAME变量现在是私有的,所以我们必须在每个类中复制/粘贴指令,这与D on"t R epeat Y ourself原则相矛盾。所以让我们创建另一个类来为我们保存它!
  导入现在看起来像这样:
  不太冗长,易于阅读,易于扩展。现在我们肯定完成了,对吧?非托管代码和单元测试
  那么,你能为最终调用那些非托管方法的特性编写单元测试吗?单元测试是对抗回归的好工具,可以确保你的代码符合你的预期,如果写得好,甚至可以作为可运行的文档。
  因此,它们对于确保和维护我们的软件和游戏的健康至关重要。
  因此,也许您可 以针对实际实现编写测试,因为本机库只是提供一些业务逻辑,但也许您首先拥有它的原因是因为它使您可以访问外部资源?也许没有可用的桌面版本的库,测试甚至无法在编辑器中运行?
  无论如何,这个非托管代码应该被考虑在被测单元之外,但是您仍然需要访问它在真实代码中提供的服务。
  在这种情况下,最好的解决方案通常是将服务的实现与其接口分离。
  现在我们可以为测试实例化一个假的,但仍然将真实的实现用于生产!非托管对象和生命周期管理
  这仍然是一个玩具示例,但是因为我们没有创建非托管对象的实例,而只是在讨论似乎是自由函数或静态方法的东西。
  有时只有一个服务实例可以与之对话是有意义的,有时则不然,您需要能够动态地创建新实例。那么,我们如何从 C# 中与它们交互呢?内部指针
  在 C 或 C++ 中动态创建对象时,程序将分配一些内存,在其中构造对象,并返回指向它的指针。
  等等,别跑!没关系!
  在编组指向 C# 的非托管指针时,运行时可以将其转换为IntPtr. 您可以将其视为非托管对象的不透明句柄,除了将其交还给非托管端外,您不能直接使用它做很多事情。
  所以现在创建 C# 类的新实例也会创建非托管对象的新实例,然后我们可以对其进行方法调用。甜的!
  我们只是忘记了一个细节:我们创建了一个非托管对象,这意味着 GC 不知道如何回收它,甚至默认都不尝试!
  因此,当 C# 类被垃圾回收时,让我们停止泄漏该非托管对象。所有权
  在 C# 中,类发出需要清理步骤的信号的首选方式是实现IDisposable接口。
  决定何时以及从何处调用Dispose()超出了本文的范围,但请注意,出色的Extenject 框架能够自动处理它创建的对象。
  假设有一个函数用于销毁我们的非托管对象,它的 API 如下所示:
  现在实现Dispose()非常简单:
  随着这一变化,我们现在可以很好地管理我们的资源并执行必要的清理工作。
  随着static extern方法数量的增加,类趋于混乱。将它们提取到侧面的静态类中以保持业务逻辑和非托管方法声明分开通常是一个好主意。
  请参阅下面的示例。
  然而,既然我们已经引入了手动资源管理,我们就会冒着尝试引用已被释放的非托管对象的风险,所以让我们让它更安全!自定义手柄
  幸运的是,C# 标准库正是我们所需要的:SafeHandle!它本来是用来保持 Win32 句柄的,但它的 API 和终结保证使它非常适合我们的目的。
  它还具有抽象的额外好处,因此您必须自己继承它,从而启用类型检查,而IntPtr对于编译器来说,任何一个看起来都像其他任何一个。
  从 继承时SafeHandle,需要做 3 件事。告诉内部句柄的无效值是什么,以及通过其构造函数SafeHandle是否是该句柄的唯一所有者实现抽象属性IsInvalid。对于构造函数中给出的无效值,它应该返回 true。为什么没有默认实现令人惊讶……ReleaseHandle()实现当句柄被处理或垃圾收集时调用的抽象方法。显然,它应该释放这个句柄持有的资源。
  因此,这就是SafeHandle我们示例中自定义的样子:
  现在我们只需要在任何地方都替换IntPtr为 with CameraServiceHandle,除了在销毁方法中仍然需要一个IntPtr.
  对于非托管方法声明,将它们提取到自己的静态类中后,它将如下所示:
  我们的 C# 端服务现在在内部使用句柄:
  我们已经做到了!
  我们现在已经从到处添加临时[DllImport] static extern方法(冗长、难以测试且不一定资源安全)转变为专门设计的方法。
  我们有一些小包装;它们封装良好,不会阻止对依赖它们的代码进行测试,易于添加跨平台支持,并且我们现在有系统的方法来保证与非托管对象交互时的资源和类型安全!
  这就是我们在 Baracoda 如何使用 P/Invoke 的导览!
  利用 P/Invoke 使我们能够编写跨平台库并与之交互,从而将我们研发团队在机器学习和计算机视觉方面的内部知识带到我们的 Unity 游戏中!
  我们计划发布更多 Unity 开发者内容,敬请期待!

8。9寸超极本开始发货,玩家光速晒机,没参加的人大呼后悔8。9寸超极本GPDP2Max已开启发货模式,经过上周的第一波发货之后,已经有不少用户收到了机器,让我们来看一下收到机器的人晒机吧。运送GPDP2Max的快递还是很给力的,广东省内买超极本后悔了,原来8寸掌上游戏电脑性能这么强jump大乱斗是近两年新出的大型乱斗游戏,在主机和PC上都可以玩,那么win10系统的GPDWINMax掌机运行起来到底效果如何呢?通过视频中的画面可以看到,玩家是开了帧数实时显示摩根士丹利一直计划向客户提供比特币风险根据周四上午提交给美国证券交易委员会的文件,摩根士丹利将允许某些共同基金通过现金结算的比特币期货和灰度比特币信托间接投资比特币。银行机构基金旗下的12只基金将被允许接触这些比特币相XendFinance将DeFi服务引入非洲市场XendFinance今天推出了一个平台,使整个非洲的信用社和合作社能够为其成员提供DeFi服务。XendFinance首席执行官UgochukwuAronu告诉解密,Xend将其MicroStrategy再斥资1500万美元购买比特币美国软件开发商MicroStrategy,最被看好的非加密公司之一,刚刚又一次花费1500万美元增加了他们的比特币(BTC)。根据首席执行官MichaelSaylor的说法,该公司Uniswap交易量暴增450,达到70亿美元过去24小时,去中心化交易所Uniswap的交易量猛增450。根据Uniswap。info上的统计,总成交量为71。7亿美元,而昨天为16亿美元。之前的日记录是2020年10月26比特币信托关闭,灰度推出ChainlinkBAT信托美国大型加密资产投资公司Grayscale推出了5个新的信托基金,而其最大的比特币(BTC)信托则无法再进行投资。Grayscale家族已经有Chainlink(LINK)基本关注富达欲推出自己的比特币ETF据美国证券交易委员会(SEC)的一份新文件显示,全球最大的金融机构之一富达公司(Fidelity)正在寻求美国证券交易委员会的批准,以推出一只比特币ETF。这个交易所交易基金将允许CoinbaseCEO兼任电子音乐制作人表示NFT即将到来Coinbase首席执行官BrianArmstrong表示,他计划以NFT的形式发布三首歌曲。在Coinbase准备于本月晚些时候上市之际,首席执行官布莱恩阿姆斯特朗有很多事情要做Binance因ampampquot市场波动ampampquot而暂停Coinbase股票代币上市工作就在宣布将提供Coinbase股票的代币化版本进行交易的几个小时后,领先的加密交易所Binance由于市场波动推迟了上市时间。股票代币允许投资者购买股票的零碎部分,而不需要佣金,同莫斯科证券交易所与俄罗斯银行共同成立区块链运营商俄罗斯越来越接近实现其通过开发新的支付系统基础设施,借助区块链技术来突破国际贸易限制欧盟和美国制裁的障碍的梦想。按照RBC的说法,莫斯科证券交易所已经与一些银行和卡支付处理公司合作
何去何从综艺股份?一基本面1芯片持股32。67的神州龙芯,国内领先的芯片公司,正在IPO持股75南京天悦是助听器芯片50。29天一集成是商业密码芯片公司2智能卡深圳毅能达(834713)新三板创新层程序员2022。2。90消息称怒怼高管的腾讯员工已离职,被标为永不录用前段时间,有一则腾讯应届生公司大群怒怼管理层的话题登上热搜,收到大批网友的关注和讨论。据悉,事情起源是1月25日晚间,腾讯企业微信的业绩预亏,远望谷为何连续涨停?2月8日,锂电白酒光伏等赛道股全线大跌,但令人惊奇的是,一向不温不火的远望谷却涨停了。有网友戏称,远远望着谷爱凌所以涨停了?2月9日远望谷再次收获涨停。涨停的背后,远望谷预告202经典kmp算法实现packagecom。zeny。algorithmDescriptionTODOAuthor千楼Version1。0publicclassCodepublicstaticintge关于Node。js之Buffer前言JavaScript语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在Node。js中,定义了一个Buffer类,该类用快递行业结束春节模式恢复正常运营状态春节期间,我市主要快递企业都不打烊,满足了用户春节期间快递邮寄需求,由于春节期间人工运输成本的增加,部分快递价格出现微调。记者从快递企业获悉,随着春节假期的结束,中通圆通申通韵达等苹果和特斯拉供应商台达电子遭勒索攻击360专家提出四点建议应对近日,苹果特斯拉供应商台达电子发布声明称,其受到一起勒索软件攻击。据悉,台达电子1500台服务器和12000台计算机已被攻击者加密,受影响设备占比约20。8,攻击者要求支付赎金15聚精会神办企业心无旁骛谋发展中央网信办等四部门召开促进互联网企业健康持续发展工作座谈会引起热烈反响1月28日下午,中央网信办会同国家发展改革委工业和信息化部市场监管总局召开促进互联网企业健康持续发展工作座谈会,在网信企业中引起热烈反响。近日,中国网信网对部分网信企业负责人进行了速度Mark关于Go语言我想推荐的几个网站学习与进阶源码网址httpsgithub。comgolanggoC语言中文网Go语言入门教程,Golang入门教程(非常详细)Go语言笔记Go语言教程七米的Go语言学习之路Q1mi架构与思维高并发下解决主从延时的一些思路1回顾下MySQL主从复制主从复制,是指建立一个和主数据库完全一样的数据库环境(称为从数据库),并将主库的操作行为进行复制的过程将主数据库的DDL和DML的操作日志同步到从数据库上iQOO9Pro和小米12Pro这两款手机买哪个好呢?文小伊评科技结论个人推荐IQOO9Pro,有突出且具备排他性的特色且在JD上附带的保值换新版真香。IQOO9Pro和小米12Pro是两款定位相当且配置相当的产品,价格都在5000元