C# 统一资源。负载管理
从周围的研究来看,我不清楚Unity的Resources.Load函数背后是什么 我很好奇Resources.Load(“文件”)是否以某种方式存储了已加载的对象,或者创建一个管理器来处理已加载的对象是否是最佳选择? 从某种意义上说,我们不需要重新加载已经加载的文件 在我的例子中,大约50*50个游戏对象都有一个图像,在某些场景中,游戏对象可能使用相同的图像。所有这些调用都是Resources.Load,因此我认为它的性能会得到优化,不会重新加载每个文件,而是重用加载的文件 这种优化性能的方法可能是错误的。我非常感谢您提供的任何信息和澄清。Resources.Load只是一堆东西的语法糖 Unity在后台做了很多事情,所以作为开发人员,您不必考虑Unity实际上在做什么。这(很可能)是件好事 不过,名义上讲,Resources文件夹中C# 统一资源。负载管理,c#,unity3d,C#,Unity3d,从周围的研究来看,我不清楚Unity的Resources.Load函数背后是什么 我很好奇Resources.Load(“文件”)是否以某种方式存储了已加载的对象,或者创建一个管理器来处理已加载的对象是否是最佳选择? 从某种意义上说,我们不需要重新加载已经加载的文件 在我的例子中,大约50*50个游戏对象都有一个图像,在某些场景中,游戏对象可能使用相同的图像。所有这些调用都是Resources.Load,因此我认为它的性能会得到优化,不会重新加载每个文件,而是重用加载的文件 这种优化性能的方法可
Resources.Load
允许您访问的资源是打包在Unity.dll中的,该文件在您构建项目时导出(旁注:exe几乎没有意义,它包含的代码刚好足以从YourProjectName\u数据文件夹中加载.dll)
它如何做到这一点可能因对象类型而异。我最近使用了一些代码,展示了如何在不使用Resources.Load
的情况下从dll中提取Texture2D(有一个Resources.Load
调用,但这使得使用代码编译成的dll的开发人员可以根据需要覆盖打包的纹理)。不幸的是,这个问题的提问者想要加载非纹理的东西,并且没有像纹理那样方便的byte[]
到GameObject
转换器
然而,我不知道Unity是否就是这样做的。不过,你可以看看如何做到这一点。Unity还可能具有一些内部帮助函数,用于将流式字节组织到GameObject预置中,或者您试图请求的任何其他内容中。从我们的角度来看,它们做什么以及如何做都是黑匣子
我所知道或怀疑的:
- 所有/Resource文件夹位置都被合并并视为同一位置,而不管它们在/Assets目录中的位置如何
- /Resources文件夹中的所有项目都将包含在dll中(文件包含在_data文件夹中的dll中)
- 为某些资产调用
,会缓存该资产。如果将来再次进行相同的加载调用,Unity会识别它,并且可以更快地交付构建的资产。Resources.Load()
- 不清楚是否涉及磁盘IO或是否从ram中传输字节
- 我自己的
既不快也不慢于资源缓存系统。Load
(使用和不使用我自己的资源。Load
字典时差别不大)
- 但是,可能存在缓存限制,Unity可能会卸载一些已经有一段时间没有出现在场景中的内容,等等。或者它可能从未卸载资产,从而导致可能的内存泄漏类型问题。两种方法我都没试过
- 如果场景中有一个已加载的资源处于活动状态,则底层
的作用是:活动对象仍将占用内存资源的作用无关紧要。Load
综上所述,资产捆绑包清理了一切,并包括内存管理公共方法,用于卸载您知道暂时不再需要的资产,并且在任何给定时间只需要将实际引用的捆绑包部分加载到内存中。原型资产和场景内资产之间保持链接,这样就不会发生重复(除非开发人员告诉资产包卸载并故意断开链接)。我的大部分注意力都集中在资源上。Load()您在很大程度上谈到了这一点,我感谢您的分享:)谢谢。