偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

PixiJS 源碼深度解讀:用于循環(huán)渲染的 Ticker 模塊

開發(fā) 前端
Ticker 的作用是 在下一幀繪制前調(diào)用監(jiān)聽器,PixiJS 使用它來不斷對畫面進行重繪。

大家好,我是前端西瓜哥。這次來看看 PixiJS 的 Ticker 模塊源碼。

Ticker 的作用是 在下一幀繪制前調(diào)用監(jiān)聽器,PixiJS 使用它來不斷對畫面進行重繪。

使用

在我們 實例化 PIXI.Application 時,PIXI.Application 內(nèi)部注冊的插件之一的 TickerPlugin 會被初始化:

Application._plugins.forEach((plugin) => {
  plugin.init.call(this, options);
});

將 Application 的渲染器 renderer 的 render 方法注冊進去,然后每幀都會會被調(diào)用。

ticker = options.sharedTicker ? Ticker.shared : new Ticker();
ticker.add(this.render, this, UPDATE_PRIORITY.LOW);

也可以直接使用:

const ticker = new PIXI.Ticker();
// ticker.autoStart = true;

ticker.add(() => {
  console.log("前端西瓜哥");
});

ticker.add(() => {
  console.log("fe_watermelon");
});

ticker.start();

目錄結(jié)構(gòu)

Ticker 的代碼都在  packages/ticker 目錄下。

圖片

構(gòu)造函數(shù)

看一下 Ticker 的構(gòu)造函數(shù):

class Ticker {
  constructor() {
    this._head = new TickerListener(null, null, Infinity);
    this.deltaMS = 1 / Ticker.targetFPMS;
    this.elapsedMS = 1 / Ticker.targetFPMS;

    this._tick = (time: number): void => {
      this._requestId = null;

      if (this.started) {
        // Invoke listeners now
        this.update(time);
        // Listener side effects may have modified ticker state.
        if (this.started && this._requestId === null && this._head.next) {
          this._requestId = requestAnimationFrame(this._tick);
        }
      }
    };
  }
}

做了哪些事情:

(1)初始化一個空的監(jiān)聽器函數(shù)

this._head = new TickerListener(null, null, Infinity);

使用了鏈表來管理多個監(jiān)聽器函數(shù),所以這個空的 this._head 就是這個鏈表的頭部 哨兵節(jié)點(虛節(jié)點)。

哨兵節(jié)點是一個鏈表編程技巧,目的是讓真正的頭部節(jié)點能和其他普通節(jié)點有一致的實現(xiàn),不需要老是判斷 head 是否為 null,對頭節(jié)點做特殊處理,達到降低實現(xiàn)難度的目的。

監(jiān)聽器函數(shù)會被封裝成一個 TickerListener 的類,提供 priority(優(yōu)先級)、once(只執(zhí)行一次) 等特性。其中的 next 指向下一個監(jiān)聽函數(shù),確保監(jiān)聽器函數(shù)能夠按照注冊順序依次執(zhí)行。

不過 TickerListener 有個 優(yōu)先級的概念,監(jiān)聽器在加入的時候,會插入合適的位置,最終保證優(yōu)先級是從高往低的。優(yōu)先級類型在 UPDATE_PRIORITY 這個枚舉變量中。

順帶一提,application 的 render 方法優(yōu)先級是 UPDATE_PRIORITY.LOW,哨兵節(jié)點則是突破天際的 Infinity。

關(guān)于監(jiān)聽器函數(shù)鏈表的維護相關(guān)代碼,其實就是雙向鏈表的一些常規(guī)操作,本文不會過多敘述。

(2)執(zhí)行監(jiān)聽器函數(shù)

this.update(time);

這里是執(zhí)行所有監(jiān)聽器函數(shù)的地方。

其下的核心代碼為:

while (listener)
{
  listener = listener.emit(this.deltaTime);
}

listener.emit() 方法會執(zhí)行當(dāng)前的 listener 方法,并返回它的 next。不斷循環(huán),直到 next 為 null 結(jié)束。

(3)循環(huán)調(diào)用 this._tick 方法

this._requestId = requestAnimationFrame(this._tick);

這里用了瀏覽器提供的 requestAnimationFrame 方法,實現(xiàn)循環(huán)調(diào)用 this._tick 方法。為了方便描述,通常簡寫為 raf。

this.head.next 表示有注冊的監(jiān)聽函數(shù)。

結(jié)尾

Ticker 模塊并不復(fù)雜的,是對 requestAnimationFrame 的一層封裝,并使用鏈表做監(jiān)聽器函數(shù)的維護。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2023-10-09 07:49:33

PixiJSWebGL

2023-10-13 07:29:23

PixiJSRunner

2023-06-07 08:13:46

PixiJSCanvas 庫

2025-06-23 00:03:00

2021-07-26 11:07:34

主循環(huán)Cocos Creat源碼

2021-01-22 07:43:35

Filecoin循環(huán)供應(yīng)

2022-08-17 07:52:31

Spring循環(huán)依賴單例池

2024-09-06 09:37:45

WebApp類加載器Web 應(yīng)用

2020-12-15 09:03:23

TickerSleep定時執(zhí)行

2023-02-23 08:40:09

Pixijs修改圖形屬性

2009-07-15 16:29:39

Jython連接JavJavaUtils模塊

2025-01-24 08:34:29

pixijs圖形設(shè)置光標(biāo)cursor

2013-12-09 10:43:16

震網(wǎng)病毒StuxnetICS

2017-07-10 11:40:52

HP Helion匠心

2010-02-02 14:22:50

Python示例

2024-03-25 08:57:49

模塊迭代對象迭代器

2024-10-23 09:05:07

PixijsMatrixTransform

2022-03-24 14:40:31

開發(fā)Harmony鴻蒙

2015-06-15 10:32:44

Java核心源碼解讀

2024-10-28 08:15:32

點贊
收藏

51CTO技術(shù)棧公眾號