今回は出来るだけシンプルにマルチスレッドを使用しコンテントの読み込みをする方法を紹介します。ちなみに、スレッドセーフ系統の事は考慮してないので、それは何時か別の記事で付け足す予定です。
今回は、Texture2Dの読み込みでマルチスレッドの方法を説明します。なのでまず、Texture2Dを管理するクラスを作ります。
全てのテクスチャはDictionary内で管理するので、それの宣言と現在いくつのテクスチャが有るかを示す変数も宣言します(ローディング中に何%完了しているかを描画したりする時に使えます)。
public static class TextureManager { static ContentManager m_content; static Dictionary<string, Texture2D> m_textures = new Dictionary<string, Texture2D>(); static int m_texturesLoaded = 0;
次に初期化をします。今回はコンテントマネージャーへの参照を保存するだけです。
public static void Initialize(Game game) { m_content = game.Content; }
次はメインのテクスチャの読み込みです。マルチスレッドで何かをする一つの方法は以下の用に結構簡単に実装できます。
// スレッドの処理する中身を設定 ThreadStart threadStarter = delegate { // ..ココにスレッド内の処理を実装 }; // スレッドを作り、始める Thread loadingThread = new Thread(threadStarter); loadingThread.Start();
なので、これを利用しテクスチャの読み込みを実装します。基本的には、スレッド内でテクスチャを読み込み、Dictionary内に保存し、テクスチャの数の合計を増やすだけです。
public static void LoadTexture(string textureName) { if ( textureName != null && !m_textures.ContainsKey(textureName) ) { // スレッドの処理する中身を設定 ThreadStart threadStarter = delegate { //スレッド内の処理を実装 Texture2D texture = m_content.Load<Texture2D>(textureName); m_textures.Add(textureName, texture); m_texturesLoaded++; }; // スレッドを作り、始める Thread loadingThread = new Thread(threadStarter); loadingThread.Start(); } }
後は、保存されているテクスチャをTextureManagerクラスから受け取るメソッドを作るだけです:
public static Texture2D GetTexture(string name) { if (name != null && m_textures.ContainsKey(name)) { return m_textures[name]; } return null; }
これで基本的なことは終わりました。実際に使用するにはまず初期化をし、その後テクスチャを読み込むメソッドを呼んでください。
protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); TextureManager.Initialize(this); TextureManager.LoadTexture("title"); }
そして、その後はテクスチャをマネージャーから受け取り、描画するだけです:
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); Texture2D tex = TextureManager.GetTexture("title"); if (tex != null) { spriteBatch.Begin(); spriteBatch.Draw(tex, Vector2.Zero, Color.White); spriteBatch.End(); } base.Draw(gameTime); }
今回はココまでです。ちなみに、テクスチャアを削除する時のマルチスレッドは読み込みと同じ方法で実装できます。