继上一篇 白鹭引擎Egret Engine-实现多场景(场景串联篇)
这篇开始会讲解在开发的过程中
使用单例的重要性
如果资讯有误或是有更好的资讯
非常非常欢迎各位指点与交流
Egret Engine Community TW
根据官网及网路上的教学中
会发现绝大多数的範例
都使用同样的方式去将场景挂载到画面上
像这样
let newScene = new egret.DisplayObjectContainer();
this.addChild(newScene);
这样的用法在简单的场景中不会有什么严重的问题
但是当画面变多了、元件变多了
就会造成重複生成同样的东西
进而影响到执行的效能
假设今天要新增一个画面
画面上有一个按钮
进入画面的时候想必顺序会是这样
let newScene = new egret.DisplayObjectContainer();
this.addChild(newScene);
let btn = new eui.Button();
newScene.addChild(btn);
接着如果我将newScene中的按钮
监听点击事件把画面移除
btn.addEventListener(egret.TouchEvent.TOUCH_TAP, () => {
this.removeChild(newScene);
}, this)
点击按钮便会移除画面
但如果下一次想进来这个画面
我就只能再重新执行一次
let newScene = new egret.DisplayObjectContainer();
this.addChild(newScene);
let btn = new eui.Button();
newScene.addChild(btn);
这时候问题就出现了
刚刚的画面被remove掉后在记忆体中被流放
下次要进这个场景我已经不知道怎么呼叫到同个场景实体了
如果画面上的元件不只一个
是两百个两千个
重複执行的后果可想而知
可以自行暴力测试看看
浏览器可能会爆炸... 哈哈
这边提供一个我的解法
建立一个类别或全域变数
我以类别的方式操作
首先将Main放进Gamecenter.rootScene这个属性中
要创建场景的时候使用这种方式
这样只要之后需要挂载同个画面
只要呼叫Gamecenter中的静态属性就好
不用再new一个新的实例
这种作法在开发的过程中
除了可以提升执行效能外
还可以避免很多开发上的困难
因此建议在开发的过程中
可以使用单例进行元件的创建
就儘量以单例去操作
收操