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

Project1

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

[交流讨论] 【Image Cache问题】感觉MV游戏跑着跑着内存会越来越大

[复制链接]

Lv1.梦旅人

梦石
0
星屑
70
在线时间
386 小时
注册时间
2007-7-27
帖子
4106

开拓者

跳转到指定楼层
1
发表于 2015-12-27 01:10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 trentswd 于 2015-12-27 01:12 编辑

这个问题很早就看RPGMAKERWEB上讨论过了,当时没仔细看
最近看了看,惊了
RMMV的Image Load的实现是这样的:
JAVASCRIPT 代码复制
  1. ImageManager.loadNormalBitmap = function(path, hue) {
  2.     var key = path + ':' + hue;
  3.     if (!this._cache[key]) {
  4.         var bitmap = Bitmap.load(path);
  5.         bitmap.addLoadListener(function() {
  6.             bitmap.rotateHue(hue);
  7.         });
  8.         this._cache[key] = bitmap;
  9.     }
  10.     return this._cache[key];
  11. };
  12.  
  13. ImageManager.clear = function() {
  14.     this._cache = {};
  15. };

按照这个用法,每个载入的图片都会保存在ImageManager._cache中,根本不会释放,也没有什么先入先出、最少使用先出之类的清空方法
只有使用ImageManager.clear才会清空,然而默认脚本里面压根就没调用过这个方法

理论上游戏很大的话,随着游戏时间的增加,最后会把所有的图片都读到内存里面去?还是说Html5的Image会自动释放?
吸吸

Lv1.梦旅人

梦石
0
星屑
50
在线时间
491 小时
注册时间
2015-1-7
帖子
124
2
发表于 2015-12-27 01:18:01 | 只看该作者
我发现每天第一次开游戏很慢,然后就快了,应该是电脑关了就消了吧

点评

第一次读文件慢 开fps的话看的很清楚 读取进来就好了  发表于 2015-12-27 11:17
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
3
发表于 2015-12-27 09:53:11 | 只看该作者
于是该怎么办呢?
添加一个预加载和过多处理的方法吗?
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
676
在线时间
224 小时
注册时间
2006-12-7
帖子
839
4
发表于 2015-12-27 11:17:06 | 只看该作者
搬运一个插件 还没研究细节
其实要能做的只能一点在事件里面调用的话应该很方便
做远景地图的话 离开一个区域可以在传送点加入清缓存代码

JAVASCRIPT 代码复制
  1. //=============================================================================
  2.     // Cache Manager
  3.     // by Shaz
  4.     // Last Updated: 2015.10.30
  5.     //=============================================================================
  6.  
  7.     /*:
  8.      * @plugindesc Selectively clear the image cache for memory usage improvements
  9.      * @author Shaz
  10.      *
  11.      * @param Mobile only
  12.      * @desc Cache management only runs on mobile platforms (N to run on all platforms)
  13.      * @default Y
  14.      *
  15.      * @param --------------------------------------------
  16.      *
  17.      * @param Clear All
  18.      * @desc Clears all cached images except System (if Y, ignore remaining parameters)
  19.      * @default Y
  20.      *
  21.      * @param Clear Animations
  22.      * @desc Clear Animation images
  23.      * @default Y
  24.      *
  25.      * @param Clear Battlebacks
  26.      * @desc Clear Battleback images
  27.      * @default Y
  28.      *
  29.      * @param Clear Battlers
  30.      * @desc Clear Battler images
  31.      * @default Y
  32.      *
  33.      * @param Clear Characters
  34.      * @desc Clear Character images
  35.      * @default Y
  36.      *
  37.      * @param Clear Faces
  38.      * @desc Clear Face images
  39.      * @default Y
  40.      *
  41.      * @param Clear Parallaxes
  42.      * @desc Clear Parallax images
  43.      * @default Y
  44.      *
  45.      * @param Clear Pictures
  46.      * @desc Clear Picture images
  47.      * @default Y
  48.      *
  49.      * @param Clear System
  50.      * @desc Clear System images (not recommended)
  51.      * @default N
  52.      *
  53.      * @param Clear Tilesets
  54.      * @desc Clear Tileset images
  55.      * @default Y
  56.      *
  57.      * @param Clear Titles
  58.      * @desc Clear Title images
  59.      * @default Y
  60.      *
  61.      * @param Custom Images
  62.      * @desc List custom image paths to clear, separated by ; (img/fogs; img/busts)
  63.      * @default
  64.      *
  65.      * @help This plugin does not provide plugin commands.
  66.      *
  67.      * This plugin allows you to specify how often the image cache should be
  68.      * cleared, and what kind of images should be cleared.  This can be used
  69.      * to improve memory usage on low-memory platforms, but will also result
  70.      * in more frequent loading delays.
  71.      *
  72.      * If not using the 'clear all' default option, and you have plugins that
  73.      * use their own custom image paths, list those paths in the Custom Images
  74.      * parameter to clear any images cached from those locations.
  75.      *
  76.      */
  77.  
  78.     (function() {
  79.       var params = PluginManager.parameters('CacheManager');
  80.       var mobile = (params['Mobile only'] || 'Y').toUpperCase().substring(0,1) === 'Y';
  81.       var clearAll = (params['Clear All'] || 'Y').toUpperCase().substring(0,1) === 'Y';
  82.       if (!clearAll) {
  83.         pathsToClear = [];
  84.         if ((params['Clear Animations'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  85.           pathsToClear.push('img/animations');
  86.         if ((params['Clear Battlebacks'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  87.           pathsToClear.push('img/battlebacks1', 'img/battlebacks2');
  88.         if ((params['Clear Battlers'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  89.           pathsToClear.push('img/enemies', 'img/sv-actors', 'img/sv-enemies');
  90.         if ((params['Clear Characters'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  91.           pathsToClear.push('img/characters');
  92.         if ((params['Clear Faces'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  93.           pathsToClear.push('img/faces');
  94.         if ((params['Clear Parallaxes'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  95.           pathsToClear.push('img/parallaxes');
  96.         if ((params['Clear Pictures'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  97.           pathsToClear.push('img/pictures');
  98.         if ((params['Clear System'] || 'N').toUpperCase().substring(0,1) === 'Y')
  99.           pathsToClear.push('img/system');
  100.         if ((params['Clear Tilesets'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  101.           pathsToClear.push('img/tilesets');
  102.         if ((params['Clear Titles'] || 'Y').toUpperCase().substring(0,1) === 'Y')
  103.           pathsToClear.push('img/titles1', 'img/titles2');
  104.         (params['Custom Images'] || '').split(';').forEach(function(path) { if (path) pathsToClear.push(path.trim()) }.bind(this));
  105.       }
  106.  
  107.       ImageManager.clear = function() {
  108.         for (image in this._cache) {
  109.           if (clearAll && image.indexOf('img/system') === -1)
  110.             this.removeFromCache(image);
  111.           else if (!clearAll && pathsToClear.some(function(path) { return image.indexOf(path) > -1}.bind(this)))
  112.             this.removeFromCache(image);
  113.         }
  114.       };
  115.  
  116.       ImageManager.removeFromCache = function(image) {
  117.         if (image !== 'null') {
  118.           if (this._cache.hasOwnProperty(image) && this._cache[image] instanceof Bitmap) {
  119.             if (this._cache[image].baseTexture) {
  120.               this._cache[image].baseTexture.destroy();
  121.             }
  122.           }
  123.           delete this._cache[image];
  124.         }
  125.       };
  126.  
  127.       var _Scene_Map_create = Scene_Map.prototype.create;
  128.       Scene_Map.prototype.create = function() {
  129.         _Scene_Map_create.call(this);
  130.         if (this._transfer && (!mobile || Utils.isMobileDevice())) {
  131.           ImageManager.clear();
  132.         }
  133.       };
  134.     })();

点评

看了一下这个插件说:This plugin allows you to specify how often the image cache should be cleared,但是实际我没找到怎么配置清理时间  发表于 2015-12-27 15:12
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

5
发表于 2015-12-27 11:33:55 | 只看该作者
RM 所有版本都是这样的,并不会有什么问题。

正常电脑的内存是够用的。

点评

当年xp的时候512MB内存都算大。256主流,远景图地图玩久也会卡  发表于 2015-12-28 01:29
电脑上问题可能不大,手机上就需要担心了  发表于 2015-12-27 17:29
PC版一般都还好,打到手机上玩简直爆炸的卡  发表于 2015-12-27 14:55
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
306 小时
注册时间
2014-8-5
帖子
416
6
发表于 2015-12-27 13:10:15 | 只看该作者
我个人觉得目前主流电脑的内存已经足够适应足够大的RM游戏。
  点我进入    
       ↓      
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
145 小时
注册时间
2015-12-22
帖子
36
7
发表于 2015-12-27 13:45:29 | 只看该作者
以空间换时间,以耗内存为代价换取流畅性,是软件发展的主流趋势。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
95
在线时间
268 小时
注册时间
2010-12-22
帖子
21
8
发表于 2015-12-27 13:49:39 | 只看该作者
最近剛好也在查這個問題,因為一些舊型手機在執行時FPS 相當低, 這邊查到了一個preload 跟 控制記憶體使用的
插件,但怎麼都不會用,還望大神能夠教學

http://liply.net/2015/11/14/preload/

点评

虽然我也看不懂,但是LFU应该是按使用频率来清除。不过它既然是alpha还是暂时不要使用了……  发表于 2015-12-27 17:34
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
145 小时
注册时间
2015-12-22
帖子
36
9
发表于 2015-12-27 13:53:57 | 只看该作者
吃内存是现代软件的优化方式,如果把它“优化”掉,只能提高游戏在低配手机上的流畅性,在高配手机和电脑上会变得更卡,大内存用户的游戏体验会变差。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
388 小时
注册时间
2009-8-4
帖子
219
10
发表于 2015-12-27 13:54:28 | 只看该作者
本帖最后由 andrewx 于 2015-12-27 13:56 编辑
taroxd 发表于 2015-12-27 11:33
RM 所有版本都是这样的,并不会有什么问题。

正常电脑的内存是够用的。


但是放在手机上可能就要出问题了吧?目前移动端运行起来效率确实有点糟糕
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-13 03:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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