大千世界

大千世界

Otillräckligt med betyg
如何提高存档速度2.0 (懒人工具包已失效)
Av declanzhang
作者貌似不打算(或者没有能力)解决存档速度问题了, 只有自己来了
   
Utmärkelse
Favorit
Favoritmarkerad
Avfavoritmarkerad
存档慢的原因
我现在这个档430小时左右, 存档文件3M, 但是存档时间长达10秒左右
存档次数已经12000+了, 意味着等保存的时间就超过30小时, 太TM浪费青春了, 不能忍
游戏还大言不惭的号召我们"一步一存档"


直接拆包, 找到存档部分的代码, 发现就是简单的Base64,
Base64后都有3M, 意味着....
动手将Base64的过程去掉, 然后发现, 原始存档内容高达21M......
尼玛, 你到底存了什么能有这么多数据啊
打开一看, 简直崩溃

不仅存了无数个Null, 而且还有大量没必要存的数据
什么物品描述之类的满屏可见, 甚至还有地图的提示文本都在其中

做了下实验, 去商店买了几十件装备, 然后马上卖掉再保存
存档文件都肉眼可见的增长, 装备虽然卖掉了, 但是还有数据保存
这就是为啥我们的存档在无限的增大而且保存越来越慢的原因了


经过后来仔细分析, 最后确定是分解装备的问题....
目前的版本分解装备过后, 分解掉的装备数据依然会保存!!!!!!!!
我明明身上只有32个武器, 查看存档数据发现武器存了有2000+
所以你分解的越多, 你的存档就会越大, 这个无法通过正常手段在游戏里解决.....
(当然你携带的武器 / 防具越多, 存档也会越大, 不过只要清包清的勤快一点问题不大)
准备工作
最初的想法是把存档中的垃圾数据手动清理掉
后来发现实在是太天真了, 简直无从下手
干脆一不做二不休, 把Base64的步骤去掉就好
20M的读写能花多少时间? 主要慢在Base64


知道了问题的根源就好办了
这里提供两种方案, 都能极大提升存档速度
但是只靠正常的游戏手段都办不到, 所以需要先解包

1. 解包
直接搜 "RPGMakerMV 解包" 即可, 这里就不多说了.
(百度出来的第一个, 非常详细的教程, 只进行拆包步骤)

2.
删除"www"文件夹(这时应该是空的),
将解包后的"%DEFAULT FOLDER%"文件夹改名为"www"

3.
将"save"文件夹整个复制到"www"下

4.
删除TheWorld.exe
将解包后的TheWorld_unpacked.exe改名为TheWorld.exe
(这一步主要是为了可以直接从steam启动, 直接运行TheWorld_unpacked.exe也是可以的)

注意事项

1.解包后使用的是/www/save下的存档文件
2.每次游戏更新后,重新解包的时候注意存档别丢了
方案A. 直接清理多余的数据
个人比较推荐此种方案
上面提到了, 多余的数据主要来自于分解装备,
而分解装备其实不是一个频率很高的操作,
可能你分解掉500+装备以后存档才会开始明显变慢,
所以每隔一段时间清理下就好.

按以下步骤操作

0.
备份好你的存档 (虽然不太可能出错)

1.
把所有仓库里面的 武器 / 防具 取出来, 存个档
(由于我比较懒, 没有去定位这部分数据)
(仓库里推荐不存 武器 / 防具, 界面卡的要死, 存点别的就好)
如果不取出, 在下面的步骤中会直接被清除掉,
还有可能带来其他的错误

2.
打开需要修改的文件
(其实别的也行, 只是这文件是作者外包的批量出售操作, 再次被修改的可能性应该不高...)
(另外我参考了一些这文件的代码, 其实我对RPGMaker基本一无所知....)
\www\js\plugins\Star_ShopOnekey.js

3.
在文件末尾加入以下代码并保存
(这里会覆盖掉原来的F5事件..懒的改了, 需要F5的话清理完后自己改回去就行了)

Graphics._onKeyDown = function(event) {
if (!event.ctrlKey && !event.altKey) {
switch (event.keyCode) {
case 117: // F6 清理武器数据
event.preventDefault();
ClearWeapon();
break;
case 118: // F7 清理防具数据
event.preventDefault();
ClearArmor();
break;
}
}
};
function ClearArmor(){
var count = 0;
var armors = DataManager._independentArmors;
for (var i = 0; i < armors.length; i++) {
if (armors[i]) {
var keep = false;
for(var j = 0; j < $gameParty.members().length; j++){
if($gameActors.actor($gameParty.members()[j]._actorId).hasArmor(armors[i])){
keep = true;
break;
}
}
if (!keep) {
for(var id in $gameParty._armors){
if (armors[i].id == id) {
keep = true;
break;
}
}
}
if (!keep) {
count ++;
DataManager._independentArmors[i] = null;
}
}
}
$gameMessage.add('成功清理掉了' + count + '件防具数据');
}

function ClearWeapon(){
var count = 0;
var weapons = DataManager._independentWeapons;
for (var i = 0; i < weapons.length; i++) {
if (weapons[i]) {
var keep = false;
for(var j = 0; j < $gameParty.members().length; j++){
if($gameActors.actor($gameParty.members()[j]._actorId).hasWeapon(weapons[i])){
keep = true;
break;
}
}
if (!keep) {
for(var id in $gameParty._weapons){
if (weapons[i].id == id) {
keep = true;
break;
}
}
}
if (!keep) {
count ++;
DataManager._independentWeapons[i] = null;
}
}
}
$gameMessage.add('成功清理掉了' + count + '件武器数据');
}

4.
进入游戏
按F6清理武器数据,
按F7清理防具数据,
(如果你的存档很大, 这里可能会很卡, 因为要清理掉大量的垃圾数据)
(清理完毕后会有提示)
这个时候就可以一键保存了


注意事项

此方案好处在于不用每次游戏更新都重新拆包, 修改
(但是要注意存档位置的更变, 即如果更新后不重新拆包的话, 需要把/www/save复制到/save)

方案B. 直接去掉压缩/解压缩的过程
此方案是我之前使用的方案
在方案A诞生以后不太推荐使用
(因为执行完方案A后存档速度已经可以接受了, 再用方案B也不会有太大的提升)

按以下步骤操作

0.
备份好你的存档 (虽然不太可能出错)

1.
将10号存档位空出来

2.
打开需要修改的文件
\www\js\rpg_managers.js

3.
搜索 StorageManager.saveToLocalFile


StorageManager.saveToLocalFile = function(savefileId, json) { var data = LZString.compressToBase64(json); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, data); };
修改为
StorageManager.saveToLocalFile = function(savefileId, json) { var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } if (savefileId == 10) { fs.writeFileSync(filePath, json); } else { fs.writeFileSync(filePath, LZString.compressToBase64(json)); } };

然后将接下来的
StorageManager.loadFromLocalFile = function(savefileId) { var data = null; var fs = require('fs'); var filePath = this.localFilePath(savefileId); if (fs.existsSync(filePath)) { data = fs.readFileSync(filePath, { encoding: 'utf8' }); } return LZString.decompressFromBase64(data); };
修改为
StorageManager.loadFromLocalFile = function(savefileId) { var data = null; var fs = require('fs'); var filePath = this.localFilePath(savefileId); if (fs.existsSync(filePath)) { data = fs.readFileSync(filePath, { encoding: 'utf8' }); } if (savefileId == 10) { return data; } else { return LZString.decompressFromBase64(data); } };

4.
运行游戏, 在10号位保存一次,
以后就都使用10号存档位



注意事项

1.此方案的存档文件与原游戏不同, 所以每次更新都要重复以上操作
2.存档体积会变大很多, 如果云存档太慢, 推荐先关闭云存档
懒人工具包
简单制作了一个懒人工具包, 工作原理和方案A相同, 懒人自取

百度盘 /s/1xf1USG7DQVD6b8lohQdHsA 提取码: 7qm8

14 kommentarer
GordinhoNS 9 nov, 2022 @ 19:14 
FDS
山鹰 25 feb, 2021 @ 2:10 
欧克 谢谢大佬
declanzhang  [skapare] 24 feb, 2021 @ 20:07 
@山鹰 之前简单的查过一下, 没有找到原因, 要详细去查太麻烦了, 毕竟我现在也没玩... 你照着方案A的步骤做一次就行了, 可以用的, 只是工具包失效了
山鹰 24 feb, 2021 @ 7:12 
求大佬更新一下工具包把
declanzhang  [skapare] 4 feb, 2021 @ 1:54 
@EddyRos 嗯 作者技术上可能不太行, 用的都是现成的插件的东西, 基本上没有自己写的东西. 然后故意把掉率经验什么的搞的非常低, 强行拉长游戏时间. 我之前都是看剧的时候顺便刷下, 这次更新的版本已经完全不想玩了
EddyRos 3 feb, 2021 @ 17:00 
喔喔,没事,感谢大佬。我现在发现这个游戏除了刷刷刷好像就没别的了……
declanzhang  [skapare] 3 feb, 2021 @ 3:49 
@EddyRos 我查了下 应该是不能用了 源文件有改动 估计是又加了一些插件造成的 :steamfacepalm: 这游戏我已经弃坑了 新版毫无玩的欲望- - 估计不会更新了吧
EddyRos 2 feb, 2021 @ 8:27 
现在使用工具包后读档会报错_(:з」∠)_
hahahaha 12 okt, 2020 @ 1:26 
感谢,改了之后存档速度快多了
declanzhang  [skapare] 12 okt, 2020 @ 0:33 
@hahaha 不用, 只要第一次的时候把10号空出来, 然后以后10号位就专门用来存这个没有压缩过的存档, 以后每次更新重新解包, 修改, 就可以了