Project1

标题: 因PreloaderCore预加载而导致内存过载而闪退,如何补救。 [打印本页]

作者: CCD0645    时间: 2020-7-25 03:19
标题: 因PreloaderCore预加载而导致内存过载而闪退,如何补救。
加入SRD_PreloaderCore插件后,内存预加载,游戏过程中,内存占用越来越多,直到爆炸闪退。
有没有可以清理缓存的方法?应该说清理预加载以外的缓存,使内存占用率不会随着游戏时间一直增多?
作者: moonyoulove    时间: 2020-7-25 09:36
预设有缓存清理机制
作者: moonyoulove    时间: 2020-7-25 11:18
一时间我也没办法细究
JAVASCRIPT 代码复制
  1. Scene_Base.prototype.detachReservation = function() {
  2.     ImageManager.releaseReservation(this._imageReservationId);
  3. };

这段代码会在离开场景时执行,会释放掉被绑定在场景的图片
JAVASCRIPT 代码复制
  1. ImageCache.prototype.add = function(key, value){
  2.     this._items[key] = {
  3.         bitmap: value,
  4.         touch: Date.now(),
  5.         key: key
  6.     };
  7.  
  8.     this._truncateCache();
  9. };

这段代码是在别人要读取图片,添加缓存时触发truncateCache,会判断是否缓存满了需要按照优先顺序释出图片(半强制)
另,javascript其实不能手动
垃圾回收(英語:Garbage Collection,縮寫為GC)
,因此RM只是把用到这张图片缓存的人都断开,好让javascript在收垃圾时,可以知道这是可以收走的,所以不是马上清除缓存暂用的记忆体,具体什么时候收垃圾没有人知道
作者: walf_man    时间: 2020-7-25 23:58
最好不要用这个预加载,除非你不得不用。尤其手机上千万不能用,简直是噩梦一般的插件
作者: CCD0645    时间: 2020-7-26 00:05
walf_man 发表于 2020-7-25 23:58
最好不要用这个预加载,除非你不得不用。尤其手机上千万不能用,简直是噩梦一般的插件 ...

那有更好的插件吗
作者: 梦想家大魔王    时间: 2020-7-26 07:27
CCD0645 发表于 2020-7-26 00:05
那有更好的插件吗

有什么必须用它的理由吗?
我很久之前试过类似的插件,并不能让我的工程跑得更顺。
作者: CCD0645    时间: 2020-7-26 07:50
梦想家大魔王 发表于 2020-7-26 07:27
有什么必须用它的理由吗?
我很久之前试过类似的插件,并不能让我的工程跑得更顺。 ...

https://rpg.blue/thread-480318-1-1.html
看我之前这个贴,最终决定用这个插件词解决问题。
作者: 芯☆淡茹水    时间: 2020-7-26 08:11
老版的MV,事件解释器没有预载,而现在版本的MV有。
就新开一个工程,连续转换图片显示,没有出现闪图的现象。
你使用的插件,要看作者是基于什么情况下所写,如果是针对以前老版没有预载时写的,那么现在有默认预载的MV再加上插件预载,这个预载功能是否重复了呢?!
作者: walf_man    时间: 2020-7-26 14:27
本帖最后由 walf_man 于 2020-7-27 23:46 编辑
CCD0645 发表于 2020-7-26 07:50
https://rpg.blue/thread-480318-1-1.html
看我之前这个贴,最终决定用这个插件词解决问题。 ...


这帖子我看了,js是单线程的,所以会出现顺序显示的问题 ,之所以显示过之后再显示就没有顺序问题,其实是因为缓存了,从内存中读取显示出来速度很快,间隔很多,你感觉不到,但机理还是先显示立绘再显示墨镜的

楼上大佬解答的也很好,你用的版本可能也有关系
作者: CCD0645    时间: 2020-7-26 19:02
芯☆淡茹水 发表于 2020-7-26 08:11
老版的MV,事件解释器没有预载,而现在版本的MV有。
就新开一个工程,连续转换图片显示,没有出现闪图的现 ...

还有老板新版之分吗?我发帖的时间也是今年,而且MV是STEAM版的,应该会自动更新吧。
我刚才新建一个工程,发现问题并没有解决,还是一样闪烁,你说的事件解释器是不是需要手动加载?
作者: 芯☆淡茹水    时间: 2020-7-26 19:36
本帖最后由 芯☆淡茹水 于 2020-7-26 19:38 编辑
CCD0645 发表于 2020-7-26 19:02
还有老板新版之分吗?我发帖的时间也是今年,而且MV是STEAM版的,应该会自动更新吧。
我刚才新建一个工程 ...


ImageManager 的那两个个人常常给搞混~!
虽然不知道你的预载插件是怎样的,但可以用一个笨办法,不用预载图片,让连续显示图片不闪图,但要求多张同步就可能有些办不到
把 Sprite_Picture 的一个方法改成下面这样就行了
  1. Sprite_Picture.prototype.loadBitmap = function() {
  2.     var bitmap = ImageManager.loadPicture(this._pictureName);
  3.     bitmap.addLoadListener(function(){
  4.         this.bitmap = new Bitmap(bitmap.width, bitmap.height);
  5.         this.bitmap.blt(bitmap,0,0,bitmap.width,bitmap.height,0,0);
  6.     }.bind(this));
  7. };
复制代码

作者: CCD0645    时间: 2020-7-26 20:22
芯☆淡茹水 发表于 2020-7-26 19:36
ImageManager 的那两个个人常常给搞混~!
虽然不知道你的预载插件是怎样的,但可以用一个笨办 ...

这个我已经有一个插件用于不闪图的,关键是同步必须要用预加载才行。
虽然预加载占内存很大。
有没有办法定期给游戏清一下内存,使其不至于内存爆炸而闪退?因为游戏运行越久,内存越占越多。
作者: 芯☆淡茹水    时间: 2020-7-26 21:10
本帖最后由 芯☆淡茹水 于 2020-7-26 21:38 编辑
CCD0645 发表于 2020-7-26 20:22
这个我已经有一个插件用于不闪图的,关键是同步必须要用预加载才行。
虽然预加载占内存很大。
有没有办法 ...


定期?我不知道你的定期是什么时候。
ImageCache 有一个释放预载的功能,但他是根据 ID 来的。
可以把把下面的加入脚本
  1. ImageCache.prototype.releaseToBeginning = function(){
  2.     Object.keys(this._items).map(function(key){
  3.         if (this._items[key].reservationId !== ImageManager._systemReservationId) {
  4.           delete this._items[key];
  5.         }
  6.     }, this);
  7. };
  8. ImageManager.releaseToBeginning = function(){
  9.     this._imageCache.releaseToBeginning();
  10. };
复制代码

这是强制清除 除游戏开始时预载的系统图片以外 的所有缓存图片。
用法是 事件-脚本: ImageManager.releaseToBeginning();
什么时候清理你自己搞定,同样没有测试。

还有一种方案,把他的释放限制改一下,只承认 系统预载 的图片。
JAVASCRIPT 代码复制
  1. ImageCache.prototype._mustBeHeld = function(item){
  2.     return item.reservationId === ImageManager._systemReservationId;
  3. };


这个就只需要把上面代码写入脚本,这个不需要手动,达到最大限制时才自动释放到限制的范围内。
作者: CCD0645    时间: 2020-7-28 22:33
芯☆淡茹水 发表于 2020-7-26 21:10
定期?我不知道你的定期是什么时候。
ImageCache 有一个释放预载的功能,但他是根据 ID 来的。
可以把把 ...

感觉写上去没什么反应,你说这个ImageCache是额外需要加的一个插件吗?还是说自带的?
作者: 芯☆淡茹水    时间: 2020-7-29 09:00
CCD0645 发表于 2020-7-28 22:33
感觉写上去没什么反应,你说这个ImageCache是额外需要加的一个插件吗?还是说自带的? ...

肯定是自带的啊,要不然你加上上面的代码就立马报错,或者致使整个插件代码无效。
ImageCache 是MV后来的版本才有的,是对图像数据的储存,管理,释放,,,等功能。
至于你说的看不到效果,个人就不知道实际是什么原因了,或者你可以把限制的改小一些,
默认的是这么多: ImageCache.limit = 10 * 1000 * 1000;




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