Egret置於後臺時,暫停遊戲邏輯 (Egret 5 )
官網教程-生命周期:http://developer.egret.com/cn/2d/lifecycle
主要是在遊戲置於後臺時,關閉遊戲邏輯、渲染邏輯和背景音樂,保證更好的用戶體驗。
一 Egret 5.1版本新API
5版本引入了egret.Ticker、egret.lifecycle API來暫停:
二 源碼位置
egret.ticker就是SystemTicker,同時lifecycle也在SystemTicker.ts 文件裏。
三 暫停流程
首先在WebLifeCycleHandler裏監聽window的focus(獲得焦點)和blur(沒有焦點)事件
觸發時,則調用lifecycle的resume和pause方法。執行定義的onPause和onResume,停止和恢復心跳,再派發ACTIVE和DEACTIVE事件。
四 停止和恢復心跳
egret.Ticker.pause()和egret.Ticker.resume() 用來設置paused標誌位。
在startTick中調用update,如果標誌位暫停狀態,則返回;如果運行狀態,則繼續執行。
其他:
1 4.1.0版本如何實現5中的暫停?
布吉島
2 暫停後動畫效果如何運行?
分別讓兩個動畫在EnterFrame和Tween裏執行
EnterFrame:
暫停時動畫會停在當前位置,恢復時動畫會從當前位置繼續執行。
因為EnterFrame事件是根據心跳來計算時間廣播的,心跳停止了,那麽廣播也就停止了。
Tween:
測試一個Sprite循環在y軸上運動
暫停時停在當前位置,恢復時動畫會從 (當前時間- 停止時間) 位置繼續執行。
比如Tween 1秒走100像素,停止了2秒,則恢復時會從200像素位置開始繼續運動。
因為Tween類裏的lastTime記錄的是停止時間,這個lastTime沒有隨著系統時間更新而更新,delta隨著暫停時間而變大,而delta直接參與了setPosition(delta)。
粒子動畫
未測試
MovieClip動畫
未測試
總結:凡是根據心跳update來更新的動畫都會從當前位置停止,從當前位置恢復。
如果不是,例如Tween,自行記錄了lastTime,而這個lastTime不會根據心跳來更新,那麽要視具體實現原理分析。
3 暫停後計時器如何運行?
暫停時,從當前計時位置暫停。
恢復時,從當前計時位置恢復。
例如計時1s執行一次代碼,則暫停10s,這10s內不會觸發計時器執行任何代碼。
恢復時,則會立刻執行一次代碼,因為(當前時間 - 停止時間) = 10秒 > 1秒 ,會立刻觸發一次TIMER事件。
4 暫停後服務器發送的事件會有什麽影響?
Egret置於後臺時,暫停遊戲邏輯 (Egret 5 )