zoukankan      html  css  js  c++  java
  • Java之双缓冲技术

    双缓冲技术是为了处理对于屏幕闪烁而总结的。
    那么为什么出现闪烁?
    这是由于组件的重绘会调用update方法,然后由update调用paint方法,由于update的原代码如下:

    public void update(Graphics g)
    {
    if (isShowing())
    {
    if (! (peer instanceof LightweightPeer)) //1.如果该组件是轻量组件的话
    {
    g.clearRect(0, 0, width, height); //2.用背景色覆盖整个组件
    }
    paint(g); //3.调用paint(Graphics g)函数
    }
    }

    可以看到,当清屏后我们绘制过程当中,由于整个绘制过程我们都能观察到,我们就捕捉到了空白的图像(2.用背景色覆盖整个组件),就出现了闪烁。

    使用双缓冲:
    我们首先添加了两个成员变量iBuffer和gBuffer作为缓冲(这就是所谓的双缓冲名字的来历)。在paint(Graphics scr)函数中,首先检测如果iBuffer为null,则创建一个和屏幕上的绘图区域大小一样的缓冲图象,再取得iBuffer的Graphics类型的对象的引用,并将其赋值给gBuffer,然后对gBuffer这个内存中的后台图象先用fillRect(int,int,int,int)清屏,再进行绘制操作,完成后将iBuffer直接绘制到屏幕上。
    即在这个过程中,我们在一个缓冲区域中完成了图像的绘制,即出现空白的图像(2.用背景色覆盖整个组件)的这个过程是出现在缓冲区域中的,我们就观察不到空白的图像,闪烁就消除了。

  • 相关阅读:
    POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
    LCA 最近公共祖先 (模板)
    线段树,最大值查询位置
    带权并查集
    转负二进制
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
  • 原文地址:https://www.cnblogs.com/Sherlock-J/p/12926071.html
Copyright © 2011-2022 走看看