摘要:該文主要介紹了手機游戲中聲音處理的作用、特點和游戲中聲音處理的方式。根據不同的聲音類型,提出了兩種聲音處理的方式,并分別對其進行了實現和對比分析,最終得出結論(各自的適用范圍)。
關鍵詞:Java ME;線程;聲音處理
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)03-707-02
The Analysis of Audio Processing Mode in Mobile Games on Java ME Framework
MA Jie1, WANG Xian-jun2
(1.Hainnan College of Software Technology, Qionghai 571400, China)
Abstract: This article discusses the audio processing mode in mobile games by means of its function and characteristics. According to different condition, proposes two methods for audio processing and give the scope of application for each method by comparative analysis and the realization of an example.
Key words: Java ME; Thread; Audio processing
1 概述
游戲被稱為第九藝術,它可以為玩家提供絢爛多彩的感官體驗。這種體驗不僅來自于游戲豐富的劇情、華麗的場景,貼切且富有感染力的音效也起著不可替代的重要的作用。當前,手機游戲已成為新時代游戲產業發展的弄潮兒,由于手機硬件及手機軟件規模的限制,如何在手機游戲中高效、合理地處理音效,將直接關系到一款游戲的成敗。
2 游戲中聲音處理的作用
游戲中成功的聲音可以最直接的影響到玩家的情緒,有利于玩家對游戲的深層體驗。在溫馨的場景中舒緩而浪漫的背景音樂能引導玩家放松心情產生幸福感,在激烈的戰斗場景中快節奏的背景音樂更能調動玩家的參與激情;子彈發射的音效使得玩家的操作能得到直接的反映,子彈擊中各種物體發出不同的音效能使得游戲場景更真實,從而增加玩家的代入感。
游戲中成功的聲音不僅取決于音樂本身,在程序中合理的聲音處理方式也起著至關重要的作用。聲音的播放方式選擇,聲音的加載、播放、時間控制、循環控制、音量控制,由于聲音文件帶來的內存管理問題等都直接影響到游戲的體驗感和游戲性能。
3 手機游戲中聲音的特點
相比于桌面游戲,由于手機的內存小、處理器性能有限、供電持續時間短、支持的音頻格式較少,所以手機游戲對于音頻和音頻處理有較多限制。聲音文件的格式必須被目標手機支持,在不影響游戲質量前提下聲音文件要盡可能精簡。在處理聲音文件時,應合理分配內存空間,由于游戲往往是多線程的,音頻處理不恰當會導致音樂與游戲動作不一致的分離感或游戲突然停頓的不流暢感,嚴重影響游戲性能。
手機游戲中的聲音主要可以分為兩種:一種是持續的背景音樂,另一種是非持續的音效。由于聲音的不同,用來處理聲音的方式也不盡相同。
4 手機游戲聲音處理方式
4.1 在主循環中直接播放聲音
此方式是指在游戲的主循環中直接創建播放器播放聲音文件,當需要更換聲音時,需要首先清理聲音設備后才能載入新的聲音。其處理過程為:首先確定要播放的聲音素材,通過URI獲取資源,然后通過Manager創建相應格式的Player()接口的實例,接著設定播放器狀態,獲取播放信息和播放設備,便可以開始播放聲音。此時,聲音設備被獨占,如果需要跟換聲音,就必須先通過播放器實例的close()方法關閉當前播放器,接著清除播放器對象,然后再打開新的播放器。以下就是在一款空間冒險游戲中,兩段背景音樂處理的相關代碼:
public void loadMusic(){ //加載音樂并創建播放器的方法
try{
InputStream is=getClass().getResourceAsStream(\"/\"+filename); //從資源中獲取聲音
player=Manager.createPlayer(is,format); //創建播放器
}catch(IOException ex) //拋出異常
{……}
}public void play(){ //播放聲音的方法
if(player!=1){
try{
player.realize();
player.prefetch();
player.start();
}catch(MediaException ex){
System.out.println(\"can't play audio\");
System.out.println(ex.toString());
}}}
public void replay(){
//重新播放聲音。此方法是在播放完其他聲音后,再次播放此聲音時使用
close(); //關閉播放器
loadResource(); //重新加載聲音,創建播放器
play(); //播放聲音
}
public void close(){ //關閉播放器的方法
if(player!=1){
player.close();
player=1;
}}
……
兩種背景音樂切換播放的示例代碼:
Music_Control myplayer1 =new Music_Control(\"Music1.mid\",\"audio/midi\");
Music_Control myplayer2 =new Music_Control(\"Music2.mid\",\"audio/midi\");
//此處構造兩個對象
Myplayer1. loadMusic(); //裝載音樂
Myplayer1.play(); //播放聲音
……//其他操作
Myplayer1.close(); //由于場景變化,更換聲音。因為聲音設備獨占的問題,必須關閉上一個聲音,才能播放。
Myplayer2. replay(); //此處直接調用replay()方法進行另一個背景聲音的播放,這樣對于垃圾回收,資源的載入,關閉等問題,都可以直接處理。
4.2 在主循環中啟動單獨的線程播放聲音
游戲編碼的一個重要特點就是多線程,在游戲中不同的線程用來實現游戲主循環、網絡連接、數據訪問以及聲音處理等功能,線程的應用使得游戲在主循環執行的同時可以完成并行的其它工作,從而使游戲成為一個完善的整體。游戲中啟動單獨的線程播放聲音過程如下:首先創建線程類,一般通過實現Runnable接口來創建,接著生成線程的實例,在線程的run()方法里調用上文中的replay()方法來實現資源加載、聲音播放、垃圾回收等功能。在需要播放聲音時,直接啟動線程就可以實現聲音播放的功能。播放其它聲音時只需重新創建線程對象并啟動即可。
同樣是空間冒險游戲,此處處理背景音樂和子彈射擊音效,代碼如下:
public class Music_Control implements Runnable{//實現Runnable接口
……
public void run(){ //實現run方法
replay(); //只調用replay方法即可
}public void threadPlay(){ //使用線程播放
new Thread(this).start(); //啟動線程并開始播放
}}
使用線程的方式播放背景音樂和射擊音效的代碼如下:
Music_Control myplayer1=new Music_Control (\"Mymusic.mid\",\"audio/midi\");
Music_Control myplayer2=new Music_Control(\"Sound.mid\",\"audio/midi\");
Myplayer1.threadPlay();//播放背景音樂
Myplayer2.threadPlay();//啟動線程對象播放子彈射擊音效
5 兩種處理方式對比
經過對代碼實際測試可以看出:在主循環中直接播放聲音不會出現聲音的延遲現象,聲音會與游戲同步運行,但經過測試發現有時會出現游戲停頓的現象,這樣會使玩家感覺游戲不流暢,影響玩家對游戲的代入感。在主循環中啟動單獨的線程播放聲音,不會出現游戲停頓的現象,但有時會出現聲音的延遲現象,若是非背景音樂類的音效出現延遲會讓玩家感覺聲音不同步,從而影響游戲體驗。此外,使用線程播放的方式,如果不是連續的音效,可能會產生大量線程,這樣不僅會占用大量內存,而且會導致垃圾回收次數過多,使游戲運行變慢。
所以在實際使用時,要根據具體要播放的聲音類型和實際設備的情況來選擇合適的方式,才能使得聲音的播放效果更好。一般來說較為簡短的音效適合在主循環中直接播放,這種情況下游戲不會出現停頓,能流暢運行;在主循環中啟動單獨的線程播放聲音的方式則尤為適合播放較長的背景音樂,這樣,聲音在播放中不會出現延遲現象,使聲音的播放更顯自然。
6 結束語
本文主要介紹了JAVA ME手機游戲中聲音的作用、特點及進行聲音處理的過程和兩種具體的實現方式,并對這兩種方式進行了實現和對比分析。在實際開發中應該根據應用的需要來選擇采用在主循環中直接播放聲音的方式還是啟動單獨的線程播放聲音的方式,從而使得游戲性能最優化。
參考文獻:
[1] 王曉.J2ME程序開發實用案例從入門到精通[M]. 北京:清華大學出版社,2007.
[2] 考夫(美),潘穎,王磊.J2ME開發大全[M]. 北京:清華大學出版社,2004.
[3] 陳旭東,徐保民,張紅勛.J2ME應用教程[M]. 北京:清華大學出版社,北京交通大學出版社,2007.
[4] 李振鵬,龔劍.J2ME手機游戲開發技術詳解[M]. 北京:清華大學出版社,2007.
[5] [美]Michael Morrison.J2ME手機游戲編程入門[M]. 李強 譯. 北京:人民郵電出版社,2005.