各種Assetクラス
tea  2021/01/30(Sat) 07:36
TextureAssetクラスなどはHashTable<String, Texture>などと何が違うのでしょうか
記事編集
Reputeless  2021/01/31(Sun) 00:49
TextureAsset は内部で HashTable を使っているので、動作の見た目としては同じです。
https://github.com/Siv3D/OpenSiv3D/blob/6deaaca31075b16f5727a6c44a932636b71b33b9/Siv3D/src/Siv3D/Asset/CAsset.hpp#L24

違いは以下の通りです
・TextureAsset(...) は関数なので、<Siv3D.hpp> をインクルードしたファイルのどこからでも呼べます
・TextureAsset で登録するのは Texture クラスではなく TextureAssetData クラスです。そこでは「ロードのときの挙動」を登録するので、Image や Emoji, もしくはプログラムで Texture を生成する関数なども、一括して扱えます(https://github.com/Siv3D/OpenSiv3D/blob/6deaaca31075b16f5727a6c44a932636b71b33b9/Siv3D/src/Siv3D/TextureAsset/SivTextureAsset.cpp#L175)
・TextureAsset で登録しているのは「ロードのときの挙動」なので、Texture は実際には読み込んでいません(AssetParameter::LoadImmediately() で登録時にロードさせることもできます)。必要な時までロードを遅延できるので、ゲームやアプリケーションの起動を高速化できます
・TextureAsset には、非同期ロードや、(将来的予定してる機能として)タグを指定して一括削除など、単純に HashTable を使うよりも便利な補助機能が提供されます

局所的に使う場合は HashTable<String, Texture> のほうが都合が良い場合もあるでしょう。一方で、ゲームやアプリケーション全体で Tetxure を共有するときなどは TextureAsset が便利なケースが多いと思いますし、より便利になるようにしていきたいと思っています。要望や気になることがあれば、ぜひコメントや GitHub への Issue でお知らせください。
編集
tea  2021/01/31(Sun) 08:47
ありがとうございます
2つ目の違いの「Image や Emoji」がよくわからなかったのですが、HashTableにTexture(Image)やTexture(Emoji)を入れるのとどう違うのでしょうか
また、HashTableの方が都合が良い場合というと、特定のシーン内でしか使わないようなTextureがあるような場合でしょうか
編集
Reputeless  2021/01/31(Sun) 11:34
・Texture(Emoji) を HashTable<String, Texture> に入れると、その時点で Texture が作成されてメモリを消費します。しかし、TextureAsset での実装方式である「Texture(Emoji) を返す関数の登録」は、その時点で Texture は作成されないのでメモリの節約になります

HashTable の方が都合が良い例:
・TextureAsset はプログラム全体に影響を及ぼすので、1 つのアプリケーションを別々の人が作成する場合、名前が衝突しないように調整する必要があります
・ある 1 つのクラスのメンバ変数で HashTable<String, Texture> を使うと、そのクラスの破棄時にそのすべてのテクスチャが破棄されることが保証されますが、TextureAsset では明示的に Release する必要があります
・HashTable<String, Texture> を使うと、ループでのアクセスや要素数取得など HashTable のメンバ関数を使うことができますが、TextureAsset ではできません
編集
件名
Re: 各種Assetクラス
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -