成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PixiJS 源碼深度解讀:用于循環渲染的 Ticker 模塊

開發 前端
Ticker 的作用是 在下一幀繪制前調用監聽器,PixiJS 使用它來不斷對畫面進行重繪。

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

Ticker 的作用是 在下一幀繪制前調用監聽器,PixiJS 使用它來不斷對畫面進行重繪。

使用

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

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

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

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();

目錄結構

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

圖片

構造函數

看一下 Ticker 的構造函數:

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)初始化一個空的監聽器函數

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

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

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

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

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

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

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

(2)執行監聽器函數

this.update(time);

這里是執行所有監聽器函數的地方。

其下的核心代碼為:

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

listener.emit() 方法會執行當前的 listener 方法,并返回它的 next。不斷循環,直到 next 為 null 結束。

(3)循環調用 this._tick 方法

this._requestId = requestAnimationFrame(this._tick);

這里用了瀏覽器提供的 requestAnimationFrame 方法,實現循環調用 this._tick 方法。為了方便描述,通常簡寫為 raf。

this.head.next 表示有注冊的監聽函數。

結尾

Ticker 模塊并不復雜的,是對 requestAnimationFrame 的一層封裝,并使用鏈表做監聽器函數的維護。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

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

主循環Cocos Creat源碼

2021-01-22 07:43:35

Filecoin循環供應

2022-08-17 07:52:31

Spring循環依賴單例池

2024-09-06 09:37:45

WebApp類加載器Web 應用

2020-12-15 09:03:23

TickerSleep定時執行

2023-02-23 08:40:09

Pixijs修改圖形屬性

2009-07-15 16:29:39

Jython連接JavJavaUtils模塊

2013-12-09 10:43:16

震網病毒StuxnetICS

2025-01-24 08:34:29

pixijs圖形設置光標cursor

2010-02-02 14:22:50

Python示例

2017-07-10 11:40:52

HP Helion匠心

2024-10-23 09:05:07

PixijsMatrixTransform

2022-03-24 14:40:31

開發Harmony鴻蒙

2024-03-25 08:57:49

模塊迭代對象迭代器

2010-01-05 17:52:34

JSON形式

2015-06-15 10:32:44

Java核心源碼解讀
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一二三区 | 91精品国产91久久久久久最新 | 国产精品视频免费观看 | 亚洲国产精品成人综合久久久 | 色香蕉在线 | 天天天天操 | 日韩国产精品一区二区三区 | 欧美精品一二区 | 激情网五月天 | 成人婷婷 | 亚洲精品一区二 | 欧美日韩视频 | 亚洲最大成人综合 | 波霸ol一区二区 | 亚洲成人自拍 | 亚洲一区在线日韩在线深爱 | 91视频进入 | 亚洲精品一区二三区不卡 | 国产精品久久99 | 一区二区三区高清 | 久婷婷| 国产在线观看不卡一区二区三区 | 欧美成人高清 | 国产超碰人人爽人人做人人爱 | 亚洲国产精品久久久 | 一区二区三区视频免费看 | 日韩精品在线观看一区二区 | 久久久91精品国产一区二区三区 | 中文字幕国产视频 | 麻豆视频在线看 | 操操日 | 天天综合天天 | 国产成人精品a视频一区www | 久久久精品国产 | 久久久久国产一级毛片高清网站 | 成人免费网站视频 | 在线国产一区 | 中文字幕在线二区 | 欧美成人精品一区二区男人看 | 成人精品一区二区三区中文字幕 | 亚洲一区二区精品视频 |