Textureをグローバルに宣言したい
ryo 2017/02/17(Fri) 15:58
Siv3D初心者です。
Textureクラスはグローバル変数として初期化できないことは分かりました。
しかしその場合、同じ画像をテクスチャとして使用するオブジェクトを複数作成する場合、それぞれのオブジェクトの初期化時にテクスチャを読み込まなくてはいけないのでしょうか?
つまり、
class Monster{
private:
Texture m_texture;
public:
Monster(){
m_texture = Texture(L"...");
}
}
このようなクラスのオブジェクトをMain関数内で何体か生成した場合、それぞれが画像情報を持ってしまってメモリの無駄遣いであるということは無いのでしょうか。
また、Textureの読み込みにどれくらいの時間がかかるかわかりませんが、このようなオブジェクトを大量に配置する際に毎回読み込みを行うのは効率が悪い気がします。
あらかじめ何かしらの方法でグローバルに宣言されたTextureを随時参照する方法があるのでしょうか。それともこれらの心配は杞憂で、上記の方法のままでもよいのでしょうか。
Reputeless 2017/02/17(Fri) 19:31
投稿にある Monster の例だとメモリ消費は増えてしまい、効率も悪いです。
Texture にグローバルアクセスしたい場合は、アセット管理を使うのが便利です。
https://github.com/Siv3D/Reference-JP/wiki/アセット管理
また、Texture や Sound, Font などのアセットは参照カウンタを持つハンドルなので、
代入演算子 = やコピーコンストラクタでコピーした場合はメモリ消費は増えません。
【メモリ消費が増えない例】
Texture a(L"Example/Windmill.png");
Texture b = a;
Texture c = b;
TextureAsset::Register(L"aaa", L"Example/siv3d-kun.png");
Texture d = TextureAsset(L"aaa");
Texture e = TextureAsset(L"aaa");
【メモリ消費が増える例】
Texture a(L"Example/Windmill.png");
Texture b(L"Example/Windmill.png") ;
TextureAsset::Register(L"aaa", L"Example/siv3d-kun.png");
TextureAsset::Register(L"bbb", L"Example/siv3d-kun.png");
Texture d = TextureAsset(L"aaa");
Texture e = TextureAsset(L"bbb");
ryo 2017/02/17(Fri) 22:50
ありがとうございます!解決しました!
分かりやすい説明で助かります。