Cocos2d-js连续播放音频卡顿问题

最近在用Cocos2d-js在做一个小游戏,类似flappy bird那种。

演示地址: http://flyblock-d0b2f.coding.io/

代码地址:https://coding.net/u/elevenchen/p/FlyBlock/git

每次点击屏幕会播放一个音效,当连续点击好几次后,出现明显的卡帧现象。
从30帧掉到9帧。

查看Cocos2d-js的java的播放音效代码,
Cocos2dxSound.java文件中,找到doPlayEffect函数。
加入测试时间的代码:

long start = System.currentTimeMillis();
int streamID = this.mSoundPool.play(soundId, this.clamp(leftVolume, 0.0f, 1.0f), this.clamp(rightVolume, 0.0f, 1.0f), Cocos2dxSound.SOUND_PRIORITY, pLoop ? -1 : 0, soundRate);
long end = System.currentTimeMillis();
Log.d("Cocos2dxSound", "play use " + (end - start));

得出的结果是:

可以看到会出现100ms多的调用时间,这应该是造成画面卡顿的原因了。

还有我发现Android循环播放音效在我的手机小米3上是不起作用,只是播放一次。

经过测试,可以缓解调用延迟的方式有:

  1. 在update函数里面,每次播放一个静音的音频文件。

这种方式可以明显减少,但是会出现音效没有播放完被静音音效覆盖了。

  1. 起一个新的线程来调用播放函数。
class DoPlayEffectThread extends Thread {
    String mPath;
    int mSoundID;
    boolean mLoop;
    float mPitch;
    float mPan;
    float mGain;
    Cocos2dxSound mContext;

    public DoPlayEffectThread(Cocos2dxSound context, final String pPath, final int soundId, final boolean pLoop, float pitch, float pan, float gain) {
        mPath = pPath;
        mSoundID = soundId;
        mLoop = pLoop;
        mPitch = pitch;
        mPan = pan;
        mGain = gain;
        mContext = context;
    }

    @Override
    public void run() {
        Log.d("DoPlayEffectThread", "run");
        mContext.doPlayEffect(mPath, mSoundID, mLoop, mPitch, mPan, mGain);
    }

};

playEffect中调用

public int playEffect(final String pPath, final boolean pLoop, float pitch, float pan, float gain){
        Integer soundID = this.mPathSoundIDMap.get(pPath);
        int streamID = Cocos2dxSound.INVALID_STREAM_ID;

        if (soundID != null) {
            // parameters; pan = -1 for left channel, 1 for right channel, 0 for both channels

            // play sound
            //streamID = this.doPlayEffect(pPath, soundID.intValue(), pLoop, pitch, pan, gain);
            new DoPlayEffectThread(this, pPath, soundID, pLoop, pitch, pan, gain).start();
       }
}

这个方法需要牺牲pasueEffect这个功能,因为playEffect这时候不能返回一个soundID,而pauseEffect需要一个soundID作为参赛。还有一个缺点就是连续播放时有时候听起来会不是同步播放的,有延迟。

因为我游戏不用pauseEffect,所以我用第二种方式来解决画面卡顿的问题。总之画面不卡,牺牲一点音效也是没办法了。

时间: 2024-10-29 09:22:44

Cocos2d-js连续播放音频卡顿问题的相关文章

[js常用]连续播放音频

许多音频连续播放.有的时候音频过大会分成多个音频.播放的时候需要连续播放 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title>JS</title> <script src="./jquery-1.8.3.js"></script> </head> <body> <butt

js --自动播放音频

简介 基本使用 chrome下无法自动播放问题处理 简介 音频的播放使用audio进行操作,可以有两种方式处理(纯js和html标签+js). audio是html5的新标签,用于定义声音 audio的属性(引用w3school) 属性 值 描述 autoplay autoplay 如果出现该属性,则音频在就绪后马上播放. controls controls 如果出现该属性,则向用户显示控件,比如播放按钮. loop loop 如果出现该属性,则每当音频结束时重新开始播放. muted mute

cocos2dx AudioEngine在Android7上播放音效卡顿问题处理

1.此问题在cocos2dx 3.13/3.14版本(其它版本没有测试过)在Android7中使用AudioEngine的play2d函数播放音效时出现. 调试时出现如下提示: 2.论坛中相关讨论帖地址:http://forum.cocos.com/t/android7/44119 3.解决办法: 将cocos2d-x\cocos\audio\android\AudioPlayerProvider.cpp中的getSystemAPILevel() < 17都改为getSystemAPILevel

直播疑难杂症排查(2) — 播放卡顿

本文是 <直播疑难杂症排查>系列的第二篇文章,我们主要分析下如何排查播放卡顿问题. 1. 播放卡顿的表现 播放卡顿的表现总结下来包括但不限于以下这些: - 频繁出现缓冲 - 播放不够流畅,画面一卡一卡的 2. 常见播放卡顿问题排查 从代码层面来看,什么是卡顿?其实是指播放器渲染的帧率太低,比如:1s 显示 3-5 帧,或者渲染完一帧后,过很久才渲染下一帧. 因此,我们需要排查,是什么原因导致了播放器无法流畅地渲染数据,通常可能有如下几大类: - 网络带宽不足 - 播放设备性能不足 - 视频流时

netstream播放rtmp直播流卡顿

标准的flash播放器ActionScript3语句,播放flash publish的rtmp流,NetConnection--->NetStream--->play--->attachNetStream然而项目中这么做,一直处于卡顿状态.后来添加了一句 nsPlayer.bufferTime = 0.1; 居然不卡顿了.帮助文档说:The default value is 0.1 (one-tenth of a second). To determine the number of s

《直播疑难杂症排查》之二:播放卡顿

七牛直播云在 2016 年 6 月发布之后,帮助广大客户解决过形形色色的问题,如直播卡顿.马赛克.花屏.黑屏.杂音.音画不同步等等等等,这其中,有一些是网络原因,有一些是开发者的使用姿势问题,有一些是参数配置错误,当然,也有一些是 SDK 本身的问题. 总结下来,如果开发者能够对直播领域的一些基础知识有更深入的了解,掌握一些基本的排障手段,很多问题是能够很快自行解决的,甚至也能够更好地防患于未然. 因此,继<直播技术详解>系列文章之后,我们推出了这个新的系列<直播疑难杂症排查>,我

嵌入页面的VLC播放rtsp流卡顿

目前正在开发开源软件VLC嵌入到页面中播放rtsp数据流,但是发现嵌入页面的VLC(页面启动时,安装VLC的插件)播放rtsp流相比较VLC的播放器而言,会有卡顿的现象,请问有没有朋友遇到类似的问题,如果有请帮忙解答下,不甚感激.

腾讯面试题,js处理1千万条数据排序并且页面不卡顿

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

Effective前端6:避免页面卡顿

.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line span::after { content: " " } p { font-size: 15px; text-indent: 2em } #colorbox.crayon-colorbox,#cboxOverlay.crayon-colorbox,.crayon-colorbox #cboxWr