设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2132|回复: 4
打印 上一主题 下一主题

[已经解决] 游戏存档文件大小越来越大问题

[复制链接]

Lv3.寻梦者

双子人

梦石
0
星屑
3190
在线时间
3618 小时
注册时间
2009-4-4
帖子
4154

开拓者

跳转到指定楼层
1
发表于 2017-5-6 13:15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
按照之前来讲,我是通过load_data,save_data来读取和保存数据文件的。
这种方式的话,保存之后的文件大小一般不变或者变化不多。

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

为什么存档要用这种方式呢?

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2017-5-6 16:19:50 | 只看该作者
本帖最后由 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
回复 支持 反对

使用道具 举报

Lv3.寻梦者

双子人

梦石
0
星屑
3190
在线时间
3618 小时
注册时间
2009-4-4
帖子
4154

开拓者

3
 楼主| 发表于 2017-5-6 18:07:01 | 只看该作者
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
复制代码

是跟这个有关吗?
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2017-5-6 19:25:03 | 只看该作者
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 是一个无副作用的方法,不会对存档之类的东西产生影响。


评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 醋虾

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

双子人

梦石
0
星屑
3190
在线时间
3618 小时
注册时间
2009-4-4
帖子
4154

开拓者

5
 楼主| 发表于 2017-5-6 20:20:50 | 只看该作者
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储存了很多东西,所以存档越来越大了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-28 22:44

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表