LoginSignup
1

More than 5 years have passed since last update.

libGDXの基礎19 CIMを使ってテクスチャロードを高速化する

Posted at

今までは画像はpng等を利用していましたが、今回はCIMを使ってテクスチャのロード時間を短縮します。

CIMとは

CIMとはいわばPixmapをシリアライズしたフォーマットです。PixmapはTextureへ転送するフォーマットそのもののため、変換が入るPNGやJPEGと比べて高速にロード可能です。

ヘッダは12バイト。幅と高さとピクセルフォーマットが4バイトずつというシンプルなものです。ピクセルデータはそのままのべたフォーマットです。スマホでよく使うRGBA4444フォーマットなどは特に顕著で、PNGを利用するよりもロード時間が大幅に早く、具体的に半分近くになります。スペックの低いマシンではファイル数が大きいとかなりの差になります。

ただし、べただとファイルサイズが大きくなりすぎるのでzlib圧縮されています。

CIMのつくり方

シンプルなので自分で作ってもよいですが、ここは用意されたクラスを使いましょう。

PixmapIO.writeCIM(FileHandle file, Pixmap pixmap)

という手軽につかえるstaticメソッドが用意されています。

CIMを使う

使い方は今までと変わりません。今までテクスチャのpngやjpegをロードしていた画像名にcimのファイルをロードするだけです。

Texture tex = new Texture("hoge.cim");

ロード部分のlibGDXのソースは以下のようになっています。

public static TextureData loadFromFile (FileHandle file, Format format, boolean useMipMaps) {
    if (file == null) return null;
    if (file.name().endsWith(".cim")) return new FileTextureData(file, PixmapIO.readCIM(file), format, useMipMaps);
    if (file.name().endsWith(".etc1")) return new ETC1TextureData(file, useMipMaps);
    if (file.name().endsWith(".ktx") || file.name().endsWith(".zktx")) return new KTXTextureData(file, useMipMaps);
    return new FileTextureData(file, new Pixmap(file), format, useMipMaps);
}

はい、cimならそのまま使えますね。ktxやetc1も使えるのがわかります。拡張子で判別しているのでそこだけ気を付けてください。

zktxはgzip圧縮したktxです。ktxを使う場合はこちらを使うのが良いでしょう。etc2は再圧縮でそれなりにサイズが縮むことも多いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1