我創建了一個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
在此先感謝您提供的任何幫助!