テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unityでテクスチャを読む7つの方法 4・5・6について

[Unity]Unityでテクスチャを読む7つの方法 の4,5,6について。

1. モデルのマテリアルにTextureを貼っつけてシーンに配置
2. Resourcesにファイルを配置し、Resources.Load
3. AssetBundleにテクスチャを格納し、bundle.Load
4. WWWからテクスチャをダウンロードし、www.textureNonReadable
5. WWWからテクスチャをダウンロードし、www.LoadImageIntoTexture
6. IO.Fileでテクスチャのbytesを取得し、texture2d.LoadImage

7. ネイティブプラグインでTextureを作ってTexture2D.CreateExternalTextureとtexture2d.UpdateExternalTextureで取得

7つの内の3つ、pngjpegを読む方法について。
これは大きく分けると、4と56に分けられる。その特性は、Texture2Dを作るか、更新するかの違い。



www.textureNonReadableは、単純にWWWクラスでテクスチャをダウンロード・もしくはロードし、そのバイナリをテクスチャとして読み込む…といった物。

同様の機能にwww.textureがあるのだが、説明文いわく「読書不可なテクスチャであるため、システムメモリを効率的に開放します」との事。処理速度も変わらないので、特に理由がなければこちらを採用するのが良さそうだ。

WWW.textureNonReadable

ちなみに、www.textureやwww.textureNonReadableは内部的にTexture2Dを生成しているらしく、明示的に破棄しなければメモリに残り続ける。使い終わったらDestroyやUnloadUnusedAssets等で必ず破棄しよう。


www.LoadImageIntoTextureはwww.LoadImageIntoTextureとは違い、渡されたtexture2dを更新する。この際、texture2dの属性やサイズ等を解析結果の画像に合わせるので、この部分が異なる場合は若干負荷がかかる。

こちらは更新なので、textureを何度読み込んでもメモリに常駐する事は無く、割と効率的に使える。また、www.textureと比べて概ね2割高速。

但し高速に読むには「mipmapがoff」「サイズが一致」「フォーマットが一致」なtexture2dを指定してやる必要がある。また、何故か1発めは何時も若干遅い。


WWW.LoadImageIntoTexture


IO.Fileでバイナリを取得しtexture2d.LoadImageを取得する方法も、挙動的にはLoadImageIntoTextureと同一っぽい。texture2d云々の所も一緒。ただ同期読みが出来るので、ゲームが進められない時間(≠画面が固まる時間)を短くしたい場合は若干有効な手。

Texture2D.LoadImage

ちなみにbyteなら何でも良いので、TextureAssetとしてアプリのリソースに組み込んだpngjpegも読める。特にandroidの場合はwwwで読むと管理が面倒だったり丸見えだったりするので、この手法は有効かもしれない。(テクスチャの変換が走らないからキャッシュサーバー要らず)
なおこの方法で生成するテクスチャは書込が可能設定なので、メモリを倍消費する。これを回避するにはTexture2D.Apply(true, true);を実行する。

[Unity]アプリサイズを減らす その3