请问在SWING的环境下 如何实现图形加速(80) SWING程序的执行效率不高 请问怎么提高效率:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 反对,Swing的效率已经很优化了如果楼主嫌它慢,建议换cpu和mem,呵呵有时候,我们发现自己编的C++程序也会慢;有时候,我们采用了opengl或DX的画图都会闪;原因嘛就不说了...还有,swing的native code的确实现了图形加速,这是真的 但我是要在IA设备上实现SWING的 受资源限制 原先是用的AWT的一部分 现在想把AWT的换成SWING 增强一下图形功能 问下 有什么办法 孤陋寡闻了,呵呵,不查我还不知道原来IA中的A是指Appliance,楼主做的领域好超前啊。--Swing界面优化,我知道的和采用过的策略有几个1、MemoryBuffer 实际上,系统GDI肯定实现了这样的优化,缓存模型工作原理简单来说,就是内存画布管理和BitBlt引擎“拷屏”。我们自己的缓存方法,就是切换对象可见/不可见,尽量避免直接修改可见对象,把窗体子元素的组织放到幕后执行。用最近最久未用算法,缓冲几个最近被访问的窗体,以避免重新或反复构造最常用的窗体界面。2、multiThread 多线程技术自然不用说,Java天然对多线程机制提供良好的支持,这种技术尤其和后面的策略配合使用。3、LazyLoad 资源懒加载,在图形处理和数据处理中,都是必不可少的应用策略。举例来说,比如界面上有个表格,它要显示一些数据,而这些数据来自文件,那么可以分四步: 组件加载提示; 加载一个空表格; 数据加载提示; 加载数据到表格; 在界面上应用,那就是尽量以最快的速度,先显示一个粗糙视图,然后再使用异步线程绘制细节。4、"Loading..." 玩大型game我们经常要耐心等待它"Loading",这是不得已而为之的策略。(即使我们相信暴雪程序员的优化工作已经做足了,我们还是会在他们的游戏中,看到这样的字眼。)(再比如,CSDN社区左边那棵树,展开节点先看到了什么?——正在加载 请稍候 ...)这不是最好的,最典型的代表应该是windows系统里面最常见的ProcessBar,至少能让用户知道要等多久。 通常,用户不介意在友好提示下,等一会儿,因为他们也承认自己的计算机并不是每次都能一次做完所有的事情。 一个好的界面,不是要求干什么都最快,而是要求所有的等待都在用户可容忍的程度内。--比较笼统,对于具体问题可以具体讨论欢迎讨论 呵呵 我也是刚刚接触这个 我现在是想用SWING代替原来的AWT 但是必须要是 楼上所说的我也看过 还有其他的几个办法 当时问题是 这些方法用了后 对程序运行效率有多大改进 谢谢-----------------------------------------------------------------------------------Java档案文件(JAR文件)是根据JavaBean标准压缩的文件,是发布JavaBean组件的主要方式和推荐方式。JAR档案有助于减少文件体积,缩短下载时间。例如,它有助于Applet提高启动速度。一个JAR文件可以包含一个或者多个相关的Bean以及支持文件,比如图形、声音、HTML和其他资源。 要在HTML/JSP文件中指定JAR文件,只需在Applet标记中加入ARCHIVE = "name.jar"声明。 3.2 提示Applet装入进程 你是否看到过使用Applet的网站,注意到在应该运行Applet的地方出现了一个占位符?当Applet的下载时间较长时,会发生什么事情?最大的可能就是用户掉头离去。在这种情况下,显示一个Applet正在下载的信息无疑有助于鼓励用户继续等待。 下面我们来看看一种具体的实现方法。首先创建一个很小的Applet,该Applet负责在后台下载正式的Applet: import java.applet.Applet;import java.applet.AppletStub;import java.awt.Label;import java.awt.Graphics;import java.awt.GridLayout; public class PreLoader extends Applet implements Runnable, AppletStub { String largeAppletName; Label label; public void init() { // 要求装载的正式Applet largeAppletName = getParameter("applet"); // “请稍等”提示信息 label = new Label("请稍等..." + largeAppletName); add(label); } public void run(){ try { // 获得待装载Applet的类 Class largeAppletClass = Class.forName(largeAppletName); // 创建待装载Applet的实例 Applet largeApplet = (Applet)largeAppletClass.newInstance(); // 设置该Applet的Stub程序 largeApplet.setStub(this); // 取消“请稍等”信息 remove(label); // 设置布局 setLayout(new GridLayout(1, 0)); add(largeApplet); // 显示正式的Applet largeApplet.init(); largeApplet.start(); } catch (Exception ex) { // 显示错误信息 label.setText("不能装入指定的Applet"); } // 刷新屏幕 validate(); } public void appletResize(int width, int height) { // 把appletResize调用从stub程序传递到Applet resize(width, height); }} 编译后的代码小于2K,下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现了AppletStub接口。一般地,Applet从调用者判断自己的codebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地方是,AppletStub接口包含许多和Applet类一样的方法,但appletResize()方法除外。这里我们把对appletResize()方法的调用传递给了resize()方法。 3.3 在画出图形之前预先装入它 ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate(),能够用一次repaint()操作在屏幕上画出图形。下面提供了一个例子。 public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { if ((flags & ALLBITS) !=0 { repaint(); } else if (flags & (ERROR |ABORT )) != 0) { error = true; // 文件没有找到,考虑显示一个占位符 repaint(); } return (flags & (ALLBITS | ERROR| ABORT)) == 0;} 当图形信息可用时,imageUpdate()方法被调用。如果需要进一步更新,该方法返回true;如果所需信息已经得到,该方法返回false。 3.4 覆盖update方法 update()方法的默认动作是清除屏幕,然后调用paint()方法。如果使用默认的update()方法,频繁使用图形的应用可能出现显示闪烁现象。要避免在paint()调用之前的屏幕清除操作,只需按照如下方式覆盖update()方法: public void update(Gra JAVASE 使用JPanel的paintComponent方法出现了问题 已知一个对象的实例,填充这个实例的各个字段 类和对象在编程时候怎么用啊?? 求教哪有DispatcherServlet类说明的API帮助文档? JAVA中调用Oracle存储过程 初学者的基础题! java里的STRING到底怎么弄 求救,本人急需AIX 上的j2sdk,希望大家帮忙 高分请专家做个鉴定,关于 JAVA 传递参数简单总结,大家看我理解的对吗? outputStream.write()抛出异常 怎么样用Eelipse配置Struts啊?
如果楼主嫌它慢,建议换cpu和mem,呵呵有时候,我们发现自己编的C++程序也会慢;
有时候,我们采用了opengl或DX的画图都会闪;
原因嘛就不说了...还有,swing的native code的确实现了图形加速,这是真的
--
Swing界面优化,我知道的和采用过的策略有几个
1、MemoryBuffer
实际上,系统GDI肯定实现了这样的优化,缓存模型工作原理简单来说,
就是内存画布管理和BitBlt引擎“拷屏”。我们自己的缓存方法,就是切换
对象可见/不可见,尽量避免直接修改可见对象,把窗体子元素的组织放到
幕后执行。用最近最久未用算法,缓冲几个最近被访问的窗体,以避免重新
或反复构造最常用的窗体界面。
2、multiThread
多线程技术自然不用说,Java天然对多线程机制提供良好的支持,这种
技术尤其和后面的策略配合使用。
3、LazyLoad
资源懒加载,在图形处理和数据处理中,都是必不可少的应用策略。举例
来说,比如界面上有个表格,它要显示一些数据,而这些数据来自文件,那么
可以分四步:
组件加载提示;
加载一个空表格;
数据加载提示;
加载数据到表格;
在界面上应用,那就是尽量以最快的速度,先显示一个粗糙视图,然后再
使用异步线程绘制细节。
4、"Loading..."
玩大型game我们经常要耐心等待它"Loading",这是不得已而为之的策略。(
即使我们相信暴雪程序员的优化工作已经做足了,我们还是会在他们的游戏中,
看到这样的字眼。)(再比如,CSDN社区左边那棵树,展开节点先看到了什么?
——正在加载 请稍候 ...)这不是最好的,最典型的代表应该是windows系统里面
最常见的ProcessBar,至少能让用户知道要等多久。
通常,用户不介意在友好提示下,等一会儿,因为他们也承认自己的计算机
并不是每次都能一次做完所有的事情。
一个好的界面,不是要求干什么都最快,而是要求所有的等待都在用户可容忍
的程度内。
--
比较笼统,对于具体问题可以具体讨论
欢迎讨论
-----------------------------------------------------------------------------------Java档案文件(JAR文件)是根据JavaBean标准压缩的文件,是发布JavaBean组件的主要方式和推荐方式。JAR档案有助于减少文件体积,缩短下载时间。例如,它有助于Applet提高启动速度。一个JAR文件可以包含一个或者多个相关的Bean以及支持文件,比如图形、声音、HTML和其他资源。
要在HTML/JSP文件中指定JAR文件,只需在Applet标记中加入ARCHIVE = "name.jar"声明。
3.2 提示Applet装入进程
你是否看到过使用Applet的网站,注意到在应该运行Applet的地方出现了一个占位符?当Applet的下载时间较长时,会发生什么事情?最大的可能就是用户掉头离去。在这种情况下,显示一个Applet正在下载的信息无疑有助于鼓励用户继续等待。
下面我们来看看一种具体的实现方法。首先创建一个很小的Applet,该Applet负责在后台下载正式的Applet: import java.applet.Applet;import java.applet.AppletStub;import java.awt.Label;import java.awt.Graphics;import java.awt.GridLayout; public class PreLoader extends Applet implements Runnable, AppletStub { String largeAppletName; Label label; public void init() { // 要求装载的正式Applet largeAppletName = getParameter("applet"); // “请稍等”提示信息 label = new Label("请稍等..." + largeAppletName); add(label); } public void run(){ try { // 获得待装载Applet的类 Class largeAppletClass = Class.forName(largeAppletName); // 创建待装载Applet的实例 Applet largeApplet = (Applet)largeAppletClass.newInstance(); // 设置该Applet的Stub程序 largeApplet.setStub(this); // 取消“请稍等”信息 remove(label); // 设置布局 setLayout(new GridLayout(1, 0)); add(largeApplet); // 显示正式的Applet largeApplet.init(); largeApplet.start(); } catch (Exception ex) { // 显示错误信息 label.setText("不能装入指定的Applet"); } // 刷新屏幕 validate(); } public void appletResize(int width, int height) { // 把appletResize调用从stub程序传递到Applet resize(width, height); }}
编译后的代码小于2K,下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现了AppletStub接口。一般地,Applet从调用者判断自己的codebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地方是,AppletStub接口包含许多和Applet类一样的方法,但appletResize()方法除外。这里我们把对appletResize()方法的调用传递给了resize()方法。
3.3 在画出图形之前预先装入它
ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate(),能够用一次repaint()操作在屏幕上画出图形。下面提供了一个例子。 public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { if ((flags & ALLBITS) !=0 { repaint(); } else if (flags & (ERROR |ABORT )) != 0) { error = true; // 文件没有找到,考虑显示一个占位符 repaint(); } return (flags & (ALLBITS | ERROR| ABORT)) == 0;}
当图形信息可用时,imageUpdate()方法被调用。如果需要进一步更新,该方法返回true;如果所需信息已经得到,该方法返回false。
3.4 覆盖update方法
update()方法的默认动作是清除屏幕,然后调用paint()方法。如果使用默认的update()方法,频繁使用图形的应用可能出现显示闪烁现象。要避免在paint()调用之前的屏幕清除操作,只需按照如下方式覆盖update()方法:
public void update(Gra