java - Android 开放世界游戏状态保存

标签 java android performance save game-engine

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

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

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

我一直在研究ObjectBox,但是为了创建该数据库的实体值,我需要将很多引用值更改为ToOne<>或ToMany<>对象,这将花费大量时间,并且由于我使用 map 属性来渲染 map ,因此对象的包装和展开将导致(不必要的)延迟。 (这是一个假设)

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

最佳答案

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

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

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

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

关于java - Android 开放世界游戏状态保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51418668/

相关文章:

android - 使用抽屉导航处理 fragment 返回堆栈

android - FlatList 或 ListView 上的 [react-native]onPanResponderRelease 不会在 android 中触发

android - 如何在单元测试中接受对话?

performance - SQL Developer 文件打开和导出显示对话框非常慢

java - 签名小程序的问题

java - java调试器中的"Source not found"

javascript - Angular 4 vs React 性能——理论与现实

r - 将索引矩阵与其在 R 中的相应值交换的快速方法

java - 如何将文件上传到我的 Google 应用程序引擎项目而不进行部署?

java - 将文件从 n 个字节复制到缓冲的 n 个字节