2014-02-23 53 views
0

我創建了一個XNA遊戲,可以從多個精靈創建隨機島。它在一個單獨的線程中創建它們,然後使用RenderTarget2D將它們編譯爲單個紋理。RenderToTarget的XNA第二圖形設備

要創建我的RenderTarget2D我需要一個圖形設備。如果我使用自動創建的圖形設備,大多數情況下工作正常,除了在主遊戲線程中繪製調用與它衝突。在圖形設備上使用lock()會導致閃爍,即使如此,紋理有時也無法正確創建。

如果我創建自己的圖形設備,沒有衝突,但島嶼永遠不會正確渲染,而不是純粹的黑色和白色。我不知道爲什麼會發生這種情況。基本上我需要一種方法來創建第二個圖形設備,讓我得到相同的結果,而不是黑色/白色。任何人有任何想法?

下面是我使用的嘗試由TextureBuilder創建爲獨佔使用我的第二個圖形設備代碼:

var presParams = game.GraphicsDevice.PresentationParameters.Clone(); 
      // Configure parameters for secondary graphics device 
      GraphicsDevice2 = new GraphicsDevice(game.GraphicsDevice.Adapter, GraphicsProfile.HiDef, presParams); 

下面是我使用的渲染我的島嶼到一個單獨的貼圖代碼:

public IslandTextureBuilder(List<obj_Island> islands, List<obj_IslandDecor> decorations, SeaGame game, Vector2 TL, Vector2 BR, int width, int height) 
    { 
     gDevice = game.Game.GraphicsDevice; //default graphics 
     //gDevice = game.GraphicsDevice2 //created graphics 

     render = new RenderTarget2D(gDevice, width, height, false, SurfaceFormat.Color, DepthFormat.None); 

     this.islands = islands; 
     this.decorations = decorations; 
     this.game = game; 

     this.width = width; 
     this.height = height; 

     this.TL = TL; //top left coordinate 
     this.BR = BR; //bottom right coordinate 
    } 

    public Texture2D getTexture() 
    { 
     lock (gDevice) 
     { 
      //Set render target. Clear the screen. 
      gDevice.SetRenderTarget(render); 
      gDevice.Clear(Color.Transparent); 

      //Point camera at the island 
      Camera cam = new Camera(gDevice.Viewport); 
      cam.Position = TL; 
      cam.Update(); 

      //Draw all of the textures to render 
      SpriteBatch batch = new SpriteBatch(gDevice); 
      batch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, cam.Transform); 
      { 
       foreach (obj_Island island in islands) 
       { 
        island.Draw(batch); 
       } 
       foreach (obj_IslandDecor decor in decorations) 
       { 
        decor.Draw(batch); 
       } 
      } 
      batch.End(); 

      //Clear render target 
      gDevice.SetRenderTarget(null); 

      //Copy to texture2D for permanant storage 
      Texture2D texture = new Texture2D(gDevice, render.Width, render.Height); 
      Color[] color = new Color[render.Width * render.Height]; 
      render.GetData<Color>(color); 
      texture.SetData<Color>(color); 

      Console.WriteLine("done"); 

      return texture; 
     } 

這裏會發生什麼,用透明背景(通常不會,如果我使用默認設備) http://i110.photobucket.com/albums/n81/taumonkey/GoodIsland.png

這裏的情況發生時的默認設備衝突,主線程管理調用清除()(即使它是鎖着的太) NotSoGoodIsland.png(需要10聲譽....)

這裏的時候我用我自己發生了什麼圖形設備 http://i110.photobucket.com/albums/n81/taumonkey/BadIsland.png

在此先感謝您提供的任何幫助!

回答

0

我可能已經通過將RenderToTarget代碼移動到Draw()方法並在第一次調用Draw()時從主線程中調用它來解決此問題。