昨天有說到,圖片要放入 stage 前,需要先把圖片轉成 Sprite 的特殊圖片物件。
但是我們也可以先將圖片放進 材質暫存 (texture cache)。
什麼是「材質」(texture)?
PIXI 用 WebGL 的 GPU 渲染圖片,所以圖片需轉成 GPU 可用版本,可被 WebGL 處理圖片稱為「材質」(texture)。
而在放進 sprite 片前,將原始圖片轉成 WebGL texture 形式,可以提高效率。
PIXI 使用材質暫存 (texture cache)來儲存和參考所有 sprite 需要的材質。
let texture = PIXI.utils.TextureCache["images/anySpriteImage.png"];
let sprite = new PIXI.Sprite(texture);
在官網教學連結中有貼出這段程式碼,利用 PIXI.utils.TextureCache 將圖片加入暫存中,但我在實際使用後發現沒有任何效果,搜尋了一下之後發現官方文件並沒有公開提供這個方法。
且在 github issue 找到了官方開發者的說明
也許是被棄用,官方開發者建議使用 PIXI.loader
那我們就來看一下 PIXI.loader 的範例吧!
let imageURL = "./image/bunny.png";
PIXI.loader
    .add('bunny',imageURL)
    .load(init);
function init(loader,resources) {
    var bunny = new PIXI.Sprite(
        resources['bunny'].texture // get Texture Cache
    );
    app.stage.addChild(bunny);
}
把圖片放入 loader 中轉成材質暫存後在放入 Sprite 中。
add('bunny',imageURL) 的 'bunny' 可以選擇不寫, resources 的 key 值就會是 url 。
let imageURL = "./image/bunny.png";
PIXI.loader
    .add(imageURL)
    .load(init);
function init(loader,resources) {
    var bunny = new PIXI.Sprite(
        resources[imageURL].texture // get Texture Cache
    );
    app.stage.addChild(bunny);
}
但是千萬別這樣寫:
let imageURL = "./image/bunny.png";
PIXI.loader
    .add('bunny',imageURL)
    .load(init);
function init(loader,resources) {
    var bunny = PIXI.Sprite.fromImage(imageURL); 
    app.stage.addChild(bunny);
}
PIXI.Sprite.fromImage 與 PIXI.loader 是兩種不同的 API ,同時使用會造成破壞或重複存入記憶體暫存區。
PIXI.Sprite.fromImage 是比較方便的作法,直接傳入圖片的 url ,會判斷是否已經在材質暫存中,如果沒有就自動加載。
PIXI.loader 我覺得好用的地方在於,可以用陣列傳入引數:
PIXI.loader
    .add([
      "images/imageOne.png",
      "images/imageTwo.png",
      "images/imageThree.png"
    ])
    .load(setup);
那要如何查看暫存區的資訊呢?我們可以透過  PIXI.TextureCache 查看暫存區的資訊,不過官方文件上找不到這個屬性,不確定之後會不會被棄用。
那麼今天就先到這邊,一樣如果有錯誤及來源未附上歡迎留言指正,我們明天見!
參考資料: PIXI.utils.TextCache instead of PIXI.loader.resource?
PIXI.loaders.Loader
Preload all textures?