为什么 Unity 如此的慢? 您所在的位置:网站首页 unity调用python代码很慢很慢 为什么 Unity 如此的慢?

为什么 Unity 如此的慢?

2024-07-13 05:57| 来源: 网络整理| 查看: 265

Hello 小伙伴们大家好,这里是GameStartStudio。最近将几个老项目升级到新版本,我承认新版本是真的香,但是这个读条真的让我头大。如果你使用Unity有段时间了,那么你对这个进度条肯定不会觉得陌生。

为什么会频繁的读条,有什么猫腻?

1.为了搞清楚这点,我这里使用Unity2021LTS版本新建个项目。

2.这个时候Unity会自动打开我们刚创建的项目,我们直接去资源管理器里面查看一下Unity都为我们创建了哪些文件。

这个时候,我们重点关注一下Library文件夹,俗称的库文件。

3.打开Library文件夹,我们可以看到一个名为脚本程序集的文件夹ScriptAssemblies,这里是存放我们代码、程序集的地方。映入眼帘的是一堆dll和pdb文件:

这个时候你可能会有疑问了,我一个空的项目会什么会有这么多程序集?

想要搞明白这点,我们需要先了解一下Unity包中的清单,也叫项目清单。

项目清单

这是官方对项目清单的解释:Unity 加载项目时,Unity Package Manager 会读取项目清单,以便计算要获取并加载的包的列表。

猜想1:这个会不会是导致Unity变慢的原因呢?我们该如何验证这点呢?

打开manifest.json文件,映入我们眼帘的是一堆依赖项。如果我们将所有的依赖项全部删除会发生呢?

下面是删除之后的样子:

回到Unity,首先Unity会删除上文中提到的ScriptAssemblies文件夹,然后重新编译整个项目。这个时候我们再打开ScriptAssemblies查看一下文件夹的内容,你会发现,所有的dll和pdb文件都消失了,变成了一个空文件夹。

这个时候,我们不仅验证了我们的猜想1,还得出一个结论:没有依赖项,就没有程序集。单有这点我觉得还不够,接下来我们继续!

再次回到Unity,我们创建个HelloWorld脚本。这个时候Unity会自动为我们创建个Assembly-CSharp.dll。

查看一下ScriptAssemblies文件夹的变化,里面多了Assembly-CSharp.dll和Assembly-CSharp.pdb两个文件。这就说明我们新建的HelloWorld脚本已经被Unity构建和编译,这就是弹出进度条的原因。

如果你觉得不可置信。那么我们可以将Assembly-CSharp.dll拖入dnSpy或者dotPeek中反编译查看一下里面的内容:

是不是觉得很酷?这不就是我们刚才新建的HelloWorld吗?这也就说明Assembly-CSharp.dll由HelloWorld.cs编译而成。

接下来删除HelloWorld.cs,伴随着读条结束,ScriptAssemblies文件夹会被再次清空。

构建属于自己的程序集

如果我们构建属于我们自己的程序集,而不是让Unity自动为我们生成Assembly-CSharp.dll,会大大提升编译速度和减少读条时间吗?

为了验证这点,我们新建Scripts -> My Assembly -> My Code.asmdef程序集,这个时候ScriptAssemblies文件夹还不会发生任何变化,因为这是个空的程序集,内部没有任何代码。我们只需要在My Code.asmdef同层级下创建个名为MyCode.cs的脚本即可

这个时候打开ScriptAssemblies文件夹我们会神奇的发现,这里出现的是我们自己的程序集,而不是Unity自动为我们生成Assembly-CSharp.dll。OHHHHHHHHHHHH....

猜想2:如果asmdef脚本没做任何变动,Unity会默认会跳过编译这部分代码吗?

我们可以再次验证一番,反正验证又不收钱。HAHAH~

我们在My Assembly文件夹同级目录再次创建HelloWorld.cs。注意创建位置,不要创建到My Assembly文件夹内部,那样就归属于My Code.asmdef的管辖范围了。后面有机会再和大家仔细的聊聊 asmdef,这里留个坑。如下图:

这个时候打开ScriptAssemblies文件夹我们会神奇的发现,Unity自动为我们生成了船新的Assembly-CSharp.dll,留意一下后面的修改日期。而MyCode.dll的修改日期是没有发生任何变化的,也就验证了猜想2Unity为我们跳过编译这部分代码结论是正确的。

那么我们把一些不常修改的代码,如底层框架和一些通用的拓展方法写到属于我们自己的程序集里面,那编译时间不久大大的减少了吗?你学废了吗?

总结

优化依赖项会大大提升我们的编译速度。

构建属于我们自己的程序集,而不是让Unity自动为我们生成Assembly-CSharp.dll也会大大提升编译速度和减少读条时间。

如果你想更深入的学习如何优雅的开始新项目,请关注我,留意我后面的技术贴。好的,今天的分享到此先结束啦,各位看官老爷们再见,如果可以随手给我点个赞呗~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有