最终微信小游戏出现机型崩溃的bug,最终找到了原因,是跟系统对于app(这里指微信)的程序运行内存空间管理机制有关,而且这个管理机制并不是所有的系统都有,暂时发现android7的相应小版本貌似有这个管理机制,而安卓6 ios不存在,所以我的游戏会出现红米note4x与苹果手机没有问题,但一些安卓较新手机会出现微信小游戏崩溃。崩溃直接原因是相应的内存报警,但不可检测。而造成这个问题是由于,我自己的游戏体量相对较大(不去掉底层模块的情况下,引擎代码+游戏代码大约4.5M左右),在这种情况下我使用了服务器远端资源方式,使用接口
cc.loader.loadResDir(“资源文件夹”,
function (completedCount, totalCount, item) {
let _progress = (completedCount / totalCount).toFixed(2);
if (item && item.uuid && _progress > self.loadBar.progress) {
self.loadBar.progress = _progress;
self.progressLabel.string = self.getValuePercent(_progress, 0);
}
}, function (err, assets) {
cc.log(“加载完成”);
self.loadAnimation();
}
);
进行资源加载,而这种资源加载方式将资源都实例化后存在了内存中,结果游戏运行几个界面后造成了不可检测的内存报警。
当我不在使用资源预加载场景时,在原来崩溃的游戏上基本可以正常运行。当然长时间运行后是否还会造成崩溃,暂时还没有进行测试,下面我接着去解决如何进行远端资源预加载到本地并清掉内存咱不使用的资源。作为一个creator与微信小游戏的新手,确实会遇到一些问题,不怕大家笑话一起来交流下。
游戏启动的加载资源界面一定要注意:
cc.loader.loadResDir(“prefabs”,
function (completedCount, totalCount, item) {
let _progress = (completedCount / totalCount).toFixed(2);
if (item && item.uuid && _progress > self.loadBar.progress) {
self.loadBar.progress = _progress;
self.progressLabel.string = self.getValuePercent(_progress, 0);
}
}, function (err, assets) {
cc.log(“加载完成”);
// 加载 startUp
cc.director.loadScene(“StartUp.fire”);
cc.loader.release(assets);
} );
对比上面我发的代码,要注意将加载的资源释放掉,防止过多占用内存。
还有就是 在加载预制体 结束后要将可以释放的资源设置为自动释放,代码如下:
cc.loader.loadRes(‘prefabs/UI/UIDebug’, function (err, prefab) {
// cc.log(err);
…
if(!err){
cc.loader.setAutoReleaseRecursively(prefab, true);
}
});
但是要注意并不是所有都能释放,那些引用了公用图集的最好不要随便释放,防止出现图片渲染不出来的问题
在游戏开发中,内存分配是非常重要的一环。建议搭配使用 UILoader 的制作规范和指导方法食用。
不仅是android,iOS也会有杀掉进程的操作。很久以前看是当App占用机子运存达到一半时,系统就会把应用杀掉,也就是你所看到的闪退。不知道现在iOS的机制改成怎么样,但是可以肯定的是,系统必须优先保证自身的运行稳定与流畅。
谢谢回帖,内存报警杀死程序这个事情,还是了解一些的。但是现在creator最诡异的事情是,同样的代码在出android端游戏,没有经过优化不会出现杀死程序的问题;用creator出微信小游戏,在android6根ios上没有经过优化,基本也没有啥崩溃;用creator出微信小游戏,在anroid7以上的版本,没有经过优化会出现崩溃,而且连我的游戏的新手都不过不了,所以上面的文章我猜测应该是android7以后内存管理机制估计有更改(当然我手上的android6配置小于等于anroid7以上是一定的条件)。当然资源管理优化对游戏品质的提升还是很重要的,我上面就是阐述下自己遇到的问题。
切换场景也会导致内存增长
哎,我也遇到了适配问题。。。。。。现在迁移的信心正在动摇
现在正在解决 资源管理的问题 等我解决了 来把帖子补齐 现在也是 还是依然在anroid7以上微信小游戏出现崩溃
大哥,我用你的方式去 解决全面屏的问题好像没用啊
iphoneX 适配有咩有 好的方法
cc.loader._cache 这里边的资源如何移除?
我使用了 cc.loader.loadResDir 加载预制物体后 想要清除图片资源
使用 cc.loader.releaseResDir(“prefabs”);(变量"prefabs"为resources中预制物体的文件夹)
使用 cc.loader.release(assets); (变量assets为cc.loader.loadResDir完成时回调回来的)
cc.loader.release(“image”);
cc.loader.release(“animation”);
(变量"image","animation"为resources中图片与动画的文件夹)
都不能清除图片资源,还有什么函数能够清除图片资源????
@panda
就是不能完全解决 我这也是在做移植实验,还没有完全解决,解决了,我把帖子完善了。
var deps = cc.loader.getDependsRecursively(assets);
cc.loader.release(deps);
方法也不行,我用的浏览器启动游戏,查看的cc.loader._cache中的资源,看看有没有释放掉,发现还都在里边
帮顶啊,我现在就是这个问题 导致我无法上线。。 真的头痛。还有一个就是按文档里的方法把资源全扔服务器上面去了。。 但是发现。。 很容易导致按钮点不动 不知道为啥。。
cc.loader.releaseAll(); 使用 这个函数 cc.loader._cache 中的资源清掉,不过后果就是都给清除掉了。你试试哈。
cc.loader.loadResDir(“prefabs”,
function (completedCount, totalCount, item) {
let _progress = (completedCount / totalCount).toFixed(2);
if (item && item.uuid && _progress > self.loadBar.progress) {
self.loadBar.progress = _progress;
self.progressLabel.string = util.getValuePercent(_progress, 0);
}
}, function (err, assets) {
cc.log(“加载完成”);
// 加载 startUp
cc.director.loadScene(“StartUp.fire”);
cc.loader.releaseAll();
util.releaseNodeRes();
}
);
util.releaseNodeRes(); 这个是写的一个cc.loader._cache 分析方法 没什么实际用处。
cc.loader.releaseAll() 这个函数靠谱哈 刚刚我在所有的跳场景的地方都给加上了这个函数 感觉还行 没有在发生崩溃的现象 就是有的图片黑了 黑了应该是跳转过去没有加载出来 或是 什么地方我释放多了 但是感觉还是靠谱的 一会我去查查代码 要是能查到就解决释放过多的问题 要是不能解决 我就把公用的图集 在cc.loader.releaseAll() 后重新再加载一次。你试试我的思路。
兄弟 你看看 是不是点击按钮下方 按钮触摸有反应 要是的话,请参考这条。
兄弟,你是怎么擦好看cpu使用率跟内存的?我也有些手机小游戏会闪退.