Como implementar Double Buffering en Visual C++

Por:ivancp,enviado 19 Jun 2006

¿Qué es Double Buffering?


En computación gráfica, doble-buffer es una técnica para reducir el parpadeo producido al dibujar en la pantalla. Esta técnica es muy útil para cuando tenemos varios segmentos de imagen complejos por dibujar, por ejemplo el movimiento de un objeto complejo sobre una ventana.
Implementación.

Este articulo te mostrará como implementar la técnica de Double Buffering en tus proyectos Visual C++. Una forma clásica de demostrar esto es pintando un fondo complejo y dibujando sobre él un objeto en movimiento, esto normalmente produce un parpadeo fastidioso:

Code: Seleccionar todo
  1. void CChildView::PaintScenario(CDC *pDC)

  2. {

  3.         int step = (m_size.cy)/16;

  4.         pDC->FillSolidRect(0,0,m_size.cx,m_size.cy,RGB(255,255,255));

  5.         for(int i = 0 ; i < 16;i++)

  6.         {

  7.                 pDC->FillSolidRect(10,10+i*step,m_size.cx-20,(i+1)*step,RGB(16*i,16*i,16*i));

  8.         }

  9.         pDC->Ellipse(m_size.cx/2-60,m_iPos-60,m_size.cx/2+60,m_iPos+60);

  10. }



El código anterior dibuja algo como la Imagen 1, la variable CSize m_size contiene las dimensiones del entorno, int m_iPos es la posición actual de la esfera.

doble-buffer1.gif
Imagen 1: Circulo blanco sobre fondo negro


El codigo puede agregarse en una vista estándar (CView) o en un dialogo. Necesitamos un Bitmap y un DC (Device Context) donde dibujaremos temporalmente la imagen para luego mostrarla en pantalla. (Ver Imagen 2).

0doble-buffer2.gif
Imagen 2: Esquema de Double Buffering


Codificación:


  • Agregar a la clase de la vista, una variable de tipo CBitmap, ésta variable será nuestra nuestra imagen en segundo plano.

    CBitmap m_bmpOffScreen;
  • En la funcion OnPaint escribir el codigo para Inicializar el CBitmap con las dimensiones del entorno (a); Crear el DC y seleccionarlo (b), Usar el DC creado para pintar (c) y Finalmente Mostrar el Bitmap en pantalla (d). codigo.

    Code: Seleccionar todo
    1.     void CChildView::OnPaint()

    2.     {

    3.         CPaintDC dc(this); // device context for painting

    4.  

    5.  

    6.         if(m_bmpOffScreen.m_hObject == NULL) (a)

    7.         {

    8.             m_bmpOffScreen.CreateCompatibleBitmap( &dc, m_size.cx, m_size.cy );

    9.         }

    10.  

    11.         CDC imageDC; (b)

    12.         imageDC.CreateCompatibleDC(&dc);

    13.  

    14.         CBitmap* pOldBitmap = NULL;

    15.  

    16.         pOldBitmap = (CBitmap*)imageDC.SelectObject(&m_bmpOffScreen);

    17.  

    18.         PaintScenario(&imageDC);  (c)

    19.  

    20.         dc.BitBlt( 0, 0, m_size.cx, m_size.cy,

    21.                         &imageDC, 0, 0, SRCCOPY );  (d)

    22.  

    23.         imageDC.SelectObject(pOldBitmap);

    24.         imageDC.DeleteDC();

    25.     }



  • Escribir el codigo necesario para liberar el bitmap, en el destructor.

    Code: Seleccionar todo
    1.     CChildView::~CChildView()

    2.     {

    3.         if(m_bmpOffScreen.m_hObject != NULL)

    4.         {

    5.             m_bmpOffScreen.DeleteObject();

    6.             m_bmpOffScreen.m_hObject = NULL;

    7.         }

    8.     }




Ustedes pueden personalizar la función PaintScenario de acuerdo a las necesidades de su programa. Hay otras formas de implementar Double Buffering, esta es solo una muestra.

Pueden descargar el proyecto de ejemplo para ver en acción a esta técnica.
Tags: MFC,juegos

Archivos Adjuntos

Otros Artículos en esta sección

  • Crear un proyecto MFC basado en diálogo
    Tutorial paso a paso para crear una aplicación basada en dialogo utilizando las librerías MFC con Visual C++ 2010
    Por: ivancp,2011-09-03
  • Shell para Simulación
    Shell para Simulación es una herramienta donde el usuario de manera interactiva puede modelar sistemas reales y definir sus características. La herramienta está orientada a la simulación de sistemas dinámicos y estocásticos que cambian de manera discreta.
    Por: nazg,2006-03-18
  • Separador de controles para formularios MFC
    Es un control que nos permite mantener ordenado nuestros diálogos mediante lineas divisoras. No hay una variedad de controles para diálogos MFC, pero con esto puedes poner la diferencia.
    Por: ivancp,2004-09-20
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro deVisual C++ »