Project1
标题: 因PreloaderCore预加载而导致内存过载而闪退,如何补救。 [打印本页]
作者: CCD0645 时间: 2020-7-25 03:19
标题: 因PreloaderCore预加载而导致内存过载而闪退,如何补救。
加入SRD_PreloaderCore插件后,内存预加载,游戏过程中,内存占用越来越多,直到爆炸闪退。
有没有可以清理缓存的方法?应该说清理预加载以外的缓存,使内存占用率不会随着游戏时间一直增多?
作者: moonyoulove 时间: 2020-7-25 09:36
预设有缓存清理机制
作者: moonyoulove 时间: 2020-7-25 11:18
一时间我也没办法细究
Scene_Base.prototype.detachReservation = function() {
ImageManager.releaseReservation(this._imageReservationId);
};
Scene_Base.prototype.detachReservation = function() {
ImageManager.releaseReservation(this._imageReservationId);
};
这段代码会在离开场景时执行,会释放掉被绑定在场景的图片
ImageCache.prototype.add = function(key, value){
this._items[key] = {
bitmap: value,
touch: Date.now(),
key: key
};
this._truncateCache();
};
ImageCache.prototype.add = function(key, value){
this._items[key] = {
bitmap: value,
touch: Date.now(),
key: key
};
this._truncateCache();
};
这段代码是在别人要读取图片,添加缓存时触发truncateCache,会判断是否缓存满了需要按照优先顺序释出图片(半强制)
另,javascript其实不能手动垃圾回收(英語:Garbage Collection,縮寫為GC)
,因此RM只是把用到这张图片缓存的人都断开,好让javascript在收垃圾时,可以知道这是可以收走的,所以不是马上清除缓存暂用的记忆体,具体什么时候收垃圾没有人知道
作者: walf_man 时间: 2020-7-25 23:58
最好不要用这个预加载,除非你不得不用。尤其手机上千万不能用,简直是噩梦一般的插件
作者: CCD0645 时间: 2020-7-26 00:05
那有更好的插件吗
作者: 梦想家大魔王 时间: 2020-7-26 07:27
有什么必须用它的理由吗?
我很久之前试过类似的插件,并不能让我的工程跑得更顺。
作者: CCD0645 时间: 2020-7-26 07:50
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 编辑
这帖子我看了,js是单线程的,所以会出现顺序显示的问题 ,之所以显示过之后再显示就没有顺序问题,其实是因为缓存了,从内存中读取显示出来速度很快,间隔很多,你感觉不到,但机理还是先显示立绘再显示墨镜的
楼上大佬解答的也很好,你用的版本可能也有关系
作者: CCD0645 时间: 2020-7-26 19:02
还有老板新版之分吗?我发帖的时间也是今年,而且MV是STEAM版的,应该会自动更新吧。
我刚才新建一个工程,发现问题并没有解决,还是一样闪烁,你说的事件解释器是不是需要手动加载?
作者: 芯☆淡茹水 时间: 2020-7-26 19:36
本帖最后由 芯☆淡茹水 于 2020-7-26 19:38 编辑
ImageManager 的那两个个人常常给搞混~!
虽然不知道你的预载插件是怎样的,但可以用一个笨办法,不用预载图片,让连续显示图片不闪图,但要求多张同步就可能有些办不到
把 Sprite_Picture 的一个方法改成下面这样就行了
- Sprite_Picture.prototype.loadBitmap = function() {
- var bitmap = ImageManager.loadPicture(this._pictureName);
- bitmap.addLoadListener(function(){
- this.bitmap = new Bitmap(bitmap.width, bitmap.height);
- this.bitmap.blt(bitmap,0,0,bitmap.width,bitmap.height,0,0);
- }.bind(this));
- };
复制代码
作者: CCD0645 时间: 2020-7-26 20:22
这个我已经有一个插件用于不闪图的,关键是同步必须要用预加载才行。
虽然预加载占内存很大。
有没有办法定期给游戏清一下内存,使其不至于内存爆炸而闪退?因为游戏运行越久,内存越占越多。
作者: 芯☆淡茹水 时间: 2020-7-26 21:10
本帖最后由 芯☆淡茹水 于 2020-7-26 21:38 编辑
定期?我不知道你的定期是什么时候。
ImageCache 有一个释放预载的功能,但他是根据 ID 来的。
可以把把下面的加入脚本
- ImageCache.prototype.releaseToBeginning = function(){
- Object.keys(this._items).map(function(key){
- if (this._items[key].reservationId !== ImageManager._systemReservationId) {
- delete this._items[key];
- }
- }, this);
- };
- ImageManager.releaseToBeginning = function(){
- this._imageCache.releaseToBeginning();
- };
复制代码
这是强制清除 除游戏开始时预载的系统图片以外 的所有缓存图片。
用法是 事件-脚本: ImageManager.releaseToBeginning();
什么时候清理你自己搞定,同样没有测试。
还有一种方案,把他的释放限制改一下,只承认 系统预载 的图片。
ImageCache.prototype._mustBeHeld = function(item){
return item.reservationId === ImageManager._systemReservationId;
};
ImageCache.prototype._mustBeHeld = function(item){
return item.reservationId === ImageManager._systemReservationId;
};
这个就只需要把上面代码写入脚本,这个不需要手动,达到最大限制时才自动释放到限制的范围内。
作者: CCD0645 时间: 2020-7-28 22:33
感觉写上去没什么反应,你说这个ImageCache是额外需要加的一个插件吗?还是说自带的?
作者: 芯☆淡茹水 时间: 2020-7-29 09:00
肯定是自带的啊,要不然你加上上面的代码就立马报错,或者致使整个插件代码无效。
ImageCache 是MV后来的版本才有的,是对图像数据的储存,管理,释放,,,等功能。
至于你说的看不到效果,个人就不知道实际是什么原因了,或者你可以把限制的改小一些,
默认的是这么多: ImageCache.limit = 10 * 1000 * 1000;
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |