999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于J2ME的游戲性能優(yōu)化的研究

2007-01-01 00:00:00
計(jì)算機(jī)時(shí)代 2007年5期

摘要:為減少J2ME游戲運(yùn)行平臺(tái)的硬件環(huán)境對游戲的性能限制,在開發(fā)階段必須對游戲的程序進(jìn)行改良化設(shè)計(jì)和采用優(yōu)化算法。文章從游戲運(yùn)行性能的角度出發(fā),分析了各種常用方案的不足,并給出了對象池技術(shù)、基本數(shù)據(jù)類型替換法、屏蔽函數(shù)計(jì)算三種能夠節(jié)省資源開銷和處理器時(shí)間以提高游戲運(yùn)行性能的優(yōu)化策略。實(shí)驗(yàn)對比表明,采用優(yōu)化算法后性能得到了提高。

關(guān)鍵詞:手機(jī)游戲;J2ME;MIDP;性能;優(yōu)化

0 引言

傳統(tǒng)手機(jī)軟件是由手機(jī)開發(fā)廠商固化在手機(jī)中的。在SUN公司推出J2ME后,各大手機(jī)廠商很快就推出了支持J2ME的手機(jī)。支持J2ME的手機(jī)可運(yùn)行由第三方提供的基于J2ME開發(fā)的軟件,使手機(jī)的擴(kuò)展功能得到極大增強(qiáng)。

在J2ME規(guī)范之中,J2ME定義了基于Java類庫的CDC(Connected Device Configuration)和CLDC(Connected LimitedDevice Configuration),在CDC和CLDC之上J2ME又定義了Profile層,稱之為MIDP(Mobile Information Device Profile)。MIDP對CDC/CLDC進(jìn)行和一定程度的封裝,并定義了一套整應(yīng)用程序接口和用戶接口。MIDP為J2ME應(yīng)用提供了兩類UI(User Interface),分別稱做高級(jí)用戶界面和低級(jí)用戶界面。高級(jí)用戶界面是被適配到設(shè)備上由手機(jī)操作系統(tǒng)定義外觀的通用圖形組件;低級(jí)用戶界面則允許開發(fā)者根據(jù)需要在界面上任意繪制圖形,是由開發(fā)者完全控制顯示內(nèi)容的圖形界面。由于手機(jī)游戲界面絕大多數(shù)由自定義的圖形元素構(gòu)成,所以不可避免地要采用低級(jí)用戶界面。

低級(jí)用戶界面開發(fā)具有高度的自由性,不同的游戲架構(gòu)和不同的編碼風(fēng)格將對最終產(chǎn)品的性能產(chǎn)生極大影響。目前對于J2ME手機(jī)游戲開發(fā)而言,最大的問題在于J2ME運(yùn)行平臺(tái)有限的資源。如何有效地利用現(xiàn)有資源以提高游戲的運(yùn)行性能,將成為開發(fā)者面臨的首要問題。本文將以一款飛行射擊游戲?yàn)槔接懫渲腥N優(yōu)化方案對手機(jī)游戲帶來的性能改善。

1 J2ME游戲運(yùn)行性能優(yōu)化準(zhǔn)則

目前被普遍采用的優(yōu)化方案有:

(1)優(yōu)化循環(huán),通過將重復(fù)的子表達(dá)式重新組織來提高循環(huán)體的運(yùn)行性能;

(2)減少使用對象的數(shù)量來提高運(yùn)行性能;

(3)縮減網(wǎng)絡(luò)傳輸數(shù)據(jù)來縮短等待時(shí)間等等。

本文給出了三種性能優(yōu)化的策略:

(1)采用對象池技術(shù),提高對象的利用率;

(2)局部使用基本數(shù)據(jù)類型代替對象,節(jié)省資源開銷;

(3)用簡單的數(shù)值計(jì)算代替復(fù)雜的函數(shù)計(jì)算,節(jié)省處理器時(shí)間。

1.1采用對象池技術(shù),提高對象的利用效率

Java是面向?qū)ο蟮木幊陶Z言,創(chuàng)建和釋放對象會(huì)占用相當(dāng)大的資源,而在Java里不用對象在很多情況下又無法實(shí)現(xiàn)。本文提出一種對象池技術(shù),將有效解決創(chuàng)建和釋放對象帶來的性能損失問題。

例如游戲中敵機(jī)的處理方式:一種解決方案是游戲在載入關(guān)卡的時(shí)候,為每架敵機(jī)創(chuàng)建一個(gè)對象,隨著游戲的行進(jìn),按照游戲進(jìn)程顯示不同的敵機(jī)。這種方案中創(chuàng)建對象的資源開銷巨大,因此嚴(yán)重影響手機(jī)游戲的運(yùn)行性能。雖然在敵機(jī)被擊毀的時(shí)候可以將對應(yīng)的對象設(shè)置為1并由System.gc()回收,但在下一關(guān)卡載入的時(shí)候還要重新創(chuàng)建相關(guān)的對象,增加了用戶的等待時(shí)間。另一種方案是在游戲的進(jìn)程中,根據(jù)需要?jiǎng)討B(tài)創(chuàng)建敵機(jī)對象,被擊毀后將對象設(shè)置為1并由System.gc()回收。這種方案雖然能減少游戲載入時(shí)間,但是頻繁地創(chuàng)建和釋放對象的資源開銷使游戲變得不流暢,對于射擊游戲這類對實(shí)時(shí)性要求很高的游戲而言,這一點(diǎn)是不可接受的。

從研究數(shù)據(jù)來看,游戲性能損耗主要源之于創(chuàng)建和釋放對象,而不創(chuàng)建對象又無法實(shí)現(xiàn)邏輯功能,因此要盡量避免對象的創(chuàng)建和釋放。問題的重點(diǎn)就轉(zhuǎn)到怎樣有效利用已有的對象上。本文提出的對象池技術(shù),就是根據(jù)需求先創(chuàng)建一定量的對象,在需要?jiǎng)?chuàng)建對象的時(shí)候從池中申請空閑對象,釋放對象時(shí)把對象釋放回池中,以有效避免由創(chuàng)建和釋放對象帶來的性能損失。

分析游戲需求發(fā)現(xiàn)同時(shí)顯示的敵機(jī)數(shù)量最多不過5架,采用對象池技術(shù)可以先定義一個(gè)對象池,容量為同時(shí)顯示的敵機(jī)的最大數(shù)量:

Enemy[5]enemy=new Enemy[5];

for(int i=0;i<5:i++){

enemy[i]=new Enemy();

}

在類Enemy里增加標(biāo)志屬性used和帶參數(shù)的reset方法使對象可重置到初始狀態(tài),在載入游戲關(guān)卡的時(shí)候初始化對象池,在需要?jiǎng)?chuàng)建對象的時(shí)候從對象池獲取一個(gè)未被使用的對象并使用reset方法初始化,需要釋放對象的時(shí)候只需將標(biāo)志位修改以供下次使用。與第一種解決方案相比使用對象池減少了相當(dāng)大一部分的資源開銷,與第二種解決方案相比使用對象池避免了頻繁創(chuàng)建對象的額外資源開銷。

表1為索尼愛立信T618手機(jī)真機(jī)運(yùn)行時(shí)的載入時(shí)間對比和游戲幀數(shù)(FPS)對照表,其中取1000除以每個(gè)gameloop的結(jié)束時(shí)間減去開始時(shí)間的差的商,即一秒內(nèi)gameloop的運(yùn)行次數(shù)為fps參考值。

表1 游戲載入時(shí)間對照表

實(shí)際運(yùn)行結(jié)果:未優(yōu)化前,在索尼愛立信T618手機(jī)上真機(jī)測試,載入時(shí)間達(dá)到17秒之多;優(yōu)化后,時(shí)間縮短到3秒。雖然方案2的載入時(shí)間更為短暫但是游戲運(yùn)行情況不流暢,嚴(yán)重影響用戶體驗(yàn)。由此可見,使用對象池可以有效減少申請和釋放對象所產(chǎn)生的損失,從而提高游戲的運(yùn)行性能。

1.2盡可能地使用基本數(shù)據(jù)類型代替對象

對象雖然屏蔽了細(xì)節(jié)實(shí)現(xiàn),但是是以犧牲存儲(chǔ)空間來實(shí)現(xiàn)的。使用基本數(shù)據(jù)類型則僅需要少量的存儲(chǔ)空間。雖然對象在邏輯的實(shí)現(xiàn)上具有優(yōu)勢,但是在絕大多數(shù)情況下,使用基本數(shù)據(jù)類型比使用對象更高效,所以在局部不影響邏輯的情況下可以考慮用基本數(shù)據(jù)類型代替對象實(shí)現(xiàn)。

在游戲中飛機(jī)要發(fā)射子彈,基于面向?qū)ο蟮脑O(shè)計(jì)模式可將子彈抽象成Bullet類,然后定義代表子彈的對象池,在發(fā)射子彈的時(shí)候,在對象池中查找可用對象并重置其位置為飛機(jī)所在的位置,即在每一個(gè)gameloop中將Bullet對象的縱坐標(biāo)值減少一定數(shù)值(屏幕坐標(biāo)系Y軸坐標(biāo)為自上而下遞增)。由于對象操作的效率低于對基本數(shù)據(jù)類型的操作,由此可以想到由基本數(shù)據(jù)類型來代替對象實(shí)現(xiàn)。代碼如下:

int[][] bullet=new int[2][10]://假設(shè)同屏同時(shí)顯示10顆子彈

for(int i=0;i<10;i++){

bullet[0][i]=999;//對應(yīng)Bullet對象的xposition屬性

bullet[1][i]=999;//對應(yīng)Bullet對象的yposition屬性

}

在每一個(gè)gameloop中:

while(run){

for(int i=0;i<10:i++){

if(bullet[1][i]==999){

//,重置為發(fā)射子彈飛機(jī)當(dāng)前的位置

bullet[0][i]==myPlane.getXposition();

bullet[1][i]==myPlane.getYposition();

}else{

//,當(dāng)前使用的子彈讓其縱坐標(biāo)減少

bullet[1][j]一=10:

}

}

}

表2是飛機(jī)單獨(dú)發(fā)射子彈的情況下的游戲幀數(shù)對照表。同時(shí)在索尼愛立信K700c上運(yùn)行相同游戲以作性能對比參照。

表2 游戲運(yùn)行幀數(shù)對照表

實(shí)際運(yùn)行結(jié)果證明:在發(fā)射子彈的時(shí)候,如果用對象來實(shí)現(xiàn),畫面明顯遲滯,而用數(shù)組實(shí)現(xiàn)則不會(huì)發(fā)生遲滯。由此可見使用數(shù)組代替對象將有助于性能的提升。

1.3用簡單的數(shù)值計(jì)算代替復(fù)雜的函數(shù)計(jì)算

在任何一款游戲里,都不可避免地要進(jìn)行函數(shù)運(yùn)算,而大量復(fù)雜的函數(shù)計(jì)算勢必會(huì)占用大量的空間和處理器時(shí)間,進(jìn)而影響游戲性能。減少函數(shù)計(jì)算復(fù)雜度或者減少復(fù)雜函數(shù)的調(diào)用次數(shù)甚至避免使用復(fù)雜函數(shù)計(jì)算,將有利于游戲性能的提高。與復(fù)雜函數(shù)運(yùn)算相比,簡單的數(shù)值計(jì)算無論從時(shí)間上還是空間上都有極大的優(yōu)勢。

在游戲中敵機(jī)也會(huì)發(fā)射子彈,不同于我機(jī)子彈,敵彈的運(yùn)行軌跡可以朝著任意一個(gè)方向。計(jì)算敵彈運(yùn)行軌跡常用的方法是使用三角函數(shù),根據(jù)飛行方向和橫坐標(biāo)軸正方向的夾角來計(jì)算敵彈的位移量。雖然MIDP2.0提供了三角函數(shù)的類庫,但是在每個(gè)gameloop中計(jì)算每顆敵彈的運(yùn)行軌跡勢必有大量的三角函數(shù)運(yùn)算而導(dǎo)致性能損失,當(dāng)子彈數(shù)目變大時(shí)這種影響更加明顯。同時(shí)由于MIDPI.0并不提供三角函數(shù)類庫,所以該游戲無法運(yùn)行在不支持MIDP2.0的手機(jī)上。

由基本的數(shù)學(xué)原理可知,當(dāng)角度一定時(shí)其對應(yīng)的三角函數(shù)值也是一定的,又因?yàn)槿呛瘮?shù)是周期函數(shù),因此本文的優(yōu)化算法是用0°-45°的函數(shù)值通過簡單的四則運(yùn)算來模擬任意函數(shù)值。實(shí)現(xiàn)方式如下:

首先定義如下數(shù)組

public static int iAngle[][]=new int[][]{

//根據(jù)游戲需要定義不同的精度,可以從0連續(xù)定義到45度。

因?yàn)镾inX=Cos(90-X),所以不必重復(fù)定義46度到90度的函

數(shù)值。

{0,1000,0},

{5,996,87},

{10,985,174),

{40,766,643},

}45,707,707}

}

無論子彈朝著哪個(gè)方向飛行,假設(shè)飛行速度一定,其橫縱坐標(biāo)位移量均為該方向?qū)?yīng)的余弦和正弦值,所以可以重新定義敵機(jī)子彈數(shù)組,將位移量包含到數(shù)組中。本游戲設(shè)定每顆子彈的飛行方向始終是固定不變的,即不會(huì)出現(xiàn)弧型的飛行軌跡:

int[][] enemyBullet=new int[4][20];

//假設(shè)同屏同時(shí)顯示20顆敵機(jī)子彈

int size=enemyBultet.length;

for(int i=0:i

enemyBullet[0][i]=999;//對應(yīng)敵機(jī)子彈對象的×坐標(biāo)

enemyBullet[1][i]=999;//對應(yīng)敵機(jī)子彈對象的y坐標(biāo)

enemyBullet[2][i]=999;

//對應(yīng)敵機(jī)子彈對象的運(yùn)行時(shí)的×坐標(biāo)位移量

enemyBullet[3][i]=999;

//對應(yīng)敵機(jī)子彈對象的運(yùn)行方的y坐標(biāo)位移量

}

按照程序的需要,從數(shù)組iAngle中把特定的數(shù)值賦值到enemyBullet[2][i]和enemyBullet[3][i],而在每一個(gè)gameloop中只需要執(zhí)行如下代碼:

inc size=enemyBullet.length:

for(int i=0;i

if(enemyBullet[0][i]!=999enemyBullet[1][i]!=999){

enemyBullet[0][i]+=enemyBullet[2][i];

enemyBullet[1][i]+=enemyBullet[3][i];

}

}

以上過程避免了每個(gè)gameloop中使用三角函數(shù)計(jì)算子彈的位移,同時(shí)也使MIDPI.0平臺(tái)的手機(jī)不會(huì)因?yàn)椴恢С諱IDP2.0而無法運(yùn)行程序。為了保證足夠的精度,這里相關(guān)函數(shù)值取3位小數(shù),在處理時(shí)可以將橫縱坐標(biāo)值enemyBullet[0][i:和enemyBullet[1][i]定義成坐標(biāo)值的1000倍,然后與坐標(biāo)值enemyBullet[2][i]和enemyBullet[3][i]相加,顯示的時(shí)候?qū)nemyBullet[0][i]和enemyBullet[1][i]的值除以1000取整。表3為優(yōu)化前后的運(yùn)行情況對照表。

表3 游戲運(yùn)行幀數(shù)對照表

實(shí)際運(yùn)行結(jié)果表明,在敵機(jī)一次性發(fā)射20顆子彈的情況下,若不使用優(yōu)化方案,索尼愛立信T618由于不支持MIDP2.0而無法進(jìn)入游戲。在使用優(yōu)化后的方案后,索尼愛立信T618能進(jìn)入游戲并有最高20fps的幀數(shù)。若使用索尼愛立信K700c作為測試環(huán)境,將敵機(jī)子彈數(shù)量增加到100顆也能流暢運(yùn)行,加上一些“彈幕”特效算法,已經(jīng)基本上能實(shí)現(xiàn)彩京公司出品的街機(jī)游戲《打擊者1945》中大部分效果。

2 結(jié)束語

當(dāng)前J2ME游戲的性能的瓶頸在于有限的存儲(chǔ)資源和偏弱的處理器速度,而J2ME游戲優(yōu)化的關(guān)鍵之處在于節(jié)省資源開銷、節(jié)省冗余計(jì)算和計(jì)算簡化,所以犧牲部分設(shè)計(jì)上的結(jié)構(gòu)化(即面向?qū)ο?換來性能的提升,在當(dāng)前情況下仍然是非常有必要的。本文提出的優(yōu)化方法為在較低的硬件條件下實(shí)現(xiàn)流暢的畫面,提供了可行的解決方案。

注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。

主站蜘蛛池模板: аⅴ资源中文在线天堂| 亚洲色无码专线精品观看| 精品人妻无码中字系列| 国产乱人激情H在线观看| 国产成人精品男人的天堂下载 | 999精品免费视频| 国产又粗又爽视频| 91成人在线免费视频| 亚洲一区第一页| 久久精品娱乐亚洲领先| 国产精品成人免费综合| 伊人久久青草青青综合| 成人综合网址| 日韩在线1| 成人综合网址| 国产91麻豆免费观看| 亚洲欧美天堂网| 亚洲国产精品不卡在线| 亚洲欧美成人在线视频| 在线无码九区| 99青青青精品视频在线| 国产亚洲欧美在线视频| 亚洲国产成人久久77| 亚洲精品动漫| 国产性生大片免费观看性欧美| a毛片在线免费观看| 青青热久免费精品视频6| 婷婷亚洲天堂| 亚洲va欧美ⅴa国产va影院| 国产永久免费视频m3u8| 国内精自视频品线一二区| 国产美女在线观看| 在线一级毛片| 欧美a√在线| 91在线播放免费不卡无毒| 毛片视频网| 99久久99视频| 欧洲高清无码在线| 国产情侣一区二区三区| 日韩 欧美 国产 精品 综合| 亚洲男女在线| 亚洲美女视频一区| 日韩av在线直播| 午夜精品影院| 色网在线视频| 农村乱人伦一区二区| 国产精品自拍露脸视频| 成人91在线| 欧美一级夜夜爽www| 亚洲美女操| 久久a毛片| 国产一区二区三区免费| AⅤ色综合久久天堂AV色综合| 亚洲人成网站18禁动漫无码| 亚洲Av激情网五月天| 欧美v在线| 91久久偷偷做嫩草影院| 在线亚洲小视频| 2021精品国产自在现线看| 国产成人无码Av在线播放无广告| a免费毛片在线播放| 天天色天天综合| 精品国产网| 国产在线一区二区视频| 欧美激情,国产精品| 成人在线欧美| 国产亚洲精久久久久久久91| 伊人久久久久久久| 无码中字出轨中文人妻中文中| 精品少妇人妻av无码久久| 91久久夜色精品国产网站| 三上悠亚精品二区在线观看| www精品久久| 91破解版在线亚洲| 国产精品黄色片| 久久亚洲国产一区二区| 99热这里只有精品免费| 日韩在线2020专区| 国模粉嫩小泬视频在线观看| 波多野结衣在线一区二区| 国产精品综合久久久| 亚洲人成色在线观看|