4

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

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_287.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

  • 作者:admin
  • 时间:2月23日
  • 浏览:270 次
  • 分类:厚积薄发

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,具体取决于目标平台。

以上摘自Unity官方文档,以便题主理解。

IL2CPP官方文档:https://docs.unity.cn/cn/current/Manual/IL2CPP.html

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/620513ea34a9f84e39fb3fe4


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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6205139034a9f84e39fb3f6b


AssetBundle

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

1.png

A:理论上,当使用LZ4压缩的AssetBundle包加载时只需要加载头文件,不应该需要如此大量的耗时。猜测是使用了LZMA的打包方式导致的。

实验将10张、50张纹理分别用LZMA、LZ4打包,多次测试取中位数,得到AssetBundle加载耗时如下图,基本符合预测。

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

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

2.png
LZMA打包方式

3.png
LZ4打包方式

感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62131191e7172c2775f36769


Shader

Q:如何在发布APK的时候,利用代码自动剔除掉Shader中某一些Pass?希望这些Pass在Editor环境下可以使用,而在APK包中关闭,这样可以减少变体构建时间。

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

感谢题主墙外行人@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/620a4af334a9f84e39023111

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK