项目总结之音效播放问题

DionysosLai([email protected]) 2014/12/25

Cocos2dx使用的是一个比较简单、粗糙的语音系统,从语音系统名字SimpleAudioEngine,即可看出来这个系统本身没有多大的复杂难度,因此使用音效系统时,会有一些比较隐晦的细节,需要我们在开发时特别注意。

语音和音效的区别

         一般来说,在cocos2dx中,只用两种声音通道模式,一个backmuscic,另一个是effectmusic。前者用来播放背景音乐,后者一般用来播放音效。背景音和音效的区别在于前者比较大,后者比较小。同时背景音提供检测是否播放完毕功能,而音效没有。如果,在游戏中,需要另外检测声音播放问题,则只能自己修改引擎代码,添加一个语音通道。在我们公司开发项目中,由于游戏要时刻检测声音播放问题,因此添加了一个名为voice通道,用来专门播放人物声音。

另一方面,在预加载方面,背景音不需要预加载,只有音效才需要预加载。同时如果预加载两个背景音,前一个背景音内存会自动抛弃掉,这个问题在音效方面则没有。

音效预加载问题

         音效是肯定会加载到内存中的,及时未使用preLoadEffect接口预加载音效,在我们第一次播放音效时,同样会将该音效加载加载到内存中,然后再播放该音效。这也就是为什么有时候游戏第一次音效没有播放出来,或者第一次播放音效时,游戏明显卡顿一下。

但另一方面,预加载音效是会消耗一定时间的,不可一次性加载过多。一般是进入该场景,才将该场景音效加载进来。退出该场景时,可将音效内存释放。

同时,在加载音效时,或者没有加载音效时,在播放该音效的瞬间,游戏进入后台,十分有可能将系统挂掉,重启。这是一个必然的bug。这个问题,引起的原因,应该是在加载音效过程中,执行了pauseAllEffects。相信大家appDelegate代码均如下:

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {
    CCDirector::sharedDirector()->stopAnimation();

    // if you use SimpleAudioEngine, it must be pause
    SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
	SimpleAudioEngine::sharedEngine()->pauseVoice();
	SimpleAudioEngine::sharedEngine()->pauseAllEffects();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
    CCDirector::sharedDirector()->startAnimation();

    // if you use SimpleAudioEngine, it must resume here
    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
	SimpleAudioEngine::sharedEngine()->resumeVoice();
	SimpleAudioEngine::sharedEngine()->resumeAllEffects();
}

这个问题,基本不可避免,或者目前无力解决这个问题,只能是尽量避免。

循环音效播放问题

         有时候,有些音效需要循环播放。循环播放音效时,在PC端会引起各种各样的问题,例如不能及时关闭,游戏退到后台,又进入前台,以前暂停过的循环音效,又会重新播放,因此循环音效调试,一定要在移动端。

循环音效的播放,有时候会播放不出来,这个问题很奇怪,一般来说,如果要播放循环音效,该音效的大小,最好在40k以内。

另一方面循环音效需要记录该音效的播放ID值,在win32端,改音效ID值是根据音效路径pszFilePath计算得到因此第一次播放A音效,第二次播放A音效,前后得到的ID值是一样的。而在移动端,每次播放音效,ID值都会自增+1,同时如果不预加载音效,第一次得到的音效ID值为0,这个很重要。这点,可以参考文章:http://post.justbilt.com/2013/11/28/cocos2dx_loop_sound/
里面讲的细致到位。

播放多个音效问题

同时播放多个音效时,游戏会卡顿,及时时播放同一个音效,如果同时播放多个,会明显感觉游戏卡顿,而且音效不是一起播放的,会有明显的前后间隔。因此,避免同时播放多个音效,这也是为什么我曾在三消游戏中,不提倡使用每个物品消除都多一个音效问题,而是根据物品个数播放音效。比方消除物品数在3以下,播放A音效,消除物品数超过多少,播放B音效等。能够要求提供不同种类音效,是程序设计的一个要求。

音效资源释放问题

一般来说,游戏退出,结束整个程序,系统会将游戏内存释放掉。但是,对于声音内存,系统并不释放,需要我们主动释放,这里只需要在游戏退出时,添加一个简单的接口:CocosDenshion::SimpleAudioEngine::end();即可。很神奇吧,我也觉得。

时间: 2024-12-30 04:41:07

项目总结之音效播放问题的相关文章

(九十五)音效播放方法和工具类的制作

音效通过AVFoundation框架实现,是通过函数而不是方法,因此需要进行桥接等操作,具体步骤如下. 进行音效播放,首先要得到音效的URL(只能是本地音频),然后转换为音效ID(唯一),通过ID播放音效. [音效播放方法] ①导入框架主头文件 #import <AVFoundation/AVFoundation.h> ②通过Bundle拿到本地音效,然后调用AudioServicesCreateSystemSoundID函数得到音效ID,ID为0代表无效,以此为依据可进行懒加载 @inter

iOS开发拓展篇—音效播放

iOS开发拓展篇—音效播放 一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较长 框架:播放音频需要用到AVFoundation.framework框架 二.音效的播放 1.获得音效文件的路径 NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtens

Unity3d 背景、音效 播放 简单demo

仅实现功能,AudioListener在MainCamera中 using UnityEngine; using System.Collections; using System.Collections.Generic; public class MusicManger : MonoBehaviour { AudioSource _backMusicSource = null; AudioSource _SoundSource = null; //public string musicName

Unity3d之音效播放和调用手机震动

http://blog.csdn.net/sunshine_1984/article/details/12943979 今天研究了下Unity3d音效播放相关内容,整理下实现细节. 1,添加音效文件到Assets/Resources目录,我这里添加到Assets/Resources/audio目录了. 2,新建C# Script命名为audio 3,编写audio.cs代码如下(里面注释很清楚了): using UnityEngine;using System.Collections; publ

音效播放

#import "PlayAudioTool.h" #import <AVFoundation/AVFoundation.h> //定义一个全局的缓存池变量, 因为音效它会一直添加到内存中,当继续添加音效时, 内存储存不了,此时就会将内存底部的一个音效移除, 然后添加新的, 虽然这个能够存储音效, 但是对与内存而言,任然是饱满, 所以我们这个就定义一个缓存池, 第一是不让相同的音效重复加载到内存中区,第二是当内存发出内存警告时, 我们可以在applicationDidRec

个人搭建的React项目之React音乐播放器

该项目是本人自使用react框架以来制作的较大的项目,目前该项目放在github上,感兴趣的朋友可以去看看一下,觉得还行的话可以给个star,哈哈 地址:https://github.com/cocoxiaoyue/react-music-player 项目环境 运行 1.该项目是基于node环境,通过create-react-app搭建的react项目,所以该项目应在装有node的机器上运行. 2.该项目运用的是网易云音乐接口,所以应该下载网易云音乐接口项目https://github.com

新浪微博项目技术之一正在播放按钮点击

一.效果图: 实现功能:在"正在播放"按钮时,切换到下一个界面并继续原歌曲的播放进度 二.实现方法及步骤 1.思路: 第一步.点击按钮事件中再show到下一个界面的时候,推出到我们创建的那个单例视图(前面已将第二个界面视图创建为单例对象)中 第二步.在点击页面播放的时候,如果当前播放为第四首歌曲,show的也是第四首的话,就不需要从头播放,继续当前位置播放即可,如果是下一首的话则需要从头播放(想清楚这个逻辑判断关系) 2.步骤: 第一步实现步骤: @interface MusicLis

Html5 音效播放器

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>HTML5音乐播放器</title> </head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <b

IOS开发之音效/音频播放

音频播放: 1.音效播放 2.音乐播放 (1)音频播放 : <1>系统声音 短小的声音 使用的框架 AudioToolBox <2>1.AudioServicesPlaySystemSound 播放系统声音 2.AudioServicesPlayAlertSound播放系统声音有震动 <3>使用: 1.声明声音的ID  通过声音的id来区分是哪一个音效  无符号整形 2.创建声音的服务 (告诉系统有一个可以使用的soundID) 需要声音文件路径和声音的ID 3.播放声