我想我滥用了 Ressources.load

I think I abuse of Ressources.load

好的,所以我对 Ressources.Load. I actually use it quite a lot and everyone seems to see this feature as pure evilness. In this documentation, it's even written "Don't use it". I searched a lot about this and found this post 有点困惑。它主要说只对稀有资产使用 Ressources.Load,否则,性能 could/will 会受到伤害。

我明白为什么这可能是一个 "bad" 使用的东西,但老实说,我不知道在我的情况下如何不使用它。

假设我有一款游戏有大约 10 个不同的种族,每个种族有几个单位。用户选择它的比赛并开始游戏。在这一点上,对我来说似乎很正常 Ressource.Load 只有与这个特定种族相关的资产,而不是其他的...

此外,假设您有一个战斗场景,其中有许多可能的环境(即:冬天、森林、沙漠等)。同样,除了我正在战斗的那个,我不想加载任何其他东西。所以使用 Ressources.Load 似乎是完美的工具。不?我是不是遗漏了一些关于 Unity 的重要信息?

非常感谢

Unity 确实会加载它看到的与场景检查器中的事物相关的所有内容。一旦进入场景,就无法停止 Unity 的加载。 (你可以稍后卸载,但加载它们已经付出了代价)性能受损 在 Unity 的术语中似乎意味着在播放时,因为如果你将它们连接到场景它会加载所有内容从一开始就可以流畅地播放,但是如果你做一个动态负载,你在播放时会有滞后的风险。

Don't use it.

This strong recommendation is made for several reasons:

Use of the Resources folder makes fine-grained memory management more difficult.

这很难,但并非不可能。如果你自己小心,那么你可以获得更低的内存消耗的回报。

Improper use of Resources folders will increase application startup time and the length of builds. As the number of Resources folders increases, management of the Assets within those folders becomes very difficult.

这无济于事,因为抵消场景启动时可以节省的加载时间,增加的启动时间可能是值得的。我认为大多数玩家不会介意启动时间。

The Resources system degrades a project's ability to deliver custom content to specific platforms and eliminates the possibility of incremental content upgrades. AssetBundle Variants are Unity's primary tool for adjusting content on a per-device basis.

然后你只把通用的东西放在 Resources 文件夹里。

一种现代的替代方法是在场景中编写游戏,然后使用 LoadSceneMode.Additive 逐一获取您想要的内容。它适用于像战斗场景这样的大块,但是对于延迟加载一些概念上的小东西(但可能包含像纹理这样的大数据)像角色我仍然会使用 Resources.Load。唯一延迟加载的是 AudioClip,您可以取消选择预加载音频数据。

这里写了详细的加载过程和内存消耗,有兴趣的可以看看。 https://gametorrahod.com/unity-texture-memory-loading-unloading-7054819e4ae8