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);
}
雙緩沖技術可以使動畫平滑,但有一個缺點,要分配一個後台圖像的緩沖,如果圖像相當大,這將佔用很大一塊內存。
圖像跟蹤與程序的逐步完善
圖像跟蹤
當動畫線程剛剛啟動的時候,由於沒有全部載入圖像,屏幕上顯示的畫面經常是殘缺不全的。這時可以使用MediaTracker或ImageOberver類對象進行圖像跟蹤,待圖像全部載入後,再調用drawImage()方法將圖像輸出到屏幕上去。DrawImage()方法的第四個參數正是ImageObserver類對象,所以可以用ImageObserver類對象進行圖像跟蹤。在實際應用Applet程序的init()方法中實現圖像跟蹤,相當於在動畫線程的DrawImage()方法調用以前就畫了一次圖像,因為動畫線程的初始化過程,即init()方法是先被調用的。下列代碼(簡稱「C3」代碼)展示了init()方法使用MediaTracker類對象來實現跟蹤圖像的載入,代碼如下:
public void init(){
tracker=new MidiaTracker(this);
for(int i=1;i<=10;i++){
image[i-1]=getImage(getCodeBase(),"image"+i+".gif");
//用MediaTracker類對象的addImage()方法跟蹤圖像的載入
tracker.addImage(images[i-1],0);
}
......
}
程序的進一步完善
在「C2」代碼的重載update()方法中加入下列if語句,從而對MediaTracker類對象的圖像跟蹤方法做出判斷,if語句如下:
if(!tracker.checkAll()){
//如果圖像還沒有裝載完畢,則僅清除背景,同時輸出一個狀態
g.clearRect(0,0,d.width,d.height);
g.drawString("Please wait...",0,d.height/2);
return;
}
在「C1」代碼的stop()方法中加入兩行代碼,用以釋放由雙緩沖技術所佔用的內存資源,這時stop()方法改為:
public void stop(){
//停止動畫線程
animatorThread=null;
//釋放用於雙緩沖的內存資源
offGraphics=null;
offImage=null;
}
程序修改到此,還有一個小問題,就是動畫線程啟動後,第一幅圖像有時仍有殘留痕跡,而不是隨著圖像的更新而完全擦除掉。如果想解決此問題,只要將「C2」代碼中最後的for()循環和g.drawImage()方法改為如下代碼就可以了。
for(int i=0;i<10;i++){
offGraphics.drawImage(images[frameNumber%10],
,frameNumber*5%(d.width),i*d.height/10,this);
}
g.drawImage(offImage,0,0,this);
保持恆定的幀速度
為了使用戶觀看動畫時沒有閃爍感,至少需要達到每秒12幀的速度。更高的幀速度會產生更平滑的動畫。通常,在動畫顯示的每兩幀之間,調用線程的sleep()方法休眠一個固定的
『貳』 怎麼進行mysql資料庫優化
有八個方面可以對mysql進行優化:
1、選取最適用的欄位屬性
MySQL可以很好的支持大數據量的存取,但是一般說來,資料庫中的表越小,在它上面執行的查詢也就會越快。因此,在創建表的時候,為了獲得更好的性能,我們可以將表中欄位的寬度設得盡可能小。
2. 使用連接(JOIN)來代替子查詢(Sub-Queries)
MySQL從4.1開始支持SQL的子查詢。這個技術可以使用SELECT語句來創建一個單列的查詢結果,然後把這個結果作為過濾條件用在另一個查詢中。
3、使用聯合(UNION)來代替手動創建的臨時表
MySQL從4.0的版本開始支持union查詢,它可以把需要使用臨時表的兩條或更多的select查詢合並的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證資料庫整齊、高效。
4、事務
盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯合(UNION)來創建各種各樣的查詢,但不是所有的資料庫操作都可以只用一條或少數幾條SQL語句就可以完成的。更多的時候是需要用到一系列的語句來完成某種工作。但是在這種情況下,當這個語句塊中的某一條語句運行出錯的時候,整個語句塊的操作就會變得不確定起來。設想一下,要把某個數據同時插入兩個相關聯的表中,可能會出現這樣的情況:第一個表中成功更新後,資料庫突然出現意外狀況,造成第二個表中的操作沒有完成,這樣,就會造成數據的不完整,甚至會破壞資料庫中的數據。要避免這種情況,就應該使用事務,它的作用是:要麼語句塊中每條語句都操作成功,要麼都失敗
5、鎖定表
盡管事務是維護資料庫完整性的一個非常好的方法,但卻因為它的獨占性,有時會影響資料庫的性能,尤其是在很大的應用系統中。由於在事務執行的過程中,資料庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。其實,有些情況下我們可以通過鎖定表的方法來獲得更好的性能。
6、使用外鍵
鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵。
7、使用索引
索引是提高資料庫性能的常用方法,它可以令資料庫伺服器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(),MIN()和ORDERBY這些命令的時候,性能提高更為明顯。
8、優化的查詢語句
絕大多數情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當的話,索引將無法發揮它應有的作用。
『叄』 緗戠珯欏甸潰浠g爜浼樺寲鏂規硶鏄鎬庢牱鐨
緗戠珯浠g爜浼樺寲錛屽幓鎺夌綉絝欏氫綑鐨勪唬鐮侊紝浠ュ噺灝戠綉絝欑殑澶у皬錛屾彁楂樼綉絝欑殑鍔犺澆閫熷害鍜岀敤鎴蜂綋楠屻
緗戠珯浠g爜浼樺寲鏄絝欓暱蹇呴』瑕佹帉鎻$殑鍩烘湰鎶鑳斤紝榪欏叧緋誨埌鎼滅儲寮曟搸銍樿洓鏄鍚︿細瀵圭綉絝欐劅鍏磋叮錛屽啑闀挎棤鐢ㄧ殑浠g爜浼氳╄湗錏涘緢闅劇悊瑙o紝澧炲姞銍樿洓鎶撳彇緗戠珯鐨勯毦搴︼紝鍚屾椂錛岀綉欏電殑綺劇畝榪樺叧緋誨埌緗戠珯鐨勫姞杞介熷害錛屽圭敤鎴蜂綋楠岃嚦鍏抽噸瑕併傜綉絝欎唬鐮佷紭鍖栦富瑕佷粠涓涓嬪嚑涓鏂歸潰榪涜屼紭鍖栥
1銆丠EAD閮ㄥ垎浠g爜瑙勮寖鍖
2銆佷嬌鐢―IV+CSS甯冨矓緗戦〉
涓浜涚綉絝欎細浣跨敤澶栭儴鏂囦歡錛屽皢css鍜宩s鏀懼湪澶栭儴鏂囦歡涓錛岄〉闈html涓鍙瑕佹斁涓鏍蜂唬鐮佽皟鐢ㄥ氨鍙浠ヤ簡錛屾湁鏃跺欐垜浠鍘繪煡鐪嬬殑涓浜涙簮鏂囦歡浠g爜錛屼細鐪嬪埌寰堝歝ss浠g爜浠ュ強javasript浠g爜錛屽皢javascript鏀劇疆鍦ㄧ綉絝欓〉闈㈢殑html鏂囦歡涓鐨勬渶鍓嶉潰錛岃岀湡姝h兘鐢ㄥ埌寰椾竴浜涙枃瀛楅儴鍒嗚繖琚鎺ㄥ掍簡html鐨勫悗闈錛岃繖縐嶄唬鐮侀兘闇瑕佺簿綆銆
3銆丆SS浼樺寲
CSS鏄欏甸潰鏁堟灉鍛堢幇涓闈炲父閲嶈佺殑緇勬垚閮ㄥ垎錛屽畠鍖呮嫭棰滆壊銆佸ぇ灝忓昂瀵搞佽儗鏅鍜屽瓧浣撶瓑銆傚啓CSS寰堢畝鍗曞緢瀹規槗錛屼絾鏄瑕佹兂鍐欏嚭綺劇偧鐨凜SS浠g爜榪樻槸鏈夊緢澶氭妧宸х殑銆
(1)銆丆SS浣嶇疆
CSS璇存槑濡傛灉鍑虹幇鍦ㄧ綉絝欎箣鍚庯紝欏甸潰闇瑕侀噸鏂版覆鏌擄紝鎵撳紑閫熷害鍙楀埌褰卞搷錛屾墍鏈塩ss瀹氫箟浠g爜鐨勪綅緗瑕佹斁鍒扮綉絝欎箣鍓嶃
(2)銆乧ss sprite鎶鏈
緗戠珯涓婄殑涓浜涘浘鐗囧彲浠ラ噰鐢╟ss sprite鎶鏈榪涜屽悎騫訛紝鍑忓皯鍔犺澆璇鋒眰嬈℃暟錛屼粠鑰屾彁楂樼綉欏電殑鍔犺澆閫熷害銆
(3)銆丆SS浠g爜浼樺寲
閫氳繃瀵筩ss浠g爜灞炴х殑綆鍐欍佺Щ闄ゅ氫綑鐨勭粨鏋(frameworks)鍜岄噸璁(resets)絳変竴緋誨垪鐨勬柟娉曞拰鎶宸ф潵綆鍖朿ss浠g爜錛屽噺灝廲ss鏂囦歡鐨勫ぇ灝忋
(4)銆佸敖閲忎笉瑕佷嬌鐢ㄥ唴宓屽紡CSS
鍐呭祵寮廋SS鍒嗕負涓ょ嶏紝涓鏄鍦╤ead鍖哄煙鐨勬櫘閫氬唴宓屽紡;浜屾槸鍦ㄦ爣絳懼唴鍑虹幇鐨勮屽唴鍐呭祵寮廋SS錛屾棤璁烘槸浣曠嶅唴宓孋SS鏂瑰紡緇撴灉閮戒細鎻愬崌欏甸潰鐨勪綋縐錛屽規わ紝鎴戜滑鍙浠ュ敖閲忎嬌鐢ㄥ栬皟寮忕殑CSS鏉ヤ負絝欑偣欏甸潰鐨勪綋縐鐦﹁韓銆
4銆丣S浼樺寲
JS浼樺寲涓庡叾浠栬璦鐨勪紭鍖栦篃浠嶇劧鏈夌浉鍚屼箣澶勶紝JS浼樺寲鐨勫叧閿錛屼粛鐒舵槸瑕佹妸綺懼姏鏀懼湪鏈鍏抽敭鐨勫湴鏂癸紝涔熷氨鏄鐡墮堜笂錛屼竴鑸鏉ヨ達紝鐡墮堟繪槸鍑虹幇鍦ㄥぇ瑙勬ā寰鐜鐨勫湴鏂癸紝榪欏掍笉鏄璇村驚鐜鏈韜鏈夋ц兘闂棰橈紝鑰屾槸寰鐜浼氳繀閫熸斁澶у彲鑳藉瓨鍦ㄧ殑鎬ц兘闂棰樸
(1)銆丣S浣嶇疆
緗戦〉浠g爜涓瀵筳s榪涜屼紭鍖栫殑鏃跺欙紝寤鴻灝咼S鏀懼湪欏甸潰鏈鍚庯紝榪欐牱鍙浠ュ姞蹇欏甸潰鎵撳紑閫熷害銆
(2)銆佸悎騫禞S
鍚堝苟鐩稿悓鍩熷悕涓嬬殑js錛岄氳繃鍑忓皯緗戠粶榪炴帴嬈℃暟浠庤屾彁楂樼綉欏電殑鎵撳紑閫熷害銆
(3)銆丩azyLoad(寤惰繜鍔犺澆)鎶鏈
Lazy
Load鏄涓涓鐢↗avaScript緙栧啓鐨刯Query鎻掍歡錛屽畠鍙浠ュ歡榪熷姞杞介暱欏甸潰涓鐨勫浘鐗囷紝鍦ㄦ祻瑙堝櫒鍙瑙嗗尯鍩熷栫殑鍥劇墖涓嶄細琚杞藉叆錛岀洿鍒扮敤鎴峰皢欏甸潰婊氬姩鍒板畠浠鎵鍦ㄧ殑浣嶇疆
(4)銆丣S浠g爜澶栭儴鐨勮皟鐢
鎴戜滑鐭ラ亾褰撳墠鐨勬悳緔㈠紩鎿庤繕鏄涓嶈兘澶熻瘑鍒獼S浠g爜鐨勶紝鍊樿嫢鍦ㄧ綉絝欎腑鍑虹幇澶ф壒閲忕殑js浠g爜緗戠珯鍦ㄦ敹褰曚笂灝變細鍑虹幇鍥伴毦錛岃屾垜浠瑕佸仛鐨勫氨鏄灝嗙敤鍒癑avascript浠g爜鐢ㄥ栭儴璋冪敤鐨勫艦寮忔斁鍦ㄧ綉絝欎腑錛岃繖鏍峰彲浠ョ畝鍖栨悳緔㈠紩鎿庣殑宸ヤ綔錛屼篃涓嶄細鍦ㄦ棤褰涓琛嶇敓鍑烘棤鏁堜唬鐮佺瘡鍙婄綉絝欍
涓嶄粎濡傛わ紝鍙浠ラ噰鐢ㄥ栭儴璋冪敤鐨勮繕鏈塩ss浠g爜錛屽緩絝欎箣鍒濆彲浠ュ皢緗戠珯鐨勬枃瀛椼侀滆壊瀹氫箟鍦╟ss浠g爜鏂囦歡涓錛屽敖閲忎笉瑕佸湪欏甸潰浠g爜鍐呭嚭鐜拌繃澶氱殑鏍峰紡浠g爜銆
(5)銆侀檷浣庨〉闈㈠逛簬JS鐨勪緷璧栨
鐜板湪鏉ヨ達紝JS瀵逛簬鎼滅儲寮曟搸騫朵笉涓嶅弸濂斤紝鉶界劧鏈夋秷鎮縐版悳緔㈠紩鎿庝笉浼氬笿S鏈夊帉鎮剁殑鎯呯華錛屼絾鏄澶氫竴浜嬩笉濡傚皯涓浜嬶紝鉶界劧JS鍙浠ュ埗浣滃嚭寰堝氱殑鏁堟灉錛屼絾鏄緗戦〉涓澶ч噺鐨凧S灝嗗獎鍝嶈湗錏涘歸〉闈㈢殑鎶撳彇鍜屽炲姞緗戦〉浣撶Н錛屽挨鍏舵槸欏甸潰鐨勫叧閿浣嶇疆濡傚艱埅鏍忥紝灝介噺閲囩敤DIV+CSS鐨勮捐℃柟娉曘
5銆乀ABLE鏍囩劇殑緙╁噺
table鏍囩炬槸鐜板湪澶у氭暟涓婄嚎緗戠珯涓鏈涓哄父瑙佺殑浠g爜褰㈠紡錛屽師鍥犳牴鏈鍦ㄤ簬table鍦ㄥ緩絝嬬綉絝欐椂姣旇緝蹇鎹鳳紝浣嗘槸榪欎篃灝卞獎鍝嶄簡緗戠珯鐨勫悗鏈熶紭鍖栥
鐩稿逛簬div+css甯冨矓鐨勭簿綆浠g爜緗戠珯鏉ヨ達紝瀹冪殑鍗犱綅姣旇緝澶э紝鎵浠ワ紝鍦ㄥ緩絝欐椂鍊欙紝灝介噺鏄灝戠敤琛ㄦ牸錛屽嵆渚挎槸瑕佷嬌鐢ㄨ〃鏍兼椂錛屽祵濂楀紡琛ㄦ牸涔熻佸敖閲忓皯鐢錛屼互鍏嶄駭鐢熷啑鏉備唬鐮
閭d箞錛岀幇鍦ㄧ殑緗戠珯鐢ㄤ粈涔堝仛鍛?寰堝氱▼搴忓憳絎涓鎯蟲硶灝辨槸閲囩敤CSS鍘誨仛錛岄噰鐢–SS鍘繪帓鐗堬紝榪欑嶅仛娉曞憿錛屽氨浣塊〉闈涓鐨勮〃鏍煎ぇ澶х殑闄嶄綆浜嗭紝浣嗘槸錛岀綉絝欎篃涓嶈兘娌℃湁琛ㄦ牸錛屾湁浜涗簨蹇呴』浣跨敤鍒板緱錛屼嬌鐢ㄨ〃鏍兼湰韜娌′粈涔堬紝浣嗘槸鏈夊緢澶氱綉絝欓兘閲囩敤宓屽楄〃鏍礆紝涓鑸榪欐牱鐨勮〃鏍煎艦寮忎細緇欑綉絝欎駭鐢熷ぇ閲忕殑鍨冨溇浠g爜錛屽苟涓旇繖浜涘瀮鍦句唬鐮侀兘鏄娌℃湁浠諱綍鐢ㄥ勭殑浠g爜錛岃繖涓綾諱唬鐮佷篃鏄鎴戜滑緗戠珯闇瑕佺簿綆鐨勪唬鐮佷箣涓銆
6銆佷唬鐮佹敞閲婄渷鐣
寰堝氱▼搴忎漢鍛樺湪緙栧啓浠g爜鏄閮戒範鎯鍦ㄥ埆浜虹湅涓嶆噦鐨勫湴鏂圭粰鍑轟竴孌墊敞閲婏紝榪欎簺浠g爜寰寰鏄涓轟簡鍑犱釜紼嬪簭鍛樹箣闂寸殑鍗忓悓宸ヤ綔錛屽逛簬澶栦漢浠ュ強鎼滅儲寮曟搸鏉ヨ存病鏈変換浣曠敤澶勶紝鐩稿弽榪樹細緇欐悳緔㈠紩鎿庤湗錏涘甫鏉ヤ竴瀹氱殑鍥版壈銆
鎵撳紑欏甸潰浠g爜鎴戜滑緇忓父浼氱湅鍒頒竴浜涙敞閲婁唬鐮侊紝榪欐槸紼嬪簭鍛樹負浜嗚〃鏄庝唬鐮佹剰涔夎屽仛鐨勬敞閲婏紝鍏跺疄榪欎簺鎵撳紑涓嶅繀錛屽洜涓哄逛簬鎼滅儲寮曟搸鑰岃█錛屽畠浠鏄涓嶅瓨鍦ㄤ換浣曟剰涔夌殑錛屽彧鏄浼氬炲姞浜嗛〉闈浠g爜鐨勫歸噺錛岃繖鏍峰逛簬緗戠珯涓嶄細鏈変粈涔堝埄澶勶紝涓嶅傜洿鎺ョ渷鐣ャ
7銆佹竻闄ら〉闈涓澶氫綑鐨勪唬鐮
鏈夌殑緗戠珯浠ヤ負鍒朵綔鑰呯殑浠g爜涔﹀啓涔犳儻闂棰橈紝欏甸潰浼氭湁寰堝氱┖鏍間唬鐮侊紝姣斿傦細絀烘牸浠g爜銆乻tyle鍜宖ont閲嶅嶅畾涔夌殑浠g爜錛屼笉瑕佸皬鐪嬭繖浜涗綋縐寰堝皬鐨勪唬鐮侊紝縐鏀掑氫簡錛屼篃浼氫嬌鎴戜滑鐨勭綉絝欏紓甯哥殑鑷冭偪銆
寰堝氱綉絝欓兘鏄閲囩敤鐨凞IV+CSS錛屽湪CSS涓瀹氫箟浜嗘枃瀛楃殑瀛椾綋錛岄滆壊錛屼互鍙婇〉闈㈢殑鎺掔増錛屼絾鏄鍦ㄧ綉絝欑殑鍏朵粬鍦版柟榪樼敤浜嗕互style浠ュ強font鏉ュ啀嬈″畾涔夊瓧浣撳瓧浣擄紝榪欎簺浠g爜瀹屽叏娌℃湁蹇呰侀噸澶嶅畾涔夛紝灞炰簬鍙浠ョ簿綆鐨勪唬鐮併
8銆佸皢html鎺у埗鏂瑰紡杞鎹涓篊SS鎺у埗
寰堝氱綉欏佃捐¤呬範鎯鍦ㄦ爣絳懼唴瀵瑰唴瀹硅繘琛屾帶鍒訛紝姣斿俰mg鏍囩鵑噷閫氳繃width鍜宧eight鏉ユ帶鍒跺浘鐗囩殑澶у皬錛屽敖閲忓皢榪欎簺浠g爜杞鎹㈡垚澶栬皟寮忕殑CSS錛屼嬌緗戦〉浠g爜鏇村姞鐨勭槮韜銆
9銆佺紦瀛橀潤鎬佽祫婧
閫氳繃璁劇疆嫻忚堝櫒緙撳瓨錛屽皢css銆乯s絳変笉澶緇忓父鏇存柊鐨勬枃浠剁紦瀛樺湪嫻忚堝櫒絝錛岃繖鏍峰悓涓璁垮㈠啀嬈¤塊棶緗戠珯鐨勬椂鍊欙紝嫻忚堝櫒灝卞彲浠ヤ粠嫻忚堝櫒鐨勭紦瀛樹腑鑾峰彇css銆乯s絳夛紝鑰屼笉蹇呮瘡嬈¢兘浠庢湇鍔″櫒璇誨彇錛岃繖鏍峰湪涓瀹氱▼搴︿笂鍔犲揩浜嗙綉絝欑殑鎵撳紑閫熷害錛屽張鍙浠ヨ妭綰︽湇鍔″櫒嫻侀噺銆
10銆佺綉欏靛帇緙╂妧鏈
瀵逛簬緗戦〉鍘嬬緝鑰岃█錛岀浉淇″悇浣嶇珯闀塊兘姣旇緝鐔熸倝錛屼富瑕佹槸鍚鐢ㄦ湇鍔″櫒Gzip錛屽歸〉闈Gzip鍘嬬緝錛屽噺灝戝厓緔犵殑浣撶Н錛屼粠鑰屽噺灝戞暟鎹鐨勪紶杈擄紝榪涜屾彁楂樼綉欏電殑鍔犺澆閫熷害錛岃繖涓鍔熻兘闇瑕佹湇鍔″櫒鐨勬敮鎸侊紝GZIP鍘嬬緝涓鑸鑳藉圭綉欏佃繘琛30%-80%鐨勫帇緙╋紝鏄鏈閲嶈佺殑涓縐嶄紭鍖栨晥鏋溿
鎬諱箣錛岄氳繃浠g爜浼樺寲鏉ヨ搗鍒扮綉絝欎紭鍖栦綔鐢ㄧ殑鏂瑰紡榪樻湁寰堝氾紝鍦ㄨ繖鍙鏄闅忔剰鐨勮翠簡鍏朵腑姣旇緝甯歌佺殑鑰屽凡銆
『肆』 涓嶅悓璇璦濡備綍瀹炵幇浠g爜浼樺寲
1.鏁村艦鏁板傛灉鎴戜滑紜瀹氭暣鏁伴潪璐燂紝灝卞簲璇ヤ嬌鐢╱nsigned int鑰屼笉鏄痠nt銆傛湁浜涘勭悊鍣ㄥ勭悊鏃犵﹀彿unsigned 鏁村艦鏁扮殑鏁堢巼榪滆繙楂樹簬鏈夌﹀彿signed鏁村艦鏁幫紙榪欐槸涓縐嶅緢濂界殑鍋氭硶錛屼篃鏈夊埄浜庝唬鐮佸叿浣撶被鍨嬬殑鑷瑙i噴錛夈傚洜姝わ紝鍦ㄤ竴涓緔у瘑寰鐜涓錛屽0鏄庝竴涓猧nt鏁村艦鍙橀噺鐨勬渶濂芥柟娉曟槸registerunsignedintvariable_name;璁頒綇錛屾暣褰in鐨勮繍綆楅熷害楂樻誕鐐瑰瀷float錛屽苟涓斿彲浠ヨ澶勭悊鍣ㄧ洿鎺ュ畬鎴愯繍綆楋紝鑰屼笉闇瑕佸熷姪浜嶧PU錛堟誕鐐硅繍綆楀崟鍏冿級鎴栬呮誕鐐瑰瀷榪愮畻搴撱傚敖綆¤繖涓嶄繚璇佺紪璇戝櫒涓瀹氫細浣跨敤鍒板瘎瀛樺櫒瀛樺偍鍙橀噺錛屼篃涓嶈兘淇濊瘉澶勭悊鍣ㄥ勭悊鑳芥洿楂樻晥澶勭悊unsigned鏁村瀷錛屼絾榪欏逛簬鎵鏈夌殑緙栬瘧鍣ㄦ槸閫氱敤鐨勩備緥濡傚湪涓涓璁$畻鍖呬腑錛屽傛灉闇瑕佺粨鏋滅簿紜鍒板皬鏁扮偣鍚庝袱浣嶏紝鎴戜滑鍙浠ュ皢鍏朵箻浠100錛岀劧鍚庡敖鍙鑳芥櫄鐨勬妸瀹冭漿鎹涓烘誕鐐瑰瀷鏁板瓧銆
浠g爜錛坈ode錛夋槸紼嬪簭鍛樼敤寮鍙戝伐鍏鋒墍鏀鎸佺殑璇璦鍐欏嚭鏉ョ殑婧愭枃浠訛紝鏄涓緇勭敱瀛楃︺佺﹀彿鎴栦俊鍙風爜鍏冧互紱繪暎褰㈠紡琛ㄧず淇℃伅鐨勬槑紜鐨勮勫垯浣撶郴銆
浠g爜璁捐$殑鍘熷垯鍖呮嫭鍞涓紜瀹氭с佹爣鍑嗗寲鍜岄氱敤鎬с佸彲鎵╁厖鎬т笌紼沖畾鎬с佷究浜庤瘑鍒涓庤板繂銆佸姏奼傜煭灝忎笌鏍煎紡緇熶竴浠ュ強瀹規槗淇鏀圭瓑銆 婧愪唬鐮佹槸浠g爜鐨勫垎鏀錛屾煇縐嶆剰涔変笂鏉ヨ達紝婧愪唬鐮佺浉褰撲簬浠g爜銆傜幇浠g▼搴忚璦涓錛屾簮浠g爜鍙浠ヤ功綾嶆垨紓佸甫褰㈠紡鍑虹幇錛屼絾鏈涓哄父鐢ㄦ牸寮忔槸鏂囨湰鏂囦歡錛岃繖縐嶅吀鍨嬫牸寮忕殑鐩鐨勬槸涓轟簡緙栬瘧鍑鴻$畻鏈虹▼搴忋傝$畻鏈烘簮浠g爜鏈緇堢洰鐨勬槸灝嗕漢綾誨彲璇繪枃鏈緲昏瘧鎴愪負璁$畻鏈哄彲鎵ц岀殑浜岃繘鍒舵寚浠わ紝榪欑嶈繃紼嬪彨緙栬瘧錛屽畠鐢遍氳繃緙栬瘧鍣ㄥ畬鎴愩