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爜链缁堢洰镄勬槸灏嗕汉绫诲彲璇绘枃链缈昏疟鎴愪负璁$畻链哄彲镓ц岀殑浜岃繘鍒舵寚浠わ纴杩欑嶈繃绋嫔彨缂栬疟锛屽畠鐢遍氲繃缂栬疟鍣ㄥ畬鎴愩