Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一资源。负载管理_C#_Unity3d - Fatal编程技术网

C# 统一资源。负载管理

C# 统一资源。负载管理,c#,unity3d,C#,Unity3d,从周围的研究来看,我不清楚Unity的Resources.Load函数背后是什么 我很好奇Resources.Load(“文件”)是否以某种方式存储了已加载的对象,或者创建一个管理器来处理已加载的对象是否是最佳选择? 从某种意义上说,我们不需要重新加载已经加载的文件 在我的例子中,大约50*50个游戏对象都有一个图像,在某些场景中,游戏对象可能使用相同的图像。所有这些调用都是Resources.Load,因此我认为它的性能会得到优化,不会重新加载每个文件,而是重用加载的文件 这种优化性能的方法可

从周围的研究来看,我不清楚Unity的Resources.Load函数背后是什么

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

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

这种优化性能的方法可能是错误的。我非常感谢您提供的任何信息和澄清。

Resources.Load只是一堆东西的语法糖 Unity在后台做了很多事情,所以作为开发人员,您不必考虑Unity实际上在做什么。这(很可能)是件好事

不过,名义上讲,Resources文件夹中
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中)
  • 为某些资产调用
    Resources.Load()
    ,会缓存该资产。如果将来再次进行相同的加载调用,Unity会识别它,并且可以更快地交付构建的资产。
    • 不清楚是否涉及磁盘IO或是否从ram中传输字节
    • 我自己的
      资源缓存系统。Load
      既不快也不慢于
      资源。Load
      (使用和不使用我自己的
      字典时差别不大)
    • 但是,可能存在缓存限制,Unity可能会卸载一些已经有一段时间没有出现在场景中的内容,等等。或者它可能从未卸载资产,从而导致可能的内存泄漏类型问题。两种方法我都没试过
  • 如果场景中有一个已加载的资源处于活动状态,则底层
    资源的作用无关紧要。Load
    的作用是:活动对象仍将占用内存

综上所述,资产捆绑包清理了一切,并包括内存管理公共方法,用于卸载您知道暂时不再需要的资产,并且在任何给定时间只需要将实际引用的捆绑包部分加载到内存中。原型资产和场景内资产之间保持链接,这样就不会发生重复(除非开发人员告诉资产包卸载并故意断开链接)。

我的大部分注意力都集中在资源上。Load()您在很大程度上谈到了这一点,我感谢您的分享:)谢谢。