狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當(dāng)前位置:系統(tǒng)之家 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

Java優(yōu)化性能技巧集錦(2)

Java優(yōu)化性能技巧集錦(2)

更新時(shí)間:2024-04-10 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

三、GUI篇

這一部分介紹的內(nèi)容適合于圖形用戶界面的應(yīng)用(Applet和普通應(yīng)用),要用到AWT或Swing。

3.1 用JAR壓縮類文件

Java檔案文件(JAR文件)是根據(jù)JavaBean標(biāo)準(zhǔn)壓縮的文件,是發(fā)布JavaBean組件的主要方式和推薦方式。JAR檔案有助于減少文件體積,縮短下載時(shí)間。例如,它有助于Applet提高啟動速度。一個(gè)JAR文件可以包含一個(gè)或者多個(gè)相關(guān)的Bean以及支持文件,比如圖形、聲音、HTML和其他資源。

要在HTML/JSP文件中指定JAR文件,只需在Applet標(biāo)記中加入ARCHIVE = "name.jar"聲明。

請參見《使用檔案文件提高 applet 的加載速度》。

3.2 提示Applet裝入進(jìn)程

你是否看到過使用Applet的網(wǎng)站,注意到在應(yīng)該運(yùn)行Applet的地方出現(xiàn)了一個(gè)占位符?當(dāng)Applet的下載時(shí)間較長時(shí),會發(fā)生什么事情?最大的可能就是用戶掉頭離去。在這種情況下,顯示一個(gè)Applet正在下載的信息無疑有助于鼓勵用戶繼續(xù)等待。

下面我們來看看一種具體的實(shí)現(xiàn)方法。首先創(chuàng)建一個(gè)很小的Applet,該Applet負(fù)責(zé)在后臺下載正式的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);
 // 創(chuàng)建待裝載Applet的實(shí)例
Applet largeApplet = (Applet)largeAppletClass.newInstance();
 // 設(shè)置該Applet的Stub程序
 largeApplet.setStub(this);
 // 取消“請稍等”信息
remove(label);
// 設(shè)置布局
setLayout(new GridLayout(1, 0));
add(largeApplet);
// 顯示正式的Applet
largeApplet.init();
largeApplet.start();
 }
 catch (Exception ex) {
// 顯示錯(cuò)誤信息
label.setText("不能裝入指定的Applet");
 }
 // 刷新屏幕
 validate();
}
public void appletResize(int width, int height) {
// 把a(bǔ)ppletResize調(diào)用從stub程序傳遞到Applet
 resize(width, height);
}
}



編譯后的代碼小于2K,下載速度很快。代碼中有幾個(gè)地方值得注意。首先,PreLoader實(shí)現(xiàn)了AppletStub接口。一般地,Applet從調(diào)用者判斷自己的codebase。在本例中,我們必須調(diào)用setStub()告訴Applet到哪里提取這個(gè)信息。另一個(gè)值得注意的地方是,AppletStub接口包含許多和Applet類一樣的方法,但appletResize()方法除外。這里我們把對appletResize()方法的調(diào)用傳遞給了resize()方法。

3.3 在畫出圖形之前預(yù)先裝入它

ImageObserver接口可用來接收圖形裝入的提示信息。ImageObserver接口只有一個(gè)方法imageUpdate(),能夠用一次repaint()操作在屏幕上畫出圖形。下面提供了一個(gè)例子。


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;
// 文件沒有找到,考慮顯示一個(gè)占位符
repaint();
}
return (flags & (ALLBITS | ERROR| ABORT)) == 0;
}



當(dāng)圖形信息可用時(shí),imageUpdate()方法被調(diào)用。如果需要進(jìn)一步更新,該方法返回true;如果所需信息已經(jīng)得到,該方法返回false。

3.4 覆蓋update方法

update()方法的默認(rèn)動作是清除屏幕,然后調(diào)用paint()方法。如果使用默認(rèn)的update()方法,頻繁使用圖形的應(yīng)用可能出現(xiàn)顯示閃爍現(xiàn)象。要避免在paint()調(diào)用之前的屏幕清除操作,只需按照如下方式覆蓋update()方法:


public void update(Graphics g) {
paint(g);
}



更理想的方案是:覆蓋update(),只重畫屏幕上發(fā)生變化的區(qū)域,如下所示:


public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}



3.5 延遲重畫操作

對于圖形用戶界面的應(yīng)用來說,性能低下的主要原因往往可以歸結(jié)為重畫屏幕的效率低下。當(dāng)用戶改變窗口大小或者滾動一個(gè)窗口時(shí),這一點(diǎn)通常可以很明顯地觀察到。改變窗口大小或者滾動屏幕之類的操作導(dǎo)致重畫屏幕事件大量地、快速地生成,甚至超過了相關(guān)代碼的執(zhí)行速度。對付這個(gè)問題最好的辦法是忽略所有“遲到”的事件。

建議在這里引入一個(gè)數(shù)毫秒的時(shí)差,即如果我們立即接收到了另一個(gè)重畫事件,可以停止處理當(dāng)前事件轉(zhuǎn)而處理最后一個(gè)收到的重畫事件;否則,我們繼續(xù)進(jìn)行當(dāng)前的重畫過程。

如果事件要啟動一項(xiàng)耗時(shí)的工作,分離出一個(gè)工作線程是一種較好的處理方式;否則,一些部件可能被“凍結(jié)”,因?yàn)槊看沃荒芴幚硪粋(gè)事件。下面提供了一個(gè)事件處理的簡單例子,但經(jīng)過擴(kuò)展后它可以用來控制工作線程。


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(); // 獲得當(dāng)前時(shí)間
lastOne.time = time;
(new Thread() {public void run() {
 if (milliseconds > 0) {
 try {Thread.sleep(milliseconds);} // 暫停線程
 catch (Exception ex) {}
 }
 synchronized(lastOne.running) { // 等待上一事件結(jié)束
 if (lastOne.time != time) // 只處理最后一個(gè)事件
 return;
 }
}}).start();
}
private static Hashtable e_queue = new Hashtable();
private static class LastOne {
 public long time=0;
 public Object running = new Object();
}



3.6 使用雙緩沖區(qū)

在屏幕之外的緩沖區(qū)繪圖,完成后立即把整個(gè)圖形顯示出來。由于有兩個(gè)緩沖區(qū),所以程序可以來回切換。這樣,我們可以用一個(gè)低優(yōu)先級的線程負(fù)責(zé)畫圖,使得程序能夠利用空閑的CPU時(shí)間執(zhí)行其他任務(wù)。下面的偽代碼片斷示范了這種技術(shù)。


Graphics myGraphics;
Image myOffscreenImage = createImage(size().width, size().height);
Graphics offscreenGraphics = myOffscreenImage.getGraphics();
offscreenGraphics.drawImage(img, 50, 50, this);
myGraphics.drawImage(myOffscreenImage, 0, 0, this);



3.7 使用BufferedImage

Java JDK 1.2使用了一個(gè)軟顯示設(shè)備,使得文本在不同的平臺上看起來相似。為實(shí)現(xiàn)這個(gè)功能,Java必須直接處理構(gòu)成文字的像素。由于這種技術(shù)要在內(nèi)存中大量地進(jìn)行位復(fù)制操作,早期的JDK在使用這種技術(shù)時(shí)性能不佳。為解決這個(gè)問題而提出的Java標(biāo)準(zhǔn)實(shí)現(xiàn)了一種新的圖形類型,即BufferedImage。

BufferedImage子類描述的圖形帶有一個(gè)可訪問的圖形數(shù)據(jù)緩沖區(qū)。一個(gè)BufferedImage包含一個(gè)ColorModel和一組光柵圖形數(shù)據(jù)。這個(gè)類一般使用RGB(紅、綠、藍(lán))顏色模型,但也可以處理灰度級圖形。它的構(gòu)造函數(shù)很簡單,如下所示:


public BufferedImage (int width, int height, int imageType)



ImageType允許我們指定要緩沖的是什么類型的圖形,比如5-位RGB、8-位RGB、灰度級等。

3.8 使用VolatileImage

許多硬件平臺和它們的操作系統(tǒng)都提供基本的硬件加速支持。例如,硬件加速一般提供矩形填充功能,和利用CPU完成同一任務(wù)相比,硬件加速的效率更高。由于硬件加速分離了一部分工作,允許多個(gè)工作流并發(fā)進(jìn)行,從而緩解了對CPU和系統(tǒng)總線的壓力,使得應(yīng)用能夠運(yùn)行得更快。利用VolatileImage可以創(chuàng)建硬件加速的圖形以及管理圖形的內(nèi)容。由于它直接利用低層平臺的能力,性能的改善程度主要取決于系統(tǒng)使用的圖形適配器。VolatileImage的內(nèi)容隨時(shí)可能丟失,也即它是“不穩(wěn)定的(volatile)”。因此,在使用圖形之前,最好檢查一下它的內(nèi)容是否丟失。VolatileImage有兩個(gè)能夠檢查內(nèi)容是否丟失的方法:


public abstract int validate(GraphicsConfiguration gc);
public abstract Boolean contentsLost();



每次從VolatileImage對象復(fù)制內(nèi)容或者寫入VolatileImage時(shí),應(yīng)該調(diào)用validate()方法。contentsLost()方法告訴我們,自從最后一次validate()調(diào)用之后,圖形的內(nèi)容是否丟失。

雖然VolatileImage是一個(gè)抽象類,但不要從它這里派生子類。VolatileImage應(yīng)該通過Component.createVolatileImage()或者GraphicsConfiguration.createCompatibleVolatileImage()方法創(chuàng)建。

3.9 使用Window Blitting

進(jìn)行滾動操作時(shí),所有可見的內(nèi)容一般都要重畫,從而導(dǎo)致大量不必要的重畫工作。許多操作系統(tǒng)的圖形子系統(tǒng),包括WIN32 GDI、MacOS和X/Windows,都支持Window Blitting技術(shù)。Window Blitting技術(shù)直接在屏幕緩沖區(qū)中把圖形移到新的位置,只重畫新出現(xiàn)的區(qū)域。要在Swing應(yīng)用中使用Window Blitting技術(shù),設(shè)置方法如下:


setScrollMode(int mode);



在大多數(shù)應(yīng)用中,使用這種技術(shù)能夠提高滾動速度。只有在一種情形下,Window Blitting會導(dǎo)致性能降低,即應(yīng)用在后臺進(jìn)行滾動操作。如果是用戶在滾動一個(gè)應(yīng)用,那么它總是在前臺,無需擔(dān)心任何負(fù)面影響。

四、補(bǔ)充資料

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
久久综合久色欧美综合狠狠| 99xxxx成人网| 精品1区2区| 91久久精品一区二区三区| 精品少妇一区二区三区| 亚洲精品自拍动漫在线| 国产精品18久久久| 国产欧美日韩视频一区二区三区| 欧美日韩在线电影| 亚洲天堂成人网| 成人美女在线观看| 美玉足脚交一区二区三区图片| 精品国产乱码久久久久久久久 | 狠久久av成人天堂| 91精品国产91久久久久久一区二区| 中文字幕一区二| 成人精品视频.| 在线视频欧美精品| 亚洲品质自拍视频| 99久久精品国产麻豆演员表| 午夜亚洲性色福利视频| 欧美国产日产图区| 国产成人综合亚洲网站| 久久欧美肥婆一二区| 国产精品天天看| 国产99久久久精品| 91精品办公室少妇高潮对白| 亚洲同性gay激情无套| 成人avav影音| 51午夜精品国产| 欧美aaa在线| 亚洲免费在线精品一区| 亚洲视频图片小说| 91免费国产在线| 欧美va在线播放| 国产在线观看免费一区| 91精品1区2区| 图片区小说区区亚洲影院| 欧美日韩在线播放一区二区| 日韩欧美久久久| 国产毛片精品一区| 欧美喷潮久久久xxxxx| 日日夜夜免费精品| 亚洲一区二区在| 一区二区三区欧美在线观看| 欧美日韩调教| 中文字幕精品一区二区精品绿巨人 | 国产一区二区三区成人欧美日韩在线观看| 国产午夜精品理论片a级大结局| 国产精品一区二区视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 一区二区高清在线| 国产精品久久波多野结衣| 综合色天天鬼久久鬼色| 狠狠综合久久| 亚洲伦理在线精品| 国产亚洲一区二区三区在线播放| 国产精品夫妻自拍| 亚洲黄色大片| 亚洲精选视频免费看| 在线亚洲欧美| 亚洲第一精品在线| 色视频成人在线观看免| 美女精品一区二区| 欧美放荡的少妇| 成人黄色小视频| 久久久久久久免费视频了| 99综合影院在线| 美腿丝袜亚洲一区| 欧美三级电影精品| 国产99久久久国产精品潘金| 555www色欧美视频| youjizz国产精品| 国产精品网站一区| 国产精品手机视频| 蜜臂av日日欢夜夜爽一区| 69p69国产精品| 色综合色综合色综合色综合色综合| 精品国产91九色蝌蚪| 欧美精品aa| 亚洲永久免费av| 欧美视频一区二区三区在线观看 | 国产日韩欧美一区二区三区综合| 欧美日韩国内| 亚洲国产视频在线| 欧美日韩免费观看一区三区| 国产福利一区在线| 国产日韩欧美电影| 久久久青草婷婷精品综合日韩| 青椒成人免费视频| 欧美电视剧在线看免费| 国模精品一区二区三区| 亚洲一线二线三线视频| 欧美精品一二三| 欧美日韩一区二区国产| 亚洲成a人片在线不卡一二三区| 欧美视频一二三区| 欧美久久久久久| 无吗不卡中文字幕| 精品久久久网站| 一本色道久久综合亚洲精品不卡| 日本欧美一区二区| 国产亚洲一本大道中文在线| 国产伦精品一区二区三区视频孕妇| 麻豆91精品视频| 国产欧美一区二区三区网站 | 久久精品99国产精品日本| 国产三级欧美三级日产三级99| 制服诱惑一区二区| 高清shemale亚洲人妖| 国产精品国产a| 欧美女孩性生活视频| 欧美色123| 黄网站免费久久| 国产精品欧美久久久久无广告| 一本一道久久a久久精品综合蜜臀| 国产·精品毛片| 亚洲成人综合视频| 久久久久高清精品| 欧洲一区在线电影| 精品不卡在线| 岛国精品一区二区| 视频一区视频二区中文| 国产清纯白嫩初高生在线观看91| 日本韩国欧美一区二区三区| 国产精品红桃| 国产99一区视频免费| 五月天国产精品| 亚洲私人影院在线观看| 日韩一区二区在线免费观看| 新狼窝色av性久久久久久| 午夜天堂精品久久久久| 国产麻豆精品theporn| 亚洲午夜免费视频| 国产亚洲女人久久久久毛片| 欧美日韩国产bt| 久久精品首页| 亚洲毛片一区| 欧美二区在线| 成人深夜在线观看| 极品美女销魂一区二区三区免费| 伊人一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 日韩精品一区二区三区三区免费| 在线一区二区三区四区五区 | 天天影视涩香欲综合网 | 日韩亚洲视频在线| 91丨porny丨蝌蚪视频| 国产乱码精品1区2区3区| 午夜精品福利一区二区蜜股av| 日韩一区中文字幕| 亚洲国产高清不卡| 久久精品视频免费| 精品成人免费观看| 欧美成人高清电影在线| 欧美老女人第四色| 欧美日韩卡一卡二| 欧美天堂一区二区三区| 免费国产一区二区| 亚洲欧美久久久| 国产精品一区在线播放| 99在线精品免费视频九九视| 国产一区二区三区无遮挡| 91香蕉视频污在线| 欧美在线不卡| zzijzzij亚洲日本少妇熟睡| 国产91清纯白嫩初高中在线观看| 国产一区激情在线| 国产成人综合视频| 成人午夜在线播放| 99国产精品久| 欧美国内亚洲| 狠狠88综合久久久久综合网| 欧美日韩国产精品一区二区亚洲 | 亚洲一区中文日韩| 日韩精品欧美成人高清一区二区| 亚洲超碰精品一区二区| 青青草一区二区三区| 人人狠狠综合久久亚洲| 久久99精品久久久久久国产越南| 看片网站欧美日韩| 亚洲乱码国产乱码精品精可以看| 亚洲精品中文字幕在线观看| 亚洲午夜精品网| 久久成人免费日本黄色| 国产乱一区二区| av网站一区二区三区| 午夜精品婷婷| 亚洲综合精品| 欧美日韩和欧美的一区二区| 欧美精品在欧美一区二区少妇| 日韩一区二区免费在线观看| 久久久久久久久久看片| 亚洲三级理论片| 日韩和欧美的一区| 粗大黑人巨茎大战欧美成人| 欧美一区免费| 免费在线欧美黄色| 欧美一区二区网站| 国产精品久久久久久久久久久免费看 |