Project1

标题: 游戏存档文件大小越来越大问题 [打印本页]

作者: hys111111    时间: 2017-5-6 13:15
标题: 游戏存档文件大小越来越大问题
按照之前来讲,我是通过load_data,save_data来读取和保存数据文件的。
这种方式的话,保存之后的文件大小一般不变或者变化不多。

但是游戏的存档文件大小随着保存次数的增多而越来越大。
但是我发现游戏存档并不是通过上面列出的这种方式,而是Marshal.load(file)和Marshal.dump的方式。
似乎意味着save_data不会增大文件大小,但是Marshal.dump会增大,是这样说吗?

为什么存档要用这种方式呢?
作者: taroxd    时间: 2017-5-6 16:19
本帖最后由 taroxd 于 2017-5-6 16:22 编辑

请先阅读 F1 中关于 load_data 和 save_data 这两个函数的说明,这样你应该就能明白 Marshal.dump 并不会因为保存次数的增多而增大。出现这种现象可能是因为某些插件脚本在游戏过程中产生了冗余信息没有清除。

存档使用 Marshal.dump 而不用 save_data 是因为这样可以将存档数据分两块(或更多块)写入。在存档的前半部分存放了一些存读档界面会显示的元数据,而真正的存档内容放在下一块中。这样做可以使得读取那些元数据时不需要读取整个存档文件。

RUBY 代码复制
  1. # 下面这段代码是无法用 save_data 实现的
  2. File.open 'Save.rvdata', 'wb' do |f|
  3.   Marshal.dump header, f
  4.   Marshal.dump contents, f
  5. end

作者: hys111111    时间: 2017-5-6 18:07
taroxd 发表于 2017-5-6 16:19
请先阅读 F1 中关于 load_data 和 save_data 这两个函数的说明,这样你应该就能明白 Marshal.dump 并不会因 ...


原来分两块是为了这样。

不过还是不知道什么插件脚本让它越来越大。
我只是重定义write_save_data(file)加了几行Marshal.dump多保存了几个变量而已。

或者是跟write_save_data无关,反倒是跟保存的那些如Game_Party有关?
因为能够添加内容的主要在Game_Party这里。
比如下面的这些变量
@items = {}
@weapons = {}
@armors = {}
在执行item_number(item_id)之后,原本为nil,然后变成0,使得存入存档中的$game_party所占大小就增加了。
  1. def item_number(item_id)
  2.     # 如果 hash 个数数值不存在就返回 0
  3.     return @items.include?(item_id) ? @items[item_id] : 0
  4.   end
复制代码

是跟这个有关吗?
作者: taroxd    时间: 2017-5-6 19:25
hys111111 发表于 2017-5-6 18:07
原来分两块是为了这样。

不过还是不知道什么插件脚本让它越来越大。

存档的大小当然是跟存档的内容有关,比如 $game_party 中的各种实例变量。

但和你接下来举的例子完全无关。

在你的例子中,执行 item_number(item_id) 之前,@items 并不包含 item_id 这一个键。
执行 item_number(item_id) 之后,也并不会将 @items[item_id] 设为 0。@items 中仍然不包含 item_id 这一个键。
item_number 是一个无副作用的方法,不会对存档之类的东西产生影响。



作者: hys111111    时间: 2017-5-6 20:20
taroxd 发表于 2017-5-6 19:25
存档的大小当然是跟存档的内容有关,比如 $game_party 中的各种实例变量。

但和你接下来举的例子完全无 ...


看错了,是这个。
  1. def gain_item(item_id, n)
  2.     # Update quantity data in the hash.
  3.     if item_id > 0
  4.       @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
  5.     end
  6.   end
复制代码

执行添加物品操作时,这个时候@items[item_id]是存在了吧。

不过我知道了。
因为除了这个,我在游戏中用Game_Party储存了很多东西,所以存档越来越大了。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1