广交好友~~ 想要讨论的可以留下msn~~~ 希望群友网友经常能提出问题,一起解决,共同提高

白盒优化3

上一篇 / 下一篇  2010-01-12 16:12:48 / 个人分类:白盒

5. 延迟重画操作
  对于图形用户界面的应用来说,性能低下的主要原因往往可以归结为重画屏幕的效率低下。当用户改变窗口大小或者滚动一个窗口 时,这一点通常可以很明显地观察到。改变窗口大小或者滚动屏幕之类的操作导致重画屏幕事件大量地、快速地生成,甚至超过了相关代码的执行速度。对付这个问 题最好的办法是忽略所有“迟到”的事件。
  建议在这里引入一个数毫秒的时差,即假如我们立即接收到了另一个重画事件,可以停止处理当前事件转而处理最后一个收到的重画事件;否则,我们继续进行当前的重画过程。
  假如事件要启动一项耗时的工作,分离出一个工作线程是一种较好的处理方式;否则,一些部件可能被“冻结”,因为每次只能处理一个事件。下面提供了一个事件处理的简单例子,但经过扩展后它可以用来控制工作线程。
  public static void runOnce(String id, final long milliseconds) {
  synchronized(e_queue) {
  // e_queue: 所有事件的集合
  if (!e_queue.containsKey(id)) {
  e_queue.put(token, new LastOne());
  }
  }
  final LastOne lastOne = (LastOne) e_queue.get(token);
  final long time = System.currentTimeMillis(); // 获得当前时间
  lastOne.time = time;
  (new Thread() {public void run() {
  if (milliseconds > 0) {
  try {Thread.sleep(milliseconds);} // 暂停线程
  catch (Exception ex) {}
  }
  synchronized(lastOne.running) { // 等待上一事件结束
  if (lastOne.time != time) // 只处理最后一个事件
  return;
  }
  }}).start();
  }
  private static Hashtable e_queue = new Hashtable(); private static class LastOne {
  public long time=0;
  public Object running = new Object();
  }
  
  6. 使用双缓冲区
  在屏幕之外的缓冲区绘图,完成后立即把整个图形显示出来。由于有两个缓冲区,所以程序可以往返切换。这样,我们可以用一个低优先级的线程负责画图,使得程序能够利用空闲的CPU时间执行其他任务。下面的伪代码片断示范了这种技术。
  Graphics myGraphics;
  Image myOffscreenImage = createImage(size().width, size().height);
  Graphics ffscreenGraphics = myOffscreenImage.getGraphics();
  offscreenGraphics.drawImage(img, 50, 50, this);
  myGraphics.drawImage(myOffscreenImage, 0, 0, this);
  
  7. 使用BufferedImage
   Java JDK 1.2使用了一个软显示设备,使得文本在不同的平台上看起来相似。为实现这个功能,Java必须直接处理构成文字的像素。由于这种技术要在内存中大量地进 行位复制操作,早期的JDK在使用这种技术时性能不佳。为解决这个问题而提出的Java标准实现了一种新的图形类型,即BufferedImage。 BufferedImage子类描述的图形带有一个可访问的图形数据缓冲区。一个BufferedImage包含一个ColorModel和一组光栅图形 数据。这个类一般使用RGB(红、绿、蓝)颜色模型,但也可以处理灰度级图形。它的构造函数很简单,如下所示:
  public BufferedImage (int width, int height, int imageType)
  
  ImageType答应我们指定要缓冲的是什么类型的图形,比如5-位RGB、8-位RGB、灰度级等。
  8. 使用VolatileImage
   许多硬件平台和它们的操作系统都提供基本的硬件加速支持。例如,硬件加速一般提供矩形填充功能,和利用CPU完成同一任务相比,硬件加速的效率更高。由 于硬件加速分离了一部分工作,答应多个工作流并发进行,从而缓解了对CPU和系统总线的压力,使得应用能够运行得更快。利用VolatileImage可 以创建硬件加速的图形以及治理图形的内容。由于它直接利用低层平台的能力,性能的改善程度主要取决于系统使用的图形适配器。VolatileImage的 内容随时可能丢失,也即它是“不稳定的(volatile)”。因此,在使用图形之前,最好检查一下它的内容是否丢失。VolatileImage有两个 能够检查内容是否丢失的方法:
  public abstract int validate(GraphicsConfiguration gc);public abstract Boolean contentsLost();

TAG:

 

评分:0

我来说两句

Open Toolbar