2011-09-16 22 views
5

busco un problema de rendimiento en la parte de dibujo de mi código XNA para Windows Phone 7 que occures a veces después de algunos segundos. ¿Hay alguna mejor práctica sobre cómo/cuándo llamar al SpriteBatch. ¿Empezar a dibujar algo? En caso de que se llama para cada par de sprites (en cada clase cuando se extrae el jugador, el fondo, los objetos del fondo, ...) o lo haría un llamamiento en el inicio -> dibujar todo en todas las subclases - ser mejor para el rendimiento?llamar SpriteBatch.Begin() /. Fin()?

Respuesta

2

No use más de lo necesario, porque Begin() significa preparar el dispositivo para la representación de sprites y Fin() significa restaurar a su estado anterior. Esto puede variar a través de algunos indicadores en Begin() diciéndole que no quiere cambios de estado, y puede complicar su código porque tendría que configurar manualmente algunos estados.

Los cambios de estado del dispositivo son a menudo lentos y debe evitar hacerlo si no es necesario, también pueden interferir con cualquier cosa que haga, por lo que si desea procesar algo que no está en SpriteBatch debe llamar a End(), pero estás renderizando sprites deberías llamarlo una vez para todos los sprites.

Para evitar llamar Fin() para modificar los estados que no aparecen en el sprite anterior, debe llamar a flush() en lugar de Fin(). Esto representa los sprites en cola con las transformaciones actuales y los estados del dispositivo, pero deja intactos los estados. Lo que hace la función End() es llamar a Flush() y restablecer estados particulares establecidos por Begin().

2

Lo mejor desde el punto de vista del rendimiento es llamar al inicio/finalización solo una vez por Draw(), esto hace que todos los sprites en un lote sean procesados ​​por la tarjeta gráfica al mismo tiempo. Solo deberías usar lotes de sprites múltiples si es necesario. Los ejemplos de cuándo se puede necesitar son:

  • desea aplicar un efecto sólo a ciertos sprites, pero no a otros
  • usted quiere tomar una captura de pantalla
  • que quiere hacer algo más complejo con efectos

¿Alguien puede pensar en otra razón para varios lotes de sprites (principio-> fin)?

+0

La lista de sobrecargas para comenzar es aquí: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspx Si quieres algo diferente aquí, tales como pasar un efecto personalizado o una matriz de transformación diferente, debe hacer otra llamada. –

+0

Hola, no es capaz de tomar la captura de pantalla de la imagen que están en un sprite específica, pero fue capaz de tomar la captura de pantalla en un sprite diferente. Alguna idea, por qué esto pudo haber sucedido? – nagavamsikrishna

+0

@salsabear, eso suena como material para una nueva pregunta. Si incluye el código en la pregunta, asegúrese de incluir solo las porciones de reasignación. –