gpt4 book ai didi

c# - Unity Resource.Load 管理

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:52 27 4
gpt4 key购买 nike

通过研究,我一直不清楚 Unity 的 Resources.Load 函数背后是什么。

我很好奇 Resources.Load("file") 是否以某种方式存储已经加载的对象,或者创建一个管理器来处理已经加载的对象是否是最佳选择?从某种意义上说,无需重新加载已经加载的文件。

在我的例子中,我有大约 50 * 50 个游戏对象,它们都有一个图像,在某些情况下,游戏对象可能使用相同的图像。这些都调用了 Resources.Load,因此我认为它会进行性能优化,而不是重新加载每个文件,而是重复使用加载的文件。

关于以这种方式优化的性能,我可能是错误的。我感谢任何信息和对此的澄清。

最佳答案

Resources.Load 只是一堆东西的语法糖

Unity 在后台做了很多事情,因此作为开发人员,您不必考虑 Unity 实际在做什么。这(很可能)是一件好事。

不过,名义上来说,资源文件夹中的 Assets Resources.Load允许您访问的内容打包并发送到构建项目时导出的 Unity.dll 中(旁注:exe 几乎没有意义,它包含的代码足以从 YourProjectName_Data 文件夹中加载 .dll)。

如何执行此操作可能因对象类型而异。我最近posted an answer一些代码展示了如何在不使用 Resources.Load 的情况下从 dll 中提取 Texture2D (有一个 Resources.Load 调用,但如果开发人员使用代码编译成的 dll,他们可以根据需要覆盖打包的纹理)。不幸的是,这个问题的提问者想要加载不是纹理的东西,而且没有方便的 byte[]GameObject转换纹理的方式。

不过,我不知道Unity是不是就是这样做的。不过,您可以看到它可能 是如何完成的。 Unity 也可能有一些内部辅助函数来将流字节组织到 GameObject 预制件或您尝试请求的任何其他内容中。从我们的角度来看,它们做什么以及如何做都是黑匣子。

我所知道或怀疑的:

  • 无论您在/Assets 目录中的什么位置,所有/Resource 文件夹位置都被合并并视为同一位置。
  • /Resources 文件夹中的所有项目都将包含在 dll 中(文件包含在 _data 文件夹中的 dll 中)
  • 调用 Resources.Load()对于某些 Assets ,确实会缓存该 Assets 。如果您将来再次进行相同的加载调用,Unity 会识别它并可以更快地提交构建的 Assets 。
    • 不清楚是否涉及磁盘 IO 或者它是否是来自 ram 的流字节。
    • 我自己的缓存系统 Resources.Load既不快也不慢于 Resources.Load (使用与不使用我自己的 Dictionary<String,Texture2d> 时差别不大)。
    • 然而,可能存在缓存限制,Unity 可能会卸载场景中一段时间​​未出现的内容,等等。或者它可能从不卸载 Assets ,从而导致可能的内存泄漏类型问题。我还没有测试过这两种方式。
  • 如果场景中有事件的加载资源,底层是什么并不重要Resources.Load确实:您的事件对象无论如何都会占用内存

总而言之,Asset Bundles 清理一切并包括内存管理公共(public)方法,用于卸载您知道您暂时不需要的 Assets ,并且只有实际引用的 bundle 部分需要随时加载到内存中给定的时间。在原型(prototype) Assets 和场景 Assets 之间保持链接,以便不会发生重复(除非开发人员告诉 Assets 包卸载并有意切断链接的情况)。

关于c# - Unity Resource.Load 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54054669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com