Android遊戲開發初始階段建議

2021-06-16 12:44:51 字數 3664 閱讀 8050

原文出處:
獲取sdk

學習應用程式架構

學習activity生命週期

activity生命週期由android作業系統來管理。你的activity建立、恢復、暫停、銷毀都受作業系統的支配。正確處理這些事件是很重要的,這樣應用程式才能表現良好,做使用者認為正確的事。在你設計你的遊戲之前了解所有這些是如何工作的是件好事,因為以後你可以為自己節省除錯時間和昂貴的重新設計時間。對大多數應用來說,預設的設定將工作正常,但對於遊戲,你可能需要考慮將singleinstance標誌開啟。當設定為預設時,android在它認為合適時會建立activity的新例項。對於遊戲來說,你可能只需要乙個遊戲activity的例項。這對於你要怎樣管理事務的狀態有些影響,但對於我來說,這解決了一些資源管理的問題,應予以考慮。

主迴圈根據你寫的遊戲的型別,你可能需要也可能不需要乙個主迴圈。如果你的遊戲不依賴於時間或者它僅僅對使用者所做的加以回應,並且不做任何視覺上的改變,永遠等待著使用者的輸入,那麼你就不需要主迴圈。如果你寫的是動作類遊戲或者帶有動畫、定時器或任何自動操作的遊戲,你應該認真考慮下使用主迴圈。

遊戲的主迴圈以乙個特定的順序通常盡可能多的在每秒鐘內「滴答」提醒子系統執行。你的主迴圈需要在它自己的執行緒裡執行,原因是android有乙個主使用者介面執行緒,如果你不執行自己的執行緒,使用者介面執行緒將會被你的遊戲所阻塞,這會導致android作業系統無法正常的更新任務。執行的順序通常如下:狀態,輸入,人工智慧,物理,動畫,聲音,錄影。

更新狀態意思是管理狀態轉換,例如遊戲的結束、人物的選擇或下乙個級別。很多時候你需要在某個狀態上等上幾秒鐘,而狀態管理應該處理這種延遲,並且在時間過了之後設定成下乙個狀態。

輸入是指使用者按下的任何鍵、對於滾動條的移動或者使用者的觸控。在處理物理之前處理這些是很重要的,因為很多時候輸入會影響到物理層,因而首先處理輸入將會使遊戲的反應更加良好。在android裡,輸入事件從主使用者介面執行緒而來,因此你必須寫**將輸入放入緩衝區,這樣你的主迴圈可以在需要的時刻就從緩衝區裡取到它。這並非難事。首先為下乙個使用者輸入定義乙個域,然後將onkeypressed或ontouchevent函式設為接到乙個使用者動作就放到那個域裡,有這兩步就夠了。如果對於給定遊戲的狀態,這是乙個合法的輸入操作,那麼所有輸入需要在那一刻做的更新操作都已經定下來了,剩下來就讓物理去關心怎樣響應輸入吧。

物理可能是也可能不是真正的物理。對於動作類遊戲來說,關鍵點是要考慮到上一次更新的時間、正在更新的當前時間、使用者輸入以及人工智慧,並且決定它們朝著什麼方向發展和是否會發生衝突。對於乙個你視覺化地抓取一些部件並滑動它們的遊戲來說,物理就是這個遊戲中滑動部件或者使之放入合適的位置的部分。對於乙個小遊戲來說,物理即使這個遊戲中決定答案是錯還是對的部分。你可能將其命名為其他東西,但每個遊戲都有乙個作為遊戲引擎的紅肉部分(譯者注:可能是主體部分的意思),在這篇文章裡,我把這部分稱為物理。

動畫並非像在遊戲裡放入會動的gif那樣簡單。你需要使得遊戲能在恰當的時間畫出每一幀。這並沒有聽起來那麼困難。保留一些像isdancing、danceframe和lastdanceframetime那樣的狀態域,那樣動畫更新便能決定是否可以切換到下一幀去了。動畫更新真正做的事就那麼多。真正來顯示動畫的變化是由錄影更新來處理的。

聲音更新要處理觸發聲音、停止聲音、音量變化以及音調製化。正常情況下當寫遊戲的時候,聲音更新會產生一些傳往聲音緩衝區的位元組流,但是android能夠管理自己的聲音,因而你的選擇將是使用soundpool或者mediaplayer。它們都需要小心處理以免出錯,但你要知道,因為一些底層實現細節,小型、低位元率的聲音檔案將帶來最佳的效能和穩定性。

錄影更新要考慮遊戲的狀態、角色的位置、分數、狀態等等,並將一切畫到螢幕上。如果使用主迴圈,你可能需要使用su***ceview,並做乙個「推」繪製。對於其他檢視,檢視本身能夠呼叫繪製操作,主迴圈不必處理。su***ceview每秒產生的幀數最多,最適合於一些有動畫或螢幕上有運動部件的遊戲。錄影更新所要做的工作是獲取遊戲的狀態,並及時地為這個狀態繪製影象。其他的自動化操作最好由不同的更新任務來處理。

**看起來是什麼樣的?這兒有個例子。

1: public void run()

6: update();

7: }

8: }

9:10: private void update()

3d還是2d?

在開始寫遊戲之前,你要決定是做3d的還是2d的。2d遊戲有乙個低得多的學習曲線,一般更容易獲得良好的效能。3d遊戲需要更深入的數學技能,並且如果你不在意的話會有效能問題產生。如果你打算畫比方框和圓圈更複雜的圖形,還需要會使用3d studio和maya那樣的建模工具。android支援opengl用來3d程式設計,並且在opengl方面有很多很好的教程可供學習。

建立簡單、高質量的方法

上手時,要確保你整個遊戲不要就用乙個龐大而冗長的方法。如果你遵循我上面描述的主迴圈模式,這將相當簡單。每個你寫的方法應當完成乙個非常特定的任務,並且它就應該無差錯地那樣做。舉例來說,如果你需要洗一副紙牌,你應該寫乙個「shufflecards」的方法,並且該方法就應該只做這一件事。

這是乙個適用於任何軟體開發的編碼實踐,但對於遊戲開發來說這尤為重要。在乙個有狀態的、實時的系統裡,除錯將變得非常困難。使你的方法盡量的小,一般的經驗法則是每個方法有且僅有乙個目的(譯者注:完成且僅完成乙個功能)。如果你要為乙個場景用程式設計方式畫乙個背景,你可能需要乙個叫做「drawbackground」的方法。諸如此類的任務能夠很快完成,因而你可以按照搭積木的方法來開發你的遊戲,而你能夠繼續新增你要的功能,並且不會使得這一切難以理解。

最重要的是效率!

效能是任何遊戲的主要問題。我們的目標是使得遊戲的反應越快越好,看起來越流暢越好。某些方法如canvas.drawline比較慢。並且要將螢幕大小的位圖畫到主畫布上,每一幀都是代價昂貴的。如何權衡對於達到最佳效能很有必要。確保管理好你的資源,使用技巧來以最少量的cpu資源完成你的任務。如果效能不好的話,即使是最好的遊戲玩起來也沒勁。人們一般對於遊戲卡或者響應慢幾乎難以容忍。

提示和技巧

看一下sdk中的示例lunarlander。它使用su***ceview,這對於乙個每秒需要處理最多幀的遊戲來說是合適的。如果你要做3d,示例中有glview可以處理3d顯示的很多初始化工作。對lightracer來說,我不得不優化把所有東西都畫出來這種方法,否則幀率將會大大地降低。我只在檢視初始化的時候把背景畫進乙個位圖里一次。路徑放在它們自己的位圖里,隨著車手的前進而更新。這兩個點陣圖在每一幀裡都被畫進主畫布中去,車手畫在頂端,到最後會有乙個**。這種技術使得遊戲執行在乙個可以玩的程度。

如果適用的話,使得你的點陣圖的大小精確等於你打算畫到螢幕上的大小,這也是個好的實踐。這麼做了以後就需要縮放,可以節省cpu資源。

在遊戲中始終一致的點陣圖配置(如rgba8888)。這將會通過減少不同格式之間轉換的時間來節省圖形庫的cpu時間。

如果你決定開發3d遊戲但沒有3d方面的知識,你需要挑選一兩本3d遊戲程式設計方面的書並學習線性代數。你最少要理解點積、叉積、向量、單元向量、法線、矩陣和變換。這方面我遇到的最好的書是叫《3d遊戲程式設計和計算機圖形學數學》。

聲音檔案要小而且低位元率。需要載入的越少,載入速度越快,遊戲所需記憶體越少。

聲音使用ogg檔案,使用png檔案。

加入android谷歌小組,尋求社群支援。這裡有人可以在開發過程中給你幫助。

最重要的是,花時間測試再測試,確保每一小部分都如你所願地工作。改善遊戲是整個開發中最耗時最困難的部分。如果你匆匆將其推向市場,你很可能會使使用者們失望,你會感到你的努力都白費了。你不可能使所有人都喜歡你寫的東西,但你至少要盡量發布你最高質量的作品。

google在這裡有幫助你上手的絕佳的文件。

開發過程 初始階段

剛剛學習軟體開發過程 在專案初始階段主要做如下工作 b 1 統一各專案成員對開發過程的認識 b 開發過程的流派很多 xp rup 等等,每個公司又有其獨特的開發過程 必須在專案開始前統一開發過程 b 2 專案前景文件 b 統一專案成員的價值觀,相信專案的價值 不認可的可以離開了 b 3 獲取初始需求...

android遊戲開發

1 容器我們準備自定義viewgroup 叫做game2048layout 裡面的塊塊自定義view 叫做game2048item 接下來從簡單的開始 2 game2048item game2048item是個view,並且需要哪些屬性呢?首先得有個number,顯示數字嘛,然後繪製的時候根據num...

android 遊戲開發框架

activity類 必要屬性 各種su ceview 各種動畫執行緒 各種聲音 mediaplayer或者soundpool handler 根據收到的mssage切換su ceview或者更新控制項 entity類 必要的屬性 記錄位置,寬高等 dodraw cancas cancas 繪製自己 ...