| 赞 | 0 |
| VIP | 0 |
| 好人卡 | 0 |
| 积分 | 0 |
| 经验 | 0 |
| 最后登录 | 2025-11-3 |
| 在线时间 | 7 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 39
- 在线时间
- 7 小时
- 注册时间
- 2025-10-26
- 帖子
- 2
|
本帖最后由 mamamiyas 于 2025-10-29 01:18 编辑
相比于性能落后,我觉得调度问题才是最灾难性的,,,,,rpg的代码是一点都不考虑资源复用和细致判断。举例关于存档的,进读档界面和在界面滑动的每一下都要读取全部的存档信息来渲染画面,且经常性的用refresh进行全元素重绘,吃资源拉满了。比如下面这rpg_managers.js的三段代码,进界面时要判断哪个是最新的存档来定位到该存档处方便玩家,然后首先latestSavefileId()就调用了loadGlobalInfo()一次读取存档信息,那么loadGlobalInfo()就首先循环了一遍最大存档数来读档(空的也读,官方默认是20个档位,那么默认的情况下就至少进行了20次读取加载),然后latestSavefileId 下面又根据globalInfo.length也就是长度进行循环,长度是20那么会循环20遍,每次循环都会执行isThisGameFile(),isThisGameFile()里面又会调用loadGlobalInfo()来读档。那么latestSavefileId()里的20次循环下来至少让loadGlobalInfo执行了20+20*20=420,读了420次档,,,,,性能都白白浪费了。这还只是进界面判断最新存档用的,然后每一次滑动会让另一个结构类似的函数检测存档情况来渲染界面然后就还是经典20+20*20以及每检测出一个存档的情况就refresh全刷新一次共刷新20次,这使得每次滑动界面都卡卡的,,,,,。关于缓存机制我是感觉不到一点,给loadGlobalInfo写了个if (this.GlobalInfoLoaded === 1 && this._globalInfoCache) {return this._globalInfoCache;}的缓存复用后进界面时间消耗直接从600多ms降到了200多ms,所以原本绝对没有缓存判断的,当然我的那个游戏是80个档位,堵塞情况明显会比官方的20的严重的。然后接着给刷新和加载函数加了些判断和异步以及其它的缓存后,又降到了现在的40ms左右。
可见优化方面的潜力是很大的,不然开发插件给的性能再强大都没用。
DataManager.latestSavefileId = function() {
var globalInfo = this.loadGlobalInfo();
var savefileId = 1;var timestamp = 0;
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i) && globalInfo.timestamp > timestamp) {
timestamp = globalInfo.timestamp;
savefileId = i;}}}return savefileId;}
DataManager.loadGlobalInfo = function() {
var json;
try {json = StorageManager.load(0);} catch (e) {
console.error(e);return [];}
if (json) {
var globalInfo = JSON.parse(json);
for (var i = 1; i <= this.maxSavefiles(); i++) {
if (!StorageManager.exists(i)) {
delete globalInfo;}}return globalInfo;}else {return [];}
DataManager.isThisGameFile = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
if (globalInfo && globalInfo[savefileId]) {
if (StorageManager.isLocalMode()) {return true;
} else {
var savefile = globalInfo[savefileId];
return (savefile.globalId === this._globalId &&
savefile.title === $dataSystem.gameTitle);}}else {return false;}}
|
|