IOS工程:NSThread sleepForTimeInterval的使用,游戏中途中断(接电话或者点击Home按钮),重新回到游戏音频音效失效问题

news2024/11/25 23:39:19

IOS工程:NSThread sleepForTimeInterval的使用,游戏中途中断(接电话或者点击Home按钮),重新回到游戏音频音效失效问题

设备/引擎:Mac(11.7)/cocos

开发工具:Xcode

开发语言:c++/java

错误信息:AVAudioSession_iOS.mm:1271 Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

最近工程中用户反馈游戏在中途被中断再回来会出现所有音效消失的情况,体验上会不太好,一开始考虑是可能在哪里不小心设置了stopEffect的选项,查了一圈并没有,所以就打断点来测试,发现有个报错信息如下:AVAudioSession_iOS.mm:1271 Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

乍一看可以判断是音频冲突的问题,用Chatgpt查了一下,给出了检查是否在恢复音频时已经有其他音频流在运行,以及可以增加延迟来避免这种情况,如下图:
在这里插入图片描述
在这里插入图片描述

通过提示也基本有了修改的思路,之前工程中的源码是直接调用恢复音频的代码,这块的隐患在于视觉上是直接调用执行的,但在程序运行时,方法调用及执行会有所延迟,当运行恢复音频的代码时,可能程序中已经有其他的功能开始运行了,也就有可能会出现音频流冲突的问题。所以修改的方法便是去延迟调用相关的恢复音频的代码。

如下图是开始时的代码:

void AppDelegate::applicationWillEnterForeground()
{
    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
    SimpleAudioEngine::sharedEngine()->resumeAllEffects();
    CCDirector::sharedDirector()->startAnimation();
}

如下是修改后的代码,在.mm文件中进行延迟:

void AppDelegate::applicationWillEnterForeground()
{
    DeviceManager::sharedManager()->resumeAllSounds();
    CCDirector::sharedDirector()->startAnimation();
}

.mm文件修改如下:

void DeviceManager::resumeAllSounds()
{
    dispatch_queue_t resumeQueue = dispatch_queue_create("resumeSound", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(resumeQueue, ^{
        CCLog("check resume");
        [NSThread sleepForTimeInterval:0.5];
        CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
        CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeAllEffects();
    });
}

以上为新添加的一个异步执行的代码块,用来添加延迟调用的效果,并保证在程序恢复前都被执行完成。避免程序多任务间的冲突问题。NSThread sleepForTimeInterval:0.5 函数就是延迟操作的代码。

至此就将音频无响应的问题解决了。

希望能给大家带来帮助!!!有什么问题需要讨论的可以评论私信欢迎讨论~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

composer 安装gitlab私有库

开发PHP项目,免不了用composer。最近做一个项目,需要到公司内部开发的核心包,核心包放在内网搭建的gitlab仓库中,于是我用composer进行下载,报错: Cloning into bare repository C:/Users/Administrator/A…

Mac电脑系统管家CleanMyMac X4.13安装下载使用教程

当我们刚刚拿到那闪亮的新Mac时,是多么令人愉悦的一种感觉!随着时间的推移,你可能已经注意到它的速度减慢,磁盘空间逐渐减少。不用担心,CleanMyMac会为你的电脑带来焕然一新的体验。这篇文章将向你介绍CleanMyMac的奇妙…

企业oa管理系统是什么

办公自动化(Office Automation,简称OA),是将计算机、通信等现代化技术运用到传统办公方式,进而形成的一种新型办公方式。 办公自动化利用现代化设备和信息化技术,代替办公人员传统的部分手动或重复性业务活…

史上最全Python14张思维导图+字节跳动出品《Python背记手册》,高清PDF限时开放!

前言 Python是一种语法简单、功能强大的编程语言,它既适用于传统编程语言擅长的Web开发、移动开发、游戏开发、桌面应用,又适用于当前流行的人工智能、大数据、科学计算、金融分析…… 如果你想要学习一门编程语言Python肯定是一个不错的选择&#xff…

Scala之集合(2)

目录 集合基本函数: (1)获取集合长度 (2)获取集合大小 (3)循环遍历 (4)迭代器 (5)生成字符串 (6)是否包含 衍生集合…

itop-3568 开发板系统编程学习笔记(20)看门狗应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 看门狗简介看门狗编程命令(方法)开启和关闭看门狗设置超时时间获取超时时间喂狗 看门狗底层简析看门狗编程实验 看门狗简介 看门狗&#…

MiniGPT-4开源了:看图聊天、教学、创作、搭网站

深度学习系列文章 文章目录 深度学习系列文章前言MiniGPT4效果展示 前言 一个月前,OpenAI 总裁 Greg Brockman 向世人展示了 GPT-4 令人惊讶的多模态能力,如从手写文本直接生成网站和识别图像中的幽默元素等。 尽管目前 OpenAI 暂未对 GPT-4 用户开放这…

农业灌溉以电折水测控终端-开启用水计量新模式

产品概述 农业灌溉以电折水测控终端(MGTR-W)是一款拥有“最强大脑”的农业水资源计量管理终端,内置以电折水逻辑运算,主要研究耗电量与取水量之间的关系,分析水电折算系数,进而通过计算耗电量与水电折算系数…

如何在个人web项目中使用Servlet监听器?

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 服务器软件:apache-tomcat-8.5.27 目录 一. Servlet监听器是什么?二. Servlet监听器有哪些作用?2.1 监听域对象的创建和销毁2.1.1 ServletContextListener接口…

zabbix自定义监控项脚本

以下脚本具体如何使用可参考以下文章 配置zabbix自定义监控项_Apex Predator的博客-CSDN博客 1.检测url是否存活 vi /opt/zabbix_jb/check_url_status.sh #!/bin/bash acurl -s -o /dev/null -w "%{http_code}" "$1" bcurl -s -o /dev/null -w "%…

heic的照片怎么转化jpg格式,3个工具分享

heic的照片怎么转化jpg格式?当我想要把照片进行人物抠像的话那我们得需要使用专业图片软件PS。因为人物抠像是一种常见的图像处理技术,它在我们职场中有广泛的需求,它可以将人物从照片中提取出来放置到其他地方,使得照片更具专业性…

如何在 Cockpit 中管理虚拟机

Cockpit 是一个很将整个服务器置于一个集中的控制面板中,并对它们进行相当程度的控制。还可以在Cockpit中创建和管理虚拟机。 环境 Centos8 安装Cockpit 要使用 Cockpit 创建和管理虚拟机,必须在运行 Cockpit 的计算机上安装 cockpit-machines 模块&…

【传统方式部署Ruoyi微服务】

IP机器与部署组件 部署思路顺序: 1 安装mysql wget https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm rpm --import https://repo.mysql.com/RPM-GPG-K…

排序 - 快速排序(Quick Sort)

文章目录 快速排序介绍快速排序实现快速排序时间复杂度和稳定性快速排序稳定性快速排序时间复杂度 代码实现核心&总结 快速排序介绍 它的基本思想是: 选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一…

使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析

使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析 原文链接:https://blog.csdn.net/qq153471503/article/details/128528072 Demo下载:https://gitee.com/jhuangBTT/QtSideBar 1、简介 侧边栏是一个很常用…

ModStartBlog v7.2.0 暗黑模式,超级搜索,富文本升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装会…

Spring Security Ldap 登录认证流程的源码梳理

一、通过请求Controller开始登录认证 通过authenticationManager调用authenticate()方法开始登录认证,因为authenticationManager是通过Bean注入,因为SecurityLdapConfig是继承的WebSecurityConfigurerAdapter类,所以authenticationManager的…

【Unity+MySQL】实现注册登录系统(封装版)

目录 1 MySQL封装2 用户注册、登录方法封装3 Unity交互 接着 上篇文章的注册登录系统,这篇文章将MySQL相关操作封装,在Unity交互脚本中直接调用封装的方法。 1 MySQL封装 编写一个DBConnector脚本,封装MySQL中常用的操作,如连接…

【已解决】SpringBoot 工程 war包服务部署与调用测试

1.开发环境:IDEA,JDK1.8 2.服务打包类型: war包 3.war包部署环境:Linux系统,tomcat服务器,端口号:8081 4.war包部署位置:tomcat-8081/webapps/temp.war 5.服务名为:t…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供…