成人免费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-03-25 08:57:49

模塊迭代對象迭代器

2022-03-24 14:40:31

開發Harmony鴻蒙

2016-10-08 22:02:01

大數據時代大數據

2015-06-15 10:32:44

Java核心源碼解讀

2024-10-28 08:15:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费在线视频 | 5060网一级毛片 | www.日韩在线 | 精品久久久久久久久久久下田 | 日本精品久久 | 国产激情在线 | 亚洲精品无 | 九九精品在线 | 成人超碰在线 | 黄网站涩免费蜜桃网站 | 国产一区二区三区四区三区四 | 亚欧洲精品在线视频免费观看 | 狠狠骚| 亚洲二区视频 | 亚洲 欧美 日韩在线 | 亚洲午夜精品久久久久久app | 亚洲精品一区二区网址 | 亚洲人成人一区二区在线观看 | 欧美三级在线 | 亚洲精品视频在线观看视频 | 天天射视频 | 国产精品久久久久久久久免费丝袜 | 日本三级做a全过程在线观看 | 亚洲精品日韩一区二区电影 | 正在播放国产精品 | 一级片免费视频 | 久久五月婷 | 久久久九九九九 | 在线观看黄色电影 | 自拍偷拍小视频 | 国产美女精品 | 亚洲精品视频免费观看 | 美女爽到呻吟久久久久 | 国产精品日韩一区 | 国产精品久久午夜夜伦鲁鲁 | 欧美一级视频免费看 | 欧美一级视频免费看 | 亚洲三区视频 | 国产精品色 | 国产一区在线免费观看 | 欧美电影在线 |