国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

經(jīng)典收藏:J2MEGame的開發(fā)筆記

2019-11-18 16:14:35
字體:
供稿:網(wǎng)友

  J2ME Game開發(fā)筆記-嘗試IO優(yōu)化
  正在開發(fā)的一個(gè)游戲,由于讀地圖的時(shí)候做了圖片切割,所以速度比較慢。(在我開發(fā)上一個(gè)游戲的時(shí)候,讀取地圖時(shí)沒有裝載切割圖片,速度非??欤磥恚桑喜僮鞯乃俣群蚦reateImage,drawImage相比是微不足道的)對于IO的優(yōu)化也許根本不會明顯的提高速度,但我還是試了一下。
  
  分析了一下代碼,在最初的代碼中為了比較方便的讀取各種類型的數(shù)據(jù),使用DataInputStream套接InputStream??墒俏易屑?xì)看了一下我讀取得數(shù)據(jù),居然都是byte,唯一的一個(gè)char也是被我用兩個(gè)byte手工組裝起來的。這下,DataInputStream看來是不需要了。于是我做了個(gè)實(shí)驗(yàn),沒改動之前讀取地圖耗時(shí)1242ms,將DataInputStream去掉直接使用InputStream耗時(shí)1065ms,雖然每次試驗(yàn)的結(jié)果都稍有不同,但大概還是節(jié)約了200ms左右。
  
  還能再加快點(diǎn)嗎?再觀察一下代碼,我發(fā)現(xiàn)數(shù)據(jù)是通過多次的read操作讀取進(jìn)來的。太過頻繁的io操作會不會降低速度呢?如果用一個(gè)字節(jié)數(shù)組作緩沖一次性將數(shù)據(jù)都讀進(jìn)來會不會快點(diǎn)?嗯,試一試才知道。但是我怎么知道一個(gè)流的大小呢?InputStream的avaliable方法總是返回-1??!打開兩次流,第一次先計(jì)算大小?對了,還有一個(gè)方法。直接將文件大小寫到文件前面。地圖文件是用自己的編輯器生成的,知道大小很容易。于是我在文件前面用兩個(gè)byte紀(jì)錄了文件的大小,先從流中讀取2個(gè)byte,得到文件大小后,再用read(byte[],int,int)方法將整個(gè)流讀取到緩沖中。然后,我的所有數(shù)據(jù)操作都從緩沖中讀取。好,試驗(yàn)一下,結(jié)果是:1154ms。阿? 慢了近100ms。事實(shí)證明了這個(gè)猜想是錯(cuò)誤的。原因?也許只有了解KVM的機(jī)制才知道。
  
  弄完速度的問題,我又覺得讀取文件的try塊太大了,因?yàn)槭沁呑x邊處理數(shù)據(jù),所以try塊變得很大。try塊太大會增加class文件的大小。于是我用一個(gè)方法將讀取byte的操作封裝起來,當(dāng)然這個(gè)方法是聲明為PRivate static的,但究竟能不能內(nèi)聯(lián),只有編譯器和kvm才知道。在這個(gè)方法內(nèi)部從流中讀取一個(gè)字節(jié)的時(shí)候采用了try,catch結(jié)構(gòu),這就使一個(gè)大try塊分散成若干小try塊。試驗(yàn)了一下,耗時(shí)1089ms,誒,還是慢了點(diǎn)?,F(xiàn)在對于速度的要求比空間更高,更何況減小try塊節(jié)省的10幾個(gè)字節(jié)打包后基本忽略不計(jì)了。所以這個(gè)優(yōu)化又失敗了。
  
  小結(jié):能使用簡單流的時(shí)候就不要使用復(fù)雜流,不要太相信理論上的說法,只有試了才知道。
  
  注:試驗(yàn)數(shù)據(jù)是Nokia3100手機(jī)的實(shí)機(jī)測試數(shù)據(jù),在Nokia 3300上這個(gè)數(shù)據(jù)更小些,最快約800多ms
  
  壓縮還是不壓縮
  做J2ME的都知道Midlet Suite的容量實(shí)在太小了,于是不免想做點(diǎn)壓縮。前些天,我就嘗試了一次壓縮。我自己定義的地圖文件里有3層數(shù)據(jù),其中2,3層有大片連續(xù)分布的相同的值。 唉?我一琢磨,使用一個(gè)簡單的行長編碼壓縮,僅對這個(gè)值進(jìn)行行長編碼,算法很簡單速度又不慢,卻可以大大減小地圖文件的大小??雌饋碚娴暮懿诲e(cuò)誒!說干就干,忙了半天,又改地圖編輯器,又改游戲中讀地圖的代碼??偹愀愣?,試了一下,原來2.23k的一個(gè)文件被壓縮到900多字節(jié)。好像很不錯(cuò)啊,接著我打了個(gè)jar包,卻突然發(fā)現(xiàn)這個(gè)jar文件好像并沒有比原來小阿!似乎還大了點(diǎn)。我連忙找出備份的代碼,果然原來的jar更小點(diǎn)!怎么回事啊??我突然想到,jar本身就是壓縮格式的。難道。。。我趕快用WinRAR打開兩次的jar文件觀察。~~~~~原來如此!原來的jar中,2.23k的文件的包大小為185字節(jié),而我現(xiàn)在的jar中,900多字節(jié)的文件的包大小為216字節(jié)。也就是說,我自己先壓縮一遍的文件打包后還不如不壓縮的小!
  
  看來自己做壓縮之前,一定要先看看你想壓縮的文件在包里面的大小。還有對于png文件,使用某些工具優(yōu)化后,在包里面的大小卻變大了。這個(gè)還真是要注意阿~!
  
  移植一法
  近日觀察某些游戲的源代碼(反編譯后的),發(fā)現(xiàn)有個(gè)方法挺方便游戲的移植的。定義一個(gè)接口(比如stringTable)將游戲中所用到的靜態(tài)字符串都定義為接口的常量。然后,讓使用到這些字符串的類實(shí)現(xiàn)stringTable接口。這樣移植的時(shí)候只要修改接口里面的字符串就行了。當(dāng)然,對于游戲中坐標(biāo)的定位,最好使用getWidth(),getHeight()還有Font類的方法stringWidth,不要定死了。這樣的話,移植工作就比較輕松了。
  
  鍵盤響應(yīng)
  不同的機(jī)型對于鍵盤事件的響應(yīng)不一樣。經(jīng)過我的測試,Nokia 7210,3100一次只能接受一個(gè)按鍵信息。(我寫了個(gè)測試程序,發(fā)現(xiàn)如果一個(gè)鍵被按下后沒有松開,則KeyPressed事件不會再產(chǎn)生,即其他鍵的按下操作無效)所以,用緩沖處理控制精靈運(yùn)動時(shí),如果規(guī)定只能四方向運(yùn)動。如果up已按下,再按下left,精靈的運(yùn)動方向并不會改變。不過將按鍵緩沖。按下up,按下left不釋放,松開up---精靈就會向左運(yùn)動。(在松開up后產(chǎn)生了left的KeyPressed事件!奇怪嗎?松開up后我并沒有進(jìn)行"按下"left這個(gè)動作--left鍵在up松開前就被按下了且沒有松開。似乎機(jī)器一直在監(jiān)測鍵盤上各鍵的狀態(tài),并且有一個(gè)等待隊(duì)列。)
  
  在wtk的標(biāo)準(zhǔn)模擬器上就不同了。它可以接受多個(gè)按鍵“同時(shí)”按下的事件。所以如果用四個(gè)并列的if處理,精靈是可以斜著運(yùn)動的。如果用if else處理,則如果已經(jīng)按下一個(gè)方向鍵,然后再按下另一個(gè),是否能改變方向受到if else 語句中順序的影響。即,如果是 if(up) else if(left),則會先檢查up鍵,所以如果已經(jīng)按下了left,再按up是可以向上運(yùn)動的,反過來就不行了。(這個(gè)自然:)
  
  其它的機(jī)型由于手頭沒有機(jī)器,我也沒試過。應(yīng)該也是如此吧。
  
  多機(jī)型移植經(jīng)驗(yàn)談
  開發(fā)的時(shí)候平臺是Nokia 40,然后移植到Nokia 60, Moto V, SE等,總結(jié)一下大概需要幾個(gè)版本。
  1 Nokia 40版, 使用Midp1.0+Nokia UI API
  2 Nokia 60版, 使用Midp1.0+NOkia UI API
  3 Nokia Midp2.0版,如6600,7610,使用Midp2.0
  4 Moto V版,使用Midp2.0
  5 SE版,使用Midp2.0
  6 三星s100,s200,c100,使用Midp2.0
  
  幾點(diǎn)開發(fā)經(jīng)驗(yàn):
  1 各機(jī)型之間最大的差別就是屏幕大小不同。所以游戲中要能自適應(yīng)屏幕大小
  2 不使用Midp2.0的GameAPI會比較方便移植,只要自己封裝切圖,旋轉(zhuǎn)等函數(shù)即可。NokiaUI API和Midp2。0都支持圖片選轉(zhuǎn)。2.0支持的更好。注意Nokia 60不支持創(chuàng)建可變的透明圖片,所以要用其他方法代替。
  3 NOkia 6600,7610的UI API有問題(圖片旋轉(zhuǎn)),所以用了Midp2.0代替
  4 支持MIDP2。0的機(jī)器程序大致相同,其中MOto,SE,SX都差不多。但也有細(xì)微差別。如SE不支持全屏。所以screenSizeChanged方法無效。
  5 說說聲音播放。NOkia s40上我堅(jiān)決不用聲音,一是容量限制,二是太難聽。其他機(jī)型都可以支持midi和wav.不過沒有發(fā)現(xiàn)可以同時(shí)播放2個(gè)midi的機(jī)型,moto v和se都可以同時(shí)播放midi和wav,nokia則不行。

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 双峰县| 来宾市| 花莲县| 阳信县| 伊金霍洛旗| 汤阴县| 徐水县| 荣成市| 云梦县| 鲜城| 津市市| 玛曲县| 桃园市| 井陉县| 电白县| 枝江市| 永安市| 邵阳县| 阿拉尔市| 麻栗坡县| 河西区| 会东县| 福安市| 大关县| 宣化县| 新民市| 西华县| 修水县| 云浮市| 潍坊市| 张家口市| 阿合奇县| 原平市| 绥德县| 岚皋县| 开鲁县| 容城县| 禄劝| 永昌县| 建昌县| 华容县|