Próbuję rysować na ekranie piksel po pikselu za pomocą XNA, ale mam problemy z zasobami. Sądziłem, że najlepszym sposobem jest posiadanie 1 tekstury, która aktualizuje każdą klatkę, ale mam problem z jej aktualizacją. Oto co mam do tej pory, tylko jako test:Jak narysować 2D piksel po pikselu w XNA?
Texture2D canvas;
Rectangle tracedSize;
UInt32[] pixels;
protected override void Initialize()
{
tracedSize = GraphicsDevice.PresentationParameters.Bounds;
canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color);
pixels = new UInt32[tracedSize.Width * tracedSize.Height];
base.Initialize();
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
pixels[100] = 0xFF00FF00;
canvas.SetData<UInt32>(pixels, 0, tracedSize.Width * tracedSize.Height);
spriteBatch.Begin();
spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
Kiedy Draw() jest wywoływana po raz drugi pojawia się następujący błąd:.
„Operacja została przerwana, nie może zmodyfikuj zasób, który został ustawiony na urządzeniu lub po jego użyciu w nawiasie klamrowym. "
Jeśli spróbuję utworzyć nowy Texture2D w Draw(), szybko wystąpi błąd braku pamięci. Dotyczy to systemu Windows Phone. Wygląda na to, że próbuję zrobić to w niewłaściwy sposób, jakie mam inne opcje, aby to zadziałało?
Nie znałem odpowiedzi, więc szukałem w Google "tekstur proceduralnych xna" (co tak się nazywa). Wydaje się, że nie ma prostego, wbudowanego sposobu, aby to zrobić. Istnieją co najmniej trzy wspólne sugestie (buforowanie, polecenia tekstur GPU, robienie tego w module cieniującym). Ten ostatni jest oczywiście optymalny, ale wymaga wiedzy o programowaniu shaderów. Możesz wykonać to samo wyszukiwanie i przejrzeć, co tam jest. – Tergiver