白鹭引擎Egret Engine-单例的重要性

继上一篇 白鹭引擎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掉后在记忆体中被流放
下次要进这个场景我已经不知道怎么呼叫到同个场景实体了
如果画面上的元件不只一个
是两百个两千个
重複执行的后果可想而知
可以自行暴力测试看看
浏览器可能会爆炸... 哈哈http://img2.58codes.com/2024/emoticon64.gif


这边提供一个我的解法

建立一个类别或全域变数

http://img2.58codes.com/2024/20113641XMyCFrNL4H.png

我以类别的方式操作

http://img2.58codes.com/2024/20113641kVBICpKkxU.png

首先将Main放进Gamecenter.rootScene这个属性中

要创建场景的时候使用这种方式

http://img2.58codes.com/2024/20113641pVbNnFMzWo.png

这样只要之后需要挂载同个画面
只要呼叫Gamecenter中的静态属性就好
不用再new一个新的实例

这种作法在开发的过程中
除了可以提升执行效能外
还可以避免很多开发上的困难
因此建议在开发的过程中
可以使用单例进行元件的创建
就儘量以单例去操作

收操 http://img2.58codes.com/2024/emoticon29.gif


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章