网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.JAVA基础知识(6).
.自己开发的java中文处理编辑器.
.利用Java Applet播放声音文件.
.Java程序中用JFreeChart制作图形.
.在学习编程的过程中,应该注意什.
.J2EE和XML为企业应用软件创造机会.
.轻松掌握 Java 泛型 (第 1 部分).
.java网络五子棋的源代码.
.J2ME中建立Splash启动界面.
.JBuilder2005单元测试之JUnit框架.
.Swing 常用的 Package.
.Java中的移位操作.
.深入Java中文问题及最优解决方法.
.EJB应用技术的体系结构详解(1).
.java反射技术(一).
.Java Web 框架的“甜点”.
.使用Doxygen构建文档系统.
.最新的Swing外观,定制UI不在话下.
.SpringFramework入门实用攻略.
.朝着 零缺陷 的方向.

优化Java动画编程中的显示效果

发表日期:2008-1-5



  Java动画编程有多种实现方法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉。Java多线程技术是Java动画编程中普遍运用的技术,它在控制动画程序的流程和动画的显示效果方面起着重要的作用。Java动画编程中的动画闪烁和图像残缺不全等现象,是Java程序员经常碰到的问题。本文以作者应用实例程序为基础,阐述如何运用多线程、重载Update、双缓冲和图像跟踪等技巧来解决这类问题,以达到动画显示的最佳效果。
  
  Java多线程技术
  
  Java多线程技术简介
  
  目前,线程(Thread)已经为许多操作系统和应用开发系统所采用。线程是程序的单个控制流,具有顺序程序的特点。但是,线程不是一个程序,它仅仅是程序的一个执行序列。线程具有很强的并发功能,在同一时刻可以有多个线程同时处于执行状态。线程是动态的,具有一定的生命周期,分别经历从创建、执行、阻塞、直到消亡的过程。Java语言对多线程编程的支持有两种实现方法:一种是直接继续Thread类,另一种是实现Runnable接口。Thread类提供了对线程的控制方法,如start(),stop(),run()、suspend()、resume()和sleep()等方法,它们可以对线程的状态进行控制。
  
  动画线程的设计与实现
  
  为了每秒中多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求。许多Java初学者轻易犯的一个错误是将动画循环放在paint()中,这样占据了主AWT线程,而主线程将负责所有的绘图和事件处理。因此,应该生成一个独立的动画线程来完成图像的显示和更新。例如,在一个Applet框架下,当Applet启动(Start)时,生成一个动画线程;在Applet停止(stop)时,终止该动画线程以释放它所占用的CPU资源。下列程序代码(简称“C1”代码)是该动画线程的具体实现:
  
  public void start() {
   if(animatorThread==null) {
   animatorThread=new Thread(this);
  //开始动画线程
  animatorThread.start();
   }
  }
  public void stop(){
   //停止动画线程
   animatorThread=null;
  }
  
  上面终止动画线程的时候,并不是调用该动画线程的stop()方法,而是设置该动画线程为null。因为假如直接调用线程的stop()方法会强制线程终止所有的执行工作,有时会带来不好的结果。设置该动画线程为null,则在run()方法中,由于不满足循环条件,线程会自然退出。这样,也进一步优化了该动画程序。
  
  重载update()和双缓冲技术消除闪烁
  
  在Java中,动画发生闪烁有两个原因:一个是由于在显示下一帧画面的时候,调用了repaint()方法;而repaint()方法被调用时,要清除整个背景,然后才调用paint()方法显示画面。这样,在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁。另一个是由于paint()方法要进行复杂的计算,绘制每一帧花费的时间太长,图像中的各个像素值不能同时得到,使得动画的生成频率低于显示器的刷新频率,从而造成闪烁。
  
  下面两种方法可以明显地消除或减弱闪烁。
  
  重载update()方法
  
  当AWT接收到一个Applet的重绘请求时,它就调用Applet的update()方法。缺省情况下,update()方法清除Applet的背景,然后调用paint()方法。重载update()方法就可以将以前在paint()方法中的绘图代码包含在update()方法中,从而避免每次重绘时将整个区域清除。既然背景不再自动清除,Java程序员需要自己在update()中完成。
  
  双缓冲技术
  
  另一种消除帧之间闪烁的方法是使用双缓冲技术,它在许多动画Applet中被使用。主要原理是创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去。这种方法的优点在于大部分绘制是离屏的。将离屏图像一次绘至屏幕上,比直接在屏幕上绘制要有效得多。在创建后台图像前,首先要通过调用createImage()方法生成合适的后台缓冲区,然后获得在缓冲区做图的环境(即Graphics类对象)。
  
  下列实例程序代码(简称“C2”代码)就是这两种方法的结合使用,双缓冲技术在重载update()方法中实现。其中,offImage是Image类的对象,offGraphics是Graphics类的对象,这两个类对象是实现双缓冲技术的要害。相关代码如下:
  
  public void paint(Graphics g){
   update(g);
   }
   public void update(Graphics g){
   Dimension d=getSize();
   //假如后台图像不存在,就创建一个后台图像
  if((offGraphics==null)(d.width!=offDimension.width)
   (d.height!=offDimension.height)) {
   offDimension=d;
   offImage=createImage(d.width,d.height);
   offGraphics=offImage.getGraphics();
   }
   //擦除上一帧
   offGraphics.setColor(getBackground());
   offGraphics.fillRect(0,0,d.width,d.height);
   offGraphics.setColor(Color.black);
   //将当前的帧输出到指定的image中
   for(int i=0 ; i<10 ; i++){
   offGraphics.drawImage(images[i],frameNumber*5%(d.width/2)
   ,i*d.height/10,this);
   }
   //输出指定的后台图像
  g.drawImage(offImage,frameNumber*5%(d.width/2),0,this);
   }
  
  双缓冲技术可以使动画平滑,但有一个缺点,要分配一个后台图像的缓冲,假如图像相当大,这将占用很大一块内存。
上一篇:Java套接字编程(下) 人气:575
下一篇:提高Java应用程序属性持久化的方法 人气:590
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐