2010-09-08 12 views
7

Estoy trabajando en un juego en C# (ya sea 2.0 o 3.5 aún no lo he decidido). El juego se jugará en un mapa con una cuadrícula hexagonal. Aprecio que la interfaz de usuario para este mapa debe usar doble almacenamiento en búfer (muchas capas, por lo que el dibujo lento). Sé que puedo habilitar el doble almacenamiento en búfer a través de un estilo, o crear mi propio búfer y manejarlo yo mismo. La mayoría de las recomendaciones que encuentro en la web son para manejarlo usted mismo. Me pregunto por qué? Obviamente, esto me permite evitar las suposiciones que son inherentes al doble buffer de control, pero no sé cuáles son esas suposiciones.¿Por qué debería hacer doble buffer manual?

De nuevo, no estoy buscando un código para explicar cómo usar mi control doble buffer, sino más bien ¿por qué construirlo yo mismo en lugar de usar el estilo de doble buffer y permitir que la clase CLR/Control lo maneje?

Respuesta

3

En WFA, doble búfer ralentiza el rendimiento, sin eliminar por completo el parpadeo en zonas gráficos personalizados.Para los elementos integrados de la GUI, como si creara un juego creado a partir de ImageButtons y Labels, el modo incorporado de doble buffer es excelente para ocultar el redibujado del árbol de control. Sin embargo, hay un par de grandes problemas con usarlo para un área de dibujo personalizado:

  • El buffer sorteo creó cuando se acaba de configurar la aplicación para dibujar de doble memoria intermedia se utiliza para dibujar toda la ventana y todos los controles secundarios , no solo su área de dibujo personalizada, por lo que agrega la sobrecarga de volver a dibujar cada elemento de la GUI en el búfer posterior antes de voltear la página.
  • Si algo invalida el control, se llama al método Paint. Es posible que no termine de dibujar cuando eso suceda y que obtenga una imagen incompleta que se muestra al usuario (no es buena en gráficos en tiempo real).

Al mantener la GUI de la ventana básica de un solo búfer, pero al crear un área en la que controla el almacenamiento en búfer, ambos problemas se reducen al mínimo.

Los métodos de doble búfer pueden ser tan simples como crear un objeto Bitmap como un back-buffer y dibujarlo en el área de dibujo cuando esté listo y listo, o configurar un BufferedGraphicsContext separado para administrar el búfer de su dibujo personalizado zona.

4

De MSDN:

Para aplicaciones gráficamente intensivas tales como animación, a veces se puede mejorar el rendimiento mediante el uso de un BufferedGraphicsContext dedicada en lugar de la BufferedGraphicsContext proporcionada por el BufferedGraphicsManager. Esto permite que permite crear y gestionar gráficos buffers de forma individual, sin incurrir en la sobrecarga de rendimiento de la gestión de todos los demás buffer gráficos asociados a su aplicación , aunque la memoria consumida por la aplicación será mayor.

EDITAR: También encontré this artículo de Bob Powell, que puede ser útil

Manual de doble buffer puede ser útil si no desea que el sistema así que supuestos de que tales como si el fondo es opaco o transparente o quizás si desea crear un sistema de memoria intermedia más complejo . Hay algunas reglas simples que debe seguir para obtener el doble buffer manual correcto.

Primero, no cree una nueva memoria intermedia en cada ciclo de extracción. Solo crea o destruye el mapa de bits cuando cambia el tamaño del cliente de la ventana. En segundo lugar, solo crea un mapa de bits del tamaño que necesita. La limpieza de píxeles lleva tiempo, por lo que si hay más píxeles de los que necesita, solo está desperdiciando ciclos de procesador. Por último, utilice el método de extracción más simple para copiar el mapa de bits en la pantalla. DrawImageUnscaled es el camino a seguir aquí.

EDITAR: Otra razón es que es posible que desee a la aplicación controlar el almacenamiento en búfer, no los propios controles.

Fuente: Pro .NET 2.0 Windows Forms and custom controls in C#

+0

Gracias, pero ya había hecho una búsqueda web :-) –

Cuestiones relacionadas