平滑用户体验的游戏资产加载策略

Game asset loading strategy for smooth ux

我正在开发基于图像/文本的故事游戏。没有使用任何特定的东西,只是很多 ui 依赖背景图像/图像元素的组件。

我现在的瓶颈之一是包含很多图像的屏幕(不是可滚动的视图,只是带有很多位图的屏幕)。

在一些更先进的设备上,您可以清楚地看到一些图像需要大约 0.2 秒到 0.4 秒才能出现在屏幕上。我认为这是从光盘加载许多图像的瓶颈。

我通过将图像预加载到内存中解决了这个问题,现在一切都没有延迟。

我不确定这是否是最佳解决方案,但似乎很多游戏都在做类似的事情(即所有这些游戏加载屏幕)?

因此问题。这是预加载游戏资产的方式还是有更好的方式?

一种策略是在开始时一次性加载所有资产。如果您只需要权衡几秒钟来加载所有内容,在 return 中获得快速无缝的游戏体验,那将是您物有所值的最大收获。

只需关注您应用的内存占用量即可。如果应用程序占用过多内存,系统将在预加载过程中终止您的应用程序。对于 iPhone 6,我记得阈值约为 500MB。不确定这是否是特定于设备的。此外,即使您能够一次预加载所有游戏资产,如果它太接近阈值,用户打开即使是轻量级应用程序的行为也可能导致系统终止您的应用程序以释放内存。因此,当他们切换回您的游戏时,需要再次预加载所有内容。

不过最终,随着您的游戏变得更大并使用更多资产,一次预加载所有内容将不再是一种选择,因为您的应用程序将在该过程的中间终止。

到那个时候,你需要选择点来划分你的游戏玩法,例如,开始、中间和结束:A、B、C。所以当你开始游戏时,只有 A 的资产是预加载,然后在 A 和 B 之间的某个位置触发 B 资产在后台的预加载。到达 B 后,您将删除对 A 资产的引用,从而释放该内存。

这样一来,您的整体内存占用量就会变小,并且您可以减少开始玩游戏的初始加载时间。预加载所有内容的第一个策略实质上是将您的游戏分成一个部分。使用更多分区可以提高效率。

但是考虑到懒惰做事,一旦你到达那座桥,我会过桥,因为我会说一个具有次优资产预加载机制的好游戏仍然比具有非常好的资产预加载机制。

有效的策略取决于游戏的性质,但要点是在需要之前加载您需要的内容。并释放您不再需要的东西的记忆。具有离散关卡的游戏通常最容易执行此操作,因为您可以仅预加载该关卡的资产,然后在该关卡结束时释放该内存并在显示加载屏幕时加载下一个关卡的资产。或者,如果您的游戏是连续的,您可以将其划分为多个阶段,并让每个阶段都保留对其使用的资产的引用。因此,如果 A 和 B 共享一些资产,则删除 A 的资产引用不会释放 B 仍具有引用的资产的内存。如果您的游戏玩法也允许用户向后移动,例如到达 B 后返回 A,那么您不会在到达 B 后释放 A 的所有资产,也许您只释放 A 的前半部分。事情会变得复杂这些移动缓冲区设计也是因为可能所有 A 始终使用相同的资产。

此外,如果您的游戏有很多小资产,将它们全部放入纹理图集并预加载纹理图集而不是所有单个资产应该会更有效(请参阅 SpriteKit 中的 SKTextureAtlas)。