Java ME手机游戏中的声音处理方式分析

时间:2022-10-27 06:39:19

Java ME手机游戏中的声音处理方式分析

摘要:该文主要介绍了手机游戏中声音处理的作用、特点和游戏中声音处理的方式。根据不同的声音类型,提出了两种声音处理的方式,并分别对其进行了实现和对比分析,最终得出结论(各自的适用范围)。

关键词: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!=null){

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!=null){

player.close();

player=null;

}}

……

两种背景音乐切换播放的示例代码:

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.

上一篇:数字化校园下高职教学与科研工作一体化模式研... 下一篇:互联网用户行为控制系统功能设计及应用