[Unity workflows] Unity Addressables:你的测验分析

11 篇文章 0 订阅
9 篇文章 0 订阅

英文原文:https://thegamedev.guru/unity-addressables/quiz-analysis/

Hi,Unity Addressables 的粉丝。

  上周,我发布了一篇简短但功能强大的文章,详细介绍了 Unity Addressables 可以帮助您开发更好游戏的三种方式。 这篇文章很受欢迎,感谢您的积极参与。就在那篇文章的结尾,您有机会通过一个小测验来测试您在 Unity Addressables 方面的知识。

  创建测验时我的目标是帮助您了解您可能不太熟悉的领域,这样您就可以在最需要的地方发展您的技能。

  我得承认,一开始,我没想到会有很多人通过测验。 毕竟,测验可能会让人望而生畏,而且像往常一样,我总是喋喋不休。

  但令我惊讶的是,测验结果超出了我的预期。 看到这么多人接受挑战,我真的很高兴。 你们都摇滚!

  我从测验中得到了一些有趣的统计数据。 以下是我想与您分享的一些数字:

  • 大多数发起它的人,大约 80%,实际上有足够的决心完成它
  • 平均分数约为 12,这对于最近才推出的 API 来说已经相当不错了
  • 不到 5% 的测验参与者属于 Troll Guru 等级
  • 大约 50% 的人属于 Apprentice Guru
  • 超过 40% 的参与者得分足以成为开明的大师
  • 但只有 5% 的人认为它是最终 Boss 大师

所以,如果您参与了测验,那么恭喜您!

  独立于你得到的分数,我相信你不需要付出太多努力就可以达到 20+ 的生产级别要求的分数。 我会在路上帮助你。

  在这篇文章中,我将解释测验中最有趣的挑战。 有些答案可能会因您的具体情况而有所不同,因此如果您有补充经验,请务必在帖子末尾发表评论。

  你的结果是什么? 您是巨魔大师、学徒大师、启蒙大师还是最终 Boss 大师? 在评论部分分享您的结果。

  相信你已经完成了,让我们来看看问题和一些答案。 格式应该是不言自明的,但我承认我可以为它选择不那么俗气的图形——是的,就是我。

问题一:内存压力大
问题 2:无限加载时间
问题三:什么播放模式脚本?
问题 4:糟糕……错误诊断
问题五:重视频打包
问题六:实例释放内存
问题 7:使用 LoadAssetAsync 加载
问题 8:迁移到更好的工作流程

问题一:内存压力大

  愤怒的玩家留下了 1 星评价,因为您的游戏使用了太多内存。 你…

公开回答,告诉玩家升级他们的设备然后回来
  不知何故,这是一个流行的答案。 尽管我们很想回答这个问题,但很可能我们太忙(或懒惰)而无法实现合适的架构。 指责玩家玩砖头手机不会让我们获得更多销量,因此更好的策略是解决我们的烂摊子。

切换到更高级的纹理压缩方法,例如 ETC2 转 ASTC
  这很有帮助,您确实应该尽可能切换到更高级的压缩方法。 但是这个解决方案只会带你走这么远。 您将在内存使用和纹理质量方面获得适度的提升,但它们不足以解决您的内存压力问题。

将您的场景拆分为子场景,从而减少内存中加载的内容
  一般来说,子场景曾经是一个很好的解决方案。 我过去使用它们取得了巨大的成功。 然而,如果您已经收到差评,那么对您的游戏架构进行如此巨大的改变很可能为时已晚。 最好去别的地方看看。

通过 AssetReferences 实现资产延迟加载机制
  超过 75% 的人同意这一点,这很好。

  AssetReferences 可能会给您带来最大的收益。 迁移到此工作流通常是直接的,并且比其他替代方案容易得多。

  但是,请注意,在某些情况下,可能很难解决 Unity Addressables API 的异步要求。

让我们继续。

问题 2:无限加载时间

  你按下播放键。 当您的游戏场景加载完毕时,您的咖啡已经凉了。 你…

责怪艺术家并要求他们将每个纹理放入地图集。 此外,您购买了更快的 PC
10% 的订阅者选择了这个。 我爱你们。

全局减小纹理大小,因此资产加载速度更快。 您不在版本控制系统中提交这些元文件更改
我最近做过几次。 有用。
  然而,付出代价很高。 您的版本控制系统可能会发疯,您的更改列表将充满垃圾。 这确实很难管理,因为如果您忽略这些临时纹理导入设置修改,真正的更改大多不会被注意到并且不会被提交。

创建仅包含您正在处理的功能的自定义场景
  为更快的迭代创建子场景可能是您的游戏的可能性,但根据我的经验,它们往往无人维护。 随着时间的推移,它们会损坏,人们可能会花更多的时间来修复它们,而不是你当时最终获得的收益。

  仅当您在项目中没有看到这些问题时,才考虑实施子场景。

删除直接引用并改为添加间接引用,因此仅加载所需的资产
  获胜者的间接引用。

  一旦包含它们的脚本被实例化,直接引用将隐式要求 Unity 加载它们的所有内容。 然而,间接引用使您可以完全控制时间/方式/内容。 这意味着,您可以延迟加载直到您需要它(如果有的话),从而避免不必要的加载时间和内存浪费。

在这里插入图片描述

问题三:什么播放模式脚本?

  您目前正在为您的新角色制作材料。 你想尝试 Addressables,所以在 Addressables 的 Play Mode 脚本部分,你选择…

快速模式:毕竟我们希望它总是很快
  这是一个有效的选项,但快速模式不会对开发的所有重要方面进行验证,例如资产依赖性和交叉引用。

  如果你正在处理的内容没有实质性的变化,那么快速模式就可以了。 否则,我们可以做得更好。

打包播放模式:是的! 我们希望我们的角色被打包

  不! 打包播放模式要求您在每次更改可寻址资产内容时打包资产,否则您最终将加载旧版本。

  你不想每次都打包,这是一个巨大的时间成本。

  但是,一旦您处理完可寻址内容以获得更快的迭代,您可能会考虑打包播放模式,因为这些资产在加载时需要最少的处理。

  35% 的大师挑战者选择了这个答案。

虚拟模式:听起来比快速模式更安全

  虚拟模式是我建议您在积极处理可寻址内容时使用的选项。

  虚拟模式足够快,可以缩短迭代时间,同时,它会为您提供有用的验证检查,以避免搞砸它并为时已晚发现混乱。

在这里插入图片描述

问题 4:糟糕……错误诊断

  您尝试使用 Addressables,但您不记得您的资产在您的 Android 设备中看起来是粉红色的。 多么奇怪! 你…

启用 ADDRESSABLES_LOG_ALL 符号,进行开发构建并检查 logcat 日志

  如果你带着这样的描述来找我,我不一定会直接带你走这条路。

  添加脚本定义和检查设备上的日志的主要问题是准备这样的构建、部署它、测试它以及从日志中收集有用信息所花费的时间。

  确实有更好的方法来解决这个问题,但如果他们无法为您提供准确的问题诊断,请务必将其作为备用选项。

将播放模式脚本设置为 Packed Play Mode 并在编辑器中运行它以使用 Addressable Profiler 进一步诊断问题

  尽可能多地模拟显示内容的环境是我的首选,因为它花费的总时间最少。 您可以通过在主 Addressables 窗口设置中选择打包播放模式来执行此操作。 Unity 编辑器将直接从构建的内容加载可寻址资源,因此只要编辑器可以加载此类内容,预计这会为您提供与设备上类似的行为。

  您还可以尝试在虚拟播放模式下运行它,这会在可寻址的传统资产加载管道之上进行一些验证。

  不要忘记依靠 Addressable Profiler 的帮助,该工具会通知您游戏中随时发生的可寻址操作。

  66% 的参与者正确选择了这个答案。

在 StackOverflow 和 Unity Answers 上发布
  12% 的人认为在这些平台上发布问题很有价值,因为总有人愿意提供帮助。 但是准备复制项目、使用 F5 发布和刷新屏幕可能比您自己诊断和修复问题花费的时间要长得多。 相信我,这应该是你最后的选择。

问题五:视频打包

您希望您的 mp4 预告片视频包含在您的游戏中。 你…

丢进StreamingAssets文件夹
  StreamingAssets 目录工作得很好,尤其是与您在商店中找到的著名视频插件结合使用时。 存储在该目录中的资产不像资源那样打包在一起,而是在安装游戏时作为单独的文件保留。 它的简单性和容易的 I/O 是它成为播放视频的默认方法的原因。

  最大的缺点是存储在 StreamingAssets 中的资产从一开始就被强制打包到您的分布式游戏中,因此它们可能会在您的构建中占用大量空间。

  为什么您的用户需要多等 5 分钟才能下载将在 30 多个小时的游戏结束时播放的演职员表视频?

将其标记为可寻址,为其添加“视频”标签

  当然,让它可寻址听起来很酷。 但是给它添加一个“视频”标签?

  通常,标签用于一次下载属于该标签类别的所有资产。 除非您有非常具体的用例,否则这样做不太可能对您的项目有帮助。

将其标记为可寻址,将其添加到具有以下属性的“视频”组中:静态内容,无压缩

  视频不太可能改变,因此将它们设为静态是有道理的。 此外,无需压缩它们,因为使用的视频编解码器应该已经为您提供了压缩功能。 在此已压缩的内容之上添加 LZ4 或 LZMA 压缩只会产生 CPU 开销。 您用户的电池也会消耗得更快。 我相信您的玩家不会喜欢它。

将其标记为可寻址,将其添加到具有以下属性的“视频”组:动态内容、LZMA 压缩

  动态、压缩的内容是迄今为止最常选择的答案。 但这是一种误导。

  由于上述原因,您应该避免对已经压缩的内容使用压缩。 而且视频通常非常静态,因此通过将该组标记为动态,您不会帮助您的资产构建工作流程。

  大多数人 (46%) 认为这是最佳选择。

问题六:实例释放内存

  您通过 LoadAssetAsync 加载了一次资产。 现在你已经完成了,所以你…

调用Addressables.Release,使其内存立即释放
  正如当前文档正确指出的那样,不能保证会立即释放内存。 不过不用太担心,它会被 Unity 正确释放。 23% 受欢迎。

调用 Destroy,我们最好确保释放内存
  Addressables 目前还不知道传统的 Unity 实例化和销毁机制。 如果您自己这样做,您将自行承担风险和簿记。 如果你把它搞砸了,API 和操作系统不太可能对此感到满意。 你会知道的。

调用 Addressables.Release,以便在未来某个时间释放内存
  文档暗示可寻址资产占用的内存将在调用 Unity 可寻址释放方法后的某个时间点释放。

 您可以依靠 Unity 智能地决定何时这样做(例如内存不足的情况、Resources.UnloadAllUnusedAssets 等)。 你们猜对了!

问题 7:使用 LoadAssetAsync 加载

  您对执行您的第一个 Addressables.LoadAssetAsync 感到兴奋。 所以你调用它并使用它返回的句柄,比如……

while (handle.Status == AsyncOperationStatus.Succeeded) ;

  我向你承认,我已经尝试过这种方法来尝试从 Addressables API 中强制执行同步行为(例如,Unity Addressables 下的 Photon Networking)。

  但是你可以在看到答案的笑脸后猜到发生了什么。 我电脑的风扇开始疯狂旋转,我不得不重新启动电脑,因为操作系统变得完全没有响应。 我不会很快再尝试这个,谢谢。

  执行此循环很可能会导致死锁,因为加载过程的一部分是在 Unity 的主线程中执行的。 这行代码是阻塞主线程的最简单方法。

await handle.Task; yield return handle;

  这两种解决方案是在继续我们的代码之前等待加载过程完成的异步方式。 这对你我来说都是很棒的东西,因为它们提供了很好的可读性并且易于维护。

  但是,请注意它们会带来一些性能损失。

handle.Completed += OnLoadCompleted;

  这是在资产加载到内存中后执行某些操作的最简单但最强大的选项。

  不过请记住,您正在引入 lambda 和/或回调。 它们会降低代码的可读性,从而使您的编程风格更加危险。 当然,除非你是专业人士。

问题 8:迁移到更好的工作流程

  你有一堆天空盒作为材料列表直接引用在你的天空盒管理器中。 那些正在吞噬你所有的记忆,所以你……

将它们移动到 Resources 文件夹中并开始使用 Resources.Load,因为你需要它们

不!

  永远不要将 Resources 目录用于重资产。 它们是大型项目中痛苦、眼泪和倦怠的主要原因。 滥用Resources API 确实非常容易。 在此处阅读有关为何如此的更多信息

将所有天空盒放入您将适当加载的资产包中

  资产包是当时急需的解决方案。 但是我们现在有了 Unity Addressables 更好的解决方案。

  问题在于,与仅使用 Unity Addressables 相比,使用资产包在实施和维护方面更加繁琐且成本更高。 除非你正在做一个端口并且你不想接触很多原始系统,否则尽量避免它们。

用 AssetReference 列表替换天空盒材质列表,并根据需要加载它们

  使用 Unity Addressables 可能是解决此类内存问题的最佳选择。

  它成为如此灵丹妙药的原因之一是因为您可以轻松地从最流行的内容管理方法迁移,例如直接引用、资源 API、附加场景和资产包。

  Unity Addressables 是开发更高效游戏的更简单方法。

减小天空盒纹理大小

  调整纹理导入设置可以达到一定程度。 这有一个上限,因为如果不将 3d 游戏重新分类为像素艺术,您就无法无限降低内存使用量(和质量)。 这只是不能很好地扩展。


您很可能没有达到最终 Boss 大师的等级。

  但这很好,因为这意味着有很大的空间可以改进和优化您开发和发布游戏的方式。 更重要的是,您的玩家会欣赏您在这些领域中积累的专业知识。 您唯一想阅读 1 星评论的地方是竞争对手游戏的应用商店。

  鉴于为您的玩家提供愉快体验的重要性,我将与您分享一些内容。

  你我之间:我有一个正在进行的计划,可以通过 Addressables 最大限度地发挥您的游戏潜力。 在接下来的几周内,我将向您透露有关我正在开发的 Unity Addressables 升级程序的更多信息。 该计划将使您达到交付人们将非常喜欢(购买和)玩的游戏所需的生产水平。

  为确保您不会错过即将发布的内容,请立即订阅时事通讯。 我会及时向大家发布。

  到那时,请在下方评论您最想了解的内容以及您计划如何在您的项目中使用 Unity Addressables。

  再见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值