He mirado alrededor de un lote y los únicos métodos que he encontrado para la creación de un Texture2D de un mapa de bits son:¿Existe una alternativa rápida a la creación de un Texture2D a partir de un objeto Bitmap en XNA?
using (MemoryStream s = new MemoryStream())
{
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin);
Texture2D tx = Texture2D.FromFile(device, s);
}
y
Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
Dónde rgbValues es una matriz de bytes que contiene la década de mapa de bits datos de píxeles en formato ARGB de 32 bits.
Mi pregunta es, ¿hay algún enfoque más rápido que pueda probar?
Estoy escribiendo un editor de mapas que tiene que leer en imágenes de formato personalizado (mosaicos de mapas) y convertirlos en texturas Texture2D para mostrar. La versión anterior del editor, que era una implementación de C++, convertía las imágenes primero en mapas de bits y luego en texturas que se dibujaban con DirectX. He intentado el mismo enfoque aquí, sin embargo, los dos enfoques anteriores son demasiado lentos. Para cargar en la memoria, todas las texturas requeridas para un mapa tardan aproximadamente 250 segundos para la primera aproximación y para la segunda aproximación aproximadamente 110 segundos en una computadora con especificaciones razonables (para comparación, el código C++ tardó aproximadamente 5 segundos). Si hay un método para editar los datos de una textura directamente (como con el método LockBits de la clase Bitmap), entonces podría convertir las imágenes de formato personalizado directamente en Texture2D y, con suerte, ahorrar tiempo de procesamiento.
Cualquier ayuda sería muy apreciada.
Gracias
¿No debería ser "de la persona que llama" en lugar de "llamar"? A los fines del usuario de este código, es esta función la que llama el destinatario. – drxzcl
Gracias por su respuesta, sin embargo, en mi pregunta original quise decir que había intentado este enfoque: usar SetData(). Ejecuté algunos análisis adicionales, y para crear los mapas de bits usando LockBits tomó 2.7 segundos. Cuando agregué a ese código, para cada Bitmap generado: Texture2D tx = new Texture2D (dispositivo, bmp.Width, bmp.Height, 0, TextureUsage.None, SurfaceFormat.Color); ¡Aumentó el tiempo requerido a 74 segundos! Solo para crear una textura en blanco para cada mapa de bits, y ni siquiera llenarlo. Este tipo de tiempo de carga no es aceptable para un juego 2D. No creía que XNA fuera tan lento. :/ –
@Ranieri, gracias - ¡corregido! – bufferz