游戏本地存档方案讨论【一】
存档,英文是一个游戏术语,游戏保存时留下的文件,记录了游戏进度和各种数据。在存档被发明之前,大多数游戏都需要玩家一次性完成整个游戏,不能在中途保存进度。 任天堂在1986年发售的《塞尔达传说》是第一个拥有保存进度和读取存档的游戏。存档让玩家在游戏中任何时候放心停下来而不必担心之前需要重复完成已经完成过的关卡。 一般游戏存档系统设计其实就是在做这几件事情,序列化、持久化、读取持久化数据、反序列化。
存档,英文是一个游戏术语,游戏保存时留下的文件,记录了游戏进度和各种数据。在存档被发明之前,大多数游戏都需要玩家一次性完成整个游戏,不能在中途保存进度。
任天堂在1986年发售的《塞尔达传说》是第一个拥有保存进度和读取存档的游戏。存档让玩家在游戏中任何时候放心停下来而不必担心之前需要重复完成已经完成过的关卡。
一般游戏存档系统设计其实就是在做这几件事情,序列化、持久化、读取持久化数据、反序列化。
其中存档文件就是为了不同游戏进程中保存和恢复游戏进度而设计的,这样说确实比较抽象,但下面的例子并不难理解。
在计科中,持久化指的是一个系统的状态所具有的特性,其持续时间比创建它的进程更更长。
在游戏进程中所有游戏变量(比如玩家的经验值等)都暂时保存在内存中,这些游戏变量只存在于游戏进程运行时。当玩家手动存档或者游戏自动存档时,游戏进程会将当前进程状态中的一部分——也就是我们的需要保存的游戏变量,保存到本地一个游戏存档文件。在玩家退出游戏,游戏进程生命周期结束时,游戏进程的所有状态信息都会随着内存的释放而清除,而存档文件中保存的那部分状态不会随着进程结束而被清除,当玩家再次启动游戏,系统为我们创建一个新的进程并读取这个存档文件,进程会恢复这些状态,玩家就可以从上次的存档点继续游戏。
那么游戏进程状态是如何将一部分状态转换成要保存的持久化数据的呢?这就需要引入两个新的概念了,数据结构和序列化,游戏进程必须在内存和硬盘之间传输数据,并且必须提供从本机编程语言数据结构到存储设备数据结构的映射,也就是序列化。
序列化会将内存中的数据结构(也可以理解为对象)转换为可以存储和传输的格式,一般用以下两种序列化方式。
字符串:可读性高,但性能相对较低的JSON或XML序列化。
字节流:可读性较低,但性能相对较高,采用二进制序列化。
接下来将序列化后的字符串或字节流写入到存档文件中,存档过程至此结束。
理解了存档过程,读档过程也更不难理解了,只不过是反过来将从存档文件中读取的序列化数据反序列化为内存中的对象,可以看作是一种还原过程。
以上就是存档的理论部分,在实际应用方面,不同的游戏引擎和编程语言斗有自己特定的序列化规则和方法,一般在相关的API文档都有说明,原理都大差不差。
未完待续
更多推荐
所有评论(0)