作为一个爱好项目,我正在使用自定义游戏引擎在Android中构建 2D 游戏。目前,我可以渲染json地图,并让用户与地图上的对象进行交互。游戏应该是一个开放的世界地图,其中包含多个地图。我当前的一张地图具有150 x 150的平铺模式,在每个平铺上都有一个或多个对象。因此,地图具有 22.500 ,多层和更多属性。播放器可以编辑对象(例如水中的鱼,土壤中的植物种子等),因此每个对象都需要单独存储。有些对象(例如生长中的植物)需要随时间更新,即使玩家没有玩游戏。
我的问题是有效地保存和加载游戏状态。我想我需要存储地图的所有属性,以及对象,播放器进度,npc进度等。由于这是移动设备的大量数据,因此我想不出一种将其存储在手机(或云中)中的好方法。
我尝试了以下方法: -将整个游戏状态存储在序列化文件中。该文件的解析在加载时花费了很长时间,并且当一个对象的状态改变时,必须加载整个游戏。 -将每个对象存储在 sqlite数据库中,对于每个属性,将其存储为列。这甚至比第一个选项要慢,所以也不是第一个选项。 -将每个序列化为 blob 的对象存储在数据库中。此选项并没有比上一个快很多。
我一直在研究 ObjectBox ,但是为了创建此数据库的实体值,我需要将很多引用值更改为ToOne <>或ToMany <>对象,这将花费很多时间,并且由于我使用的是map属性来渲染地图,因此对象的包装和展开会导致(不必要的)延迟。 (这是一个假设)
如何保存游戏状态而不导致20分钟的加载延迟?
答案 0 :(得分:1)
首先,它实际上取决于您的自定义游戏引擎,并了解如何加载或初始化游戏场景。正如您提到的那样,您有太多数据要保存和还原,因此请避免使用数据库方法,因为通常这样做效率不高。
如果需要快速解决方案,则二进制方法更好。尝试将游戏数据以二进制块的形式保存在android数据文件夹或资产中,然后在初始化状态下读取并加载它们,而不会阻止其他进程(可能需要分离加载资产线程)。
您需要保存游戏的数据结构并修改自定义游戏引擎以逐步加载它们。为了获得更好的性能,请检查延迟加载技术。
我猜想序列化没有用,因为它试图一步反序列化并恢复所有内容。看到可以分解数据或图层吗?
答案 1 :(得分:0)
我没有完全意识到您如何使用游戏引擎和数据库。但要注意的是,只要您使用的是android,就可以使用SharedPreferences保持状态。至少对于您的某些数据。