游戏资产加载策略以实现流畅的用户体验

时间:2019-04-21 06:44:00

标签: ios memory assets 2d-games

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

对我来说,目前的瓶颈之一是包含许多图像的屏幕(不是可滚动的视图,而是包含许多位图的屏幕)。

在某些上一代设备上,您可以清楚地看到一些需要约0.2s至.4s出现在屏幕上的图像。我认为这是从光盘加载许多图像的瓶颈。

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

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

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

1 个答案:

答案 0 :(得分:1)

一种策略是,一开始就一次性加载所有资产。如果您只需要花费几秒钟的时间来加载所有内容,以换取从那里开始的快速无缝的游戏体验,那将是您最大的收获。

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

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

要做到这一点,您需要选择点来划分游戏玩法,例如,起点,中间和终点:A,B,C。因此,当您开始游戏时,只会预先加载A的资产,然后在A和B之间的某个位置触发B在后台预载资产。一旦到达B,就删除对A资产的引用,从而释放该内存。

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

但是,从懒惰的角度来看,一旦您接触到它,我就会越过那座桥,因为我会说,一个拥有次佳资产预加载机制的好的游戏仍然比一个拥有真正好的游戏的普通游戏要好得多。资产预加载机制。

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

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