当创建动画引擎,我们已经看到,屏幕刷新出现闪烁现象是不可取的. 这种效果是由于所需要的时间,以消除该图像,并生成一个新的更新, 动画对象的结果.
Una técnica para evitar esto es la denominada doble buffer o “ðoublebuffered“, de forma que utilizamos dos imágenes (memorias gráficas) al mismo tiempo. Mientras se dibuja en una, vemos la otra y minimizamos el tiempo de cambio entre las imágenes eliminando el parpadeo.
在 计算, el almacenamiento en búfer múltiples es el uso de más de un buffer para mantener un bloque de datos, de modo que un “lector” verá una completa versión de los datos, en lugar de una versión parcialmente actualizada de la datos que se crean por un “escritor”. También se utiliza para evitar la necesidad de usar la memoria RAM de doble puerto, cuando los lectores y escritores son dispositivos diferentes.(该)
Modificaremos la clase “黑板” que hemos modificado para incorporar el 动画引擎 para implementar esta técnica. Necesitaremos conocer las dimensiones de la pantalla gráfica para almacenar la suficiente memoria, y definiremos un objeto “图像” que será sobre el que dibujaremos los gráficos.
Dimension d; 私人 Image mImage = null;
方法 “油漆” de dibujo obtendrá primero el tamaño de la imagen a generar. La llamada a la función “checkOffScreenImage()” se encargará de asegurarnos un objeto “mImage” sobre el que dibujar.
Para dibujar en este objeto solicitaremos su dirección gráfica con la función “getGraphics“. A continuación lo rellenaremos del color que usemos para el fondo dibujando sobre este elemento un rectángulo relleno.
Llamaremos a las rutinas de dibujado de la imagen, que hemos implementado en la función “paintOffScreen” pasándole este objeto gráfico como parámetro para que lo use como lienzo.
La última función dibujará en pantalla el lienzo o imagen generado.
public synchronized void 油漆(图形克) { d = getSize(); checkOffScreenImage(); Graphics offG = mImage.getGraphics(); offG.setColor(getBackground()); offG.fillRect(0, 0, d.width, d.height); paintOffScreen(mImage.getGraphics()); g.drawImage(mImage, 0, 0, 零); }
功能 “checkOffScreenImage()” se encargará de supervisar si ha cambiado el tamaño de la ventana utilizada para mostrar la información gráfica y generar un objeto sobre el que dibujar, mediante la función “createImage()“
私人无效 checkOffScreenImage() { Dimension d = getSize(); 如果 (d.width == 0 || d.height == 0) { 回归; } 如果 (mImage == null || mImage.getWidth(零) != d.width || mImage.getHeight(零) != d.height) { mImage = createImage(d.width, d.height); } }
功能 “paintOffScree” es la antigua función o método “油漆” que dibuja nuestros objetos gráficos, por lo que no merece comentarios adicionales. Simplemente hemos cambiado su nombre.
公共无效 paintOffScreen(图形克){ 枚举枚举= bd.elements(); 对象ob; 而(enum.hasMoreElements()){ OB = enum.nextElement(); 如果(OB的instanceof SimpleDrawable){ ((SimpleDrawable) 是否).油漆(克); } } }
Al ejecutar la aplicación veremos que el parpadeo de la imagen ha desaparecido.
一定是 连接的 发表评论.