0

作为一个爱好项目,我正在使用Android 中的自定义游戏引擎构建2D游戏。目前我可以渲染一个 json 地图,并让用户与地图上的对象进行交互。游戏应该是一个开放的世界地图,有多个地图。我目前的一张地图有一个 150 x 150 的平铺图案,每个平铺上都有一个或多个对象。因此,该地图具有22.500、多个图层和更多属性。玩家可以编辑对象(如水中的鱼、土壤中的种子等),因此每个对象都需要单独存储。有些对象,比如正在生长的植物,需要随着时间的推移而更新,即使玩家没有玩游戏。

我的问题是关于有效地保存和加载游戏状态。我想我需要存储地图的所有属性,以及对象、玩家进度、npc 进度等。由于这是移动设备的大量数据,因此我想不出将其存储在手机(或云中)的好方法。

我尝试了以下方法: - 将整个游戏状态存储在序列化文件中。这个文件的解析在加载过程中花费了很长时间,当一个对象的状态发生变化时,整个游戏都必须被加载。- 将每个对象存储在sqlite 数据库中,每个属性都有一个。这甚至比第一个选项慢,所以也不是一个选项。- 将序列化为blob的每个对象存储在数据库中。这个选项并不比前一个快多少。

我一直在查看ObjectBox,但是为了为这个数据库创建实体值,我需要将很多参考值更改为 ToOne<> 或 ToMany<> 对象,这将花费很多时间,因为我是使用地图属性来渲染地图,对象的包装和展开会导致(不必要的)延迟。(这是一个假设)

如何保存游戏状态而不造成 20 分钟的加载延迟?

4

2 回答 2

1

首先它真的取决于你的自定义游戏引擎,看看如何加载或初始化游戏场景。正如您所提到的,您有太多数据需要保存和恢复,因此请避免使用数据库方法,因为通常它们对于此目的效率不高。

如果您想要一个快速的解决方案,二进制方法会更好。尝试将您的游戏数据以二进制块的形式保存在 android 数据文件夹或资产中,然后以初始化状态读取并加载它们,而不会阻塞其他进程(可能您需要单独加载资产线程)。

您需要游戏保存数据结构并修改您的自定义游戏引擎以逐步加载它们。为了更好的性能检查延迟加载技术。

我猜序列化没有工作,因为它试图一步反序列化和恢复所有内容。看看你能分解你的数据或图层吗?

于 2018-07-20T07:44:37.453 回答
0

我并没有完全意识到你是如何使用你的游戏引擎和数据库的。但只是想注意,只要您使用的是 android,您就可以使用 SharedPreferences 来保持状态。至少对于您的一些数据。

于 2018-07-19T12:02:04.547 回答