乐趣区

关于build:Unity将核心脚本打成DLL是否有性能影响

1)Unity 将外围脚本打成 DLL 是否有性能影响
​2)预制物嵌套导致 AssetBundleName 批改后对母预制物失落援用
3)真人真机测试报告中 AB.LoadFromFile 耗时较高
4)如何剔除掉 Shader 中某一个 Pass


这是第 287 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Build

Q:Unity 将外围脚本打成 DLL,比方将某块外围零碎打成 DLL 后,运行时调用 DLL 是否有性能影响?

A1:没有影响,Unity 默认就是会帮你将 C# 代码给生成 DLL。如果打包到 Android 或者 iOS,当初都会再将 DLL 用 IL2CPP 转成 CPP 代码。

感激 liu@UWA 问答社区提供了答复

A2:当初 Unity 各平台根本都是用 IL2CPP,应用 IL2CPP 开始构建时,Unity 会主动执行以下步骤:

  1. 将 Unity Scripting API 代码编译为惯例 .NET DLL(托管程序集)。
  2. 利用托管字节码剥离。此步骤可显著减小构建的游戏大小。
  3. 将所有托管程序集转换为规范 C ++ 代码。
  4. 应用本机平台编译器编译生成的 C ++ 代码和 IL2CPP 的运行时局部。
  5. 将代码链接到可执行文件或 DLL,具体取决于指标平台。<br/>

以上摘自 Unity 官网文档,以便题主了解。<br/>
IL2CPP 官网文档:https://docs.unity.cn/cn/curr…

感激郑骁 @UWA 问答社区提供了答复

AssetBundle

Q:Unity 2020.3.16 预制物嵌套时,子预制物援用的图片 AssetBundleName 批改后,母预制物会失落援用。

举例来说,预制物 A 中有个预制物 B,而后预制物 B 上的 RawImage 援用图片 C。ABC 三个打到不同 AssetBundle 中。

首次打包,加载全副 AssetBundle,实例化 A,A 显示失常。

批改图片 C 包名,再次打包,A 所在包不会有变动。然而加载全副 AssetBundle,实例化 A,A 会失落 C 的援用。

反编译 AssetBundle 会发现,理论预制物 A 所在资源包数据中有图片 C 的援用数据,然而因为二次打包 A 包无变动,就没有更新 C 所在包的数据。

这个问题降级 Unity 是否能够解决?或者在以后版本是否能够避开?

反编译 AssetBundle 会发现 A 所在 Bundle 会间接以 External References 模式关联到图片 C 的地址,并且 AssetBundle 也会依赖到图片 C 所在 Bundle(然而不依赖到嵌套 Prefab B 所在 Bundle)。

Prefab B 从新关联图片 D 再打包,A 援用会失常刷新。然而仅仅批改图片 C 的 BundleName 再打包,不会触发 A 从新打包。

AssetBundle 的 Manifest 显示的 A 和 B 依赖关系是不正确的,显示还是 A 依赖 B,B 依赖 C,和理论解包进去的不一样。

当初曾经用追踪 Prefab 嵌套树,外加资源 BundleName 监督的流程临时解决了打包问题。然而还是心愿能取得更标准的解决方案。

A:Unity Prefab 嵌套目前只解决了 Editor 局部,打包 AssetBundle 时,会将 Subprefab 的序列化文件局部 copy 一份到 Rootprefab,其实就等于 AssetBundle 环境下,嵌套 Prefab 不失效。

感激郑骁 @UWA 问答社区提供了答复

AssetBundle

Q:如下图所示,在报告中常留神到资源管理模块中 AB.LoadFromFile 单次调用耗时较高(几十甚至几百毫秒),且不同 AssetBundle 包加载耗时差距较大,请问是什么起因导致的?

A:实践上,当应用 LZ4 压缩的 AssetBundle 包加载时只须要加载头文件,不应该须要如此大量的耗时。猜想是应用了 LZMA 的打包形式导致的。

试验将 10 张、50 张纹理别离用 LZMA、LZ4 打包,屡次测试取中位数,失去 AssetBundle 加载耗时如下图,根本合乎预测。

其中,LZMA 加载 AssetBundle 须要同时进行解压,耗时与 AssetBundle 中资源大小相干(如图 1,正好成 5 倍关系);所以会产生报告中不同 AssetBundle 包加载耗时差距较大的景象。

而 LZ4 加载仅需加载头文件,耗时极低。

LZMA 打包形式


LZ4 打包形式

感激 Faust@UWA 问答社区提供了答复

Shader

Q:如何在公布 APK 的时候,利用代码主动剔除掉 Shader 中某一些 Pass?心愿这些 Pass 在 Editor 环境下能够应用,而在 APK 包中敞开,这样能够缩小变体构建工夫。

A:通过 ShaderSnippetData 提供的 PassName 匹配想要剔除的 PassName 就能够了。

感激题主墙外行人 @UWA 问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)

退出移动版