场景切换过程中黑屏的疑惑

  • Creator 版本:2.0.5

  • 目标平台: Web

我把使用cc.loader.loadRes的资源设置为cc.loader.setAutoReleaseRecursively(assert, true);
发现cc.loader._cache中在切换场景中是被释放了,但是问题来了,切换场景的时候黑屏好久,是不是刷新了一次render变成默认了,哪怕是不刷新停留在原界面也是好的啊

尝试了常驻节点,也有问题,求解决思路

@jare @Knox @huanxinyin

1赞

是否可以切换到下一个场景再去做释放?毕竟场景加载需要点时间的,对于复杂的场景,更是如此。还有你可以把场景细分,做成几个prefab动态加载,优化场景的显示速度。

setAutoReleaseRecursively以后,是引擎调用loadScene的时候选择的释放时机吧

已经把spine,icon,子界面,都是通过prefab动态加载了,否则一个scene完整加载肯定吃不消

@huanxinyin

其实我试过 cc.loader.loadRes后不使用setAutoReleaseRecursively,并且不勾选场景自动释放还稍微好一些,但是还是有一瞬间的黑屏。

@huanxinyin

这个是否有临时方案,比如在加载场景过程中,不clear,可以保持他在上一个scene的最后画面中?

@huanxinyin

否则用scene必然有黑屏的情况存在,只能通过减少加载scene,或者使用延迟加载,感觉scene正常加载是否就有点奇怪了?

黑屏是因为场景被切换后,新场景的资源还未完全加载,如果你是大场景,节点数据的解析也要一定时间,不黑屏也会出现加载卡顿的情况,建议还是要根据自己的情况,对界面进行细化分离和合理安排资源的分布加载时机。

@huanxinyin

我已经使用cc.director.preloadScene进行了处理后再进行loadScene的操作了。好吧,也谢谢了。黑屏问题很多帖子我都看了,都是不了了之。希望以后能有比较好的解决方案。

在新的场景渲染完成后,再去释放上一个场景的资源。

@虣虣

恩,先这么做了。谢谢~

我记得以前 Creator 是没这个问题的。资源的释放和新场景的载入,是在一帧内完成的,这一帧不论怎么卡,都不会在卡顿结束前进行渲染才对,所以不应该变成黑屏。

@jare
是的,我觉得也应该在一帧内进行,场景加载和释放应该不渲染,而且我发现在场景切换释放过程中好像渲染没有停止,导致也会有一些渲染的报错。

释放场景是阻断的 JS 执行过程,引擎不会在中途做 gl clear 之类的操作,感觉是浏览器在刷新 frame buffer,这个可能是具体浏览器底层行为导致的,有一个 gl option 可能和这个问题有关系:preserveDrawingBuffer,我们没有默认开启,因为这个 option 会导致在一些其他浏览器上的帧乱序问题

@panda
确实是这个问题,如果再ccgame.js中把开启环境判断去掉,是解决这个问题

蛋疼,开启这个 flag 后,在某些浏览器上可能会表现为渲染的帧顺序不对,连续动画看起来就可能会有一些跳动。
难道要把这个 flag 重新开启么?其它小伙伴有更好的解决方法吗?

切换场景的中间难道不用loading界面的吗?

用单场景,其他场景都做成预制体

肯定有loading,用preloadScene进行预加载的,但是加载完后再调用loadScene,是调用runSceneImmediate的时候黑屏

呵呵,但是这样setAutoReleaseRecursively这些设计出来意义就不大了,scene几乎就是不能商用了

没办法的办法了