Unity 音频卡顿 静帧 等待等问题的解决方案

这篇具有很好参考价值的文章主要介绍了Unity 音频卡顿 静帧 等待等问题的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

是否遇到过在Unity中加载音频文件卡顿(也就是画面卡住)的现象?特别是加载外部音频文件时。虽然时间很短,但这终归不是什么好现象,尤其是打游戏的话,影响很大。但是一些有牌面的Boss也不能不配音乐。

当然也可以通过其它方式解决,比如特定条件统一加载、切场景进度条之类的,但是程序员就要用程序的问题解决,毕竟这是一个被各个游戏和音乐播放器验证了无数遍的东西。

环境:
从本地或网络加载外部文件
Unity版本2020.3.30
Win10Unity编辑器

/// 规定几个特殊名词:
/// 等待:画面正常运行,但是正在读取音频数据,并没播放音乐,一般出现在切换加载网络音乐后(网络)             
/// 静帧:画面出现短暂静置,不刷新了,最直观的就是你放一个一直旋转的立方体,它会短暂的停止旋转,一般出现在切换加载网络音乐“等待”结束后(网络)  
/// 卡顿:不清楚是怎么回事,反正就是你切换加载音乐后立刻就会出现短暂的“静帧”,不知道是“等待”和“静帧”同时导致的,还是单纯“静帧”导致的,反正“卡顿”就是“等待”和“静帧”二合一了,一般在本地切换音乐时出现(本地)。
/// 流畅:既不会等待也不会静帧


废话不说,上方案,首先介绍下三者各自的优缺点:

1.Unity传统加载方式:
/// 能播放mp3 wav ogg 格式
/// 本地:切换加载mp3和ogg音乐会明显“卡顿”;切换加载wav音乐微不可查“卡顿”,哪怕是80兆的大文件,这会让人误以为是“流畅”,不过勉强算作“流畅”也没问题(不知道是我眼花了还是真的会有微不可察的卡顿)
/// 网络:切换加载所有音乐文件都需要明显长时间的“等待”(自己服务器,网不好),直到所有数据下载完才会播放;但是mp3和ogg音乐播放前会明显“静帧”,wav则是“流畅”
/// 无论读取本地音乐还是网络音乐,都是全部加载到内存再播放


2.伪-流音频加载:
/// 能播放mp3 wav ogg 格式
/// 本地:切换加载所有音乐文件都很“流畅”,哪怕是80兆的大文件
/// 网络:切换加载所有音乐文件都需要明显长时间的“等待”(自己服务器,网不好),直到所有数据下载完才会播放;所有文件都能“流畅”播放,没有“静帧”
/// 无论读取本地音乐还是网络音乐,都是全部加载到内存再播放

3.真-流音频加载:
/// 只能播放wav ogg 格式
/// 本地:切换加载所有音乐文件都很“流畅”,哪怕是80兆的大文件,边读取数据边播放
/// 
/// 网络:切换加载所有音乐文件都需要明显“等待”,这是在等待缓冲量下载,不过等待时间很短暂。(你的网和服务器的网足够快,缓冲量很小,等待就不会明显)。
/// 网络:缓冲量下载足够后,会一直“流畅”播放音频,边下载数据边播放(如果你网络实在差的要命,那当然还是会卡,具体怎么卡我没试,也没处理)
/// 
/// 无论读取本地音乐还是网络音乐,都是边下载数据边播放。如果采用全部下载再播放的传统模式播放网络音乐,那播放一个音乐就得“卡顿”或“等待”很长时间,很不好。采用了流音频,只需要“等待”零点几秒就能“流畅”播曲,也没有画面“静帧”。

下面按顺序分别是三种音频播放器代码:
(用于测试的本地和网络音频文件大家自己搞定吧,记得测试运行前把文件弄好,给公开变量重新赋值哦)
(如果本文对你有帮助,记得点赞订阅收藏评论哦,谢谢)


传统音频播放器:文章来源地址https://www.toymoban.com/news/detail-675512.html

using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

/// <summary>
/// 注释必看!!!!!!!!!!!!!!!!
/// 
/// 
/// 规定几个特殊名词:
/// 等待:画面正常运行,但是正在读取音频数据,并没播放音乐,一般出现在切换加载网络音乐后(网络)             
/// 静帧:画面出现短暂静置,不刷新了,最直观的就是你放一个一直旋转的立方体,它会短暂的停止旋转,一般出现在切换加载网络音乐“等待”结束后(网络)  
/// 卡顿:不清楚是怎么回事,反正就是你切换加载音乐后立刻就会出现短暂的“静帧”,不知道是“等待”和“静帧”同时导致的,还是单纯“静帧”导致的,反正“卡顿”就是“等待”和“静帧”二合一了,一般在本地切换音乐时出现(本地)。
/// 流畅:既不会等待也不会静帧
/// 
/// 
/// [传统音频播放器]
/// 从本地或网络加载外部文件
/// Unity版本2020.3.30
/// Win10Unity编辑器
/// 能播放mp3 wav ogg 格式
/// 本地:切换加载mp3和ogg音乐会明显“卡顿”;切换加载wav音乐微不可查“卡顿”,哪怕是80兆的大文件,这会让人误以为是“流畅”,不过勉强算作“流畅”也没问题(不知道是我眼花了还是真的会有微不可察的卡顿)
/// 网络:切换加载所有音乐文件都需要明显 长时间的“等待”(自己服务器,网不好),直到所有数据下载完才会播放;但是mp3和ogg音乐播放前会明显“静帧”,wav则是“流畅”
/// 无论读取本地音乐还是网络音乐,都是全部加载到内存再播放
/// 
/// 以上所说的问题,只针对中大型文件,如果你的文件特别小,那恐怕是察觉不到的
/// 
///  最讨人嫌的其实就是“静帧”,这本质上是一帧内处理了太多东西导致主线程卡死,你能想象玩游戏时一播放音效和背景音乐就卡一下嘛,“等待”其实反而无所谓,因为它从画面上是没有体现的。
///  
/// 具体细节请自行测试,光靠文字描述恐怕还是不能理解各种状况
/// </summary>
public class TraditionalAudioPlayer : MonoBehaviour
{


    /// <summary>
    /// 网络请求
    /// </summary>
    UnityWebRequest audioWebRequest = null;

    /// <summary>
    /// 音乐播放组件
    /// </summary>
    AudioSource audioPlayer;

    /// <summary>
    /// 当前音乐片段
    /// </summary>
    AudioClip currentAudioClip;

    /// <summary>
    /// 音乐文件名数组
    /// </summary>
    public List<string> audioUrls;

    /// <summary>
    /// 当前音频路径
    /// </summary>
    public string url;

    /// <summary>
    /// 当前音频索引
    /// </summary>
    public int audioIndex;

    /// <summary>
    /// 是否正在加载数据
    /// </summary>
    public bool isLoad = false;


    /// <summary>
    /// 是否人为中止
    /// </summary>
    public bool cancel = false;


    private void Awake()
    {
        audioPlayer = GetComponent<AudioSource>();
    }


    private void Start()
    {
        //一秒后自动播放音乐
        Invoke("Init", 1.0f);
    }



    void Init()
    {
        if (audioIndex < 0)
        {
            audioIndex = 0;
        }
        PlayMusic(audioUrls[audioIndex]);
    }


    private async void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            if (audioIndex ==0)
            {
                print("已经是第一首");
            }
            else
            {
                print("播放上一首");
                audioIndex -= 1;
                //异步函数等待,等待停止过程完成,一般只有几毫秒,不会因此造成卡顿,但又不能不等,毕竟彻底停止还是需要点时间的
                await StopMusic();
                PlayMusic(audioUrls[audioIndex]);
            }         
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            if (audioIndex == audioUrls.Count-1)
            {
                print("已经是最后一首");
            }
            else
            {
                print("播放下一首");
                audioIndex += 1;
                //异步函数等待,等待停止过程完成,一般只有几毫秒,不会因此造成卡顿,但又不能不等,毕竟彻底停止还是需要点时间的
                await StopMusic();
                PlayMusic(audioUrls[audioIndex]);
            }          
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
            if (audioPlayer != null && audioPlayer.clip != null)
            {
                if (audioPlayer.isPlaying)
                {
                    print("音乐暂停");
                    audioPlayer.Pause();
                }
                else
                {
                    print("音乐恢复播放");
                    audioPlayer.Play();
                }
            }
        }
    }


    /// <summary>
    /// 播放音乐
    /// </summary>
    public void PlayMusic(

到了这里,关于Unity 音频卡顿 静帧 等待等问题的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

    今天调试和服务器连接,发现始终获取不到服务器的数据, 电脑和服务器都在同一局域网,仍然获取不到, 下面是电脑环境配置, 第一步: 设置网络为专用网络,然后点击配置防火墙和安全设置,关闭防火墙 (点击所连接的wifi的属性) 第二步:设置出站 入站规则 点击高

    2024年02月07日
    浏览(60)
  • Kafka错误解决:kafka.zookeeper.ZooKeeperClientTimeoutException:连接超时等待解决方案

    在使用Kafka时,有时候会遇到\\\"kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection\\\"这样的错误。本文将介绍如何解决这个问题,并提供相应的源代码示例。 Kafka是一个分布式流处理平台,它使用ZooKeeper来管理集群的元数据和协调器。当连接到ZooKeeper服务器超时时,就

    2024年02月06日
    浏览(45)
  • 【Windows优化篇】Windows11系统卡顿、AMD电脑卡顿、任务栏消失解决方案

    Windows11太多bug,与A卡兼容一般。断开电源,强制关机,再开机!!!—【蘇小沐】 1.实验环境 系统 版本 Windows 11 专业工作站版 22H2(22621.900); 卡顿、应用程序打不开、蓝屏等问题。 解决方法:拔掉电源适配器(电脑充电器!!!),强制关机再开机!!! 拔掉笔记本电

    2024年02月01日
    浏览(38)
  • Unity 之 安卓平台上架隐私问题解决方案

    场景 1: APP 未见向用户明示个人信息收集使用的目的、方式和范围,未经用户同意,存在收集 Android ID、SIM 卡信息的行为。(存在风险) 场景 2: APP 未见向用户明示 SDK 收集使用个人信息的目的、方式和范围,未经用户同意,SDK 存在收集 com.unity3d.player 获 取 SIM 卡信息、c

    2024年02月16日
    浏览(35)
  • Unity 之 超级详细的隐私问题解决方案

    场景 1: APP 未见向用户明示个人信息收集使用的目的、方式和范围,未经用户同意,存在收集 Android ID、SIM 卡信息的行为。(存在风险) 场景 2: APP 未见向用户明示 SDK 收集使用个人信息的目的、方式和范围,未经用户同意,SDK 存在收集 com.unity3d.player 获 取 SIM 卡信息、c

    2024年02月12日
    浏览(39)
  • iOS UI掉帧和卡顿优化解决方案记录

    UI卡顿原理 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到

    2024年01月22日
    浏览(47)
  • unity使用videoplayer组件播放视频黑屏问题解决方案

    1、视频使用动态加载方式 2、资源需要放到resource文件夹下,不能被打成ab 3、资源打包的时候不能被压缩,在android打包文件设置成不压缩   build.gradle文件: 可能出现的问题: 导出的Android版本播放视频只用声音没有画面,初始化VideoPlayer组件时,Android平台的报错提示是:E/

    2024年02月13日
    浏览(90)
  • 【Unity】Animator Controller中动画消失 显示问题分析及解决方案

    Unity中的Animator Controller界面突然显示空白,编辑好的动画可以正常播放,但Animator ControllerAnimator Controller界面就是不显示。重启后就再次出现,启动项目后就又消失 可能是Unity缓存问题,重新生成Unity中缓存文件即可。 关闭Unity编辑器 打开项目所在位置的 Library 文件夹 将该文

    2024年02月11日
    浏览(63)
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案

    最近,我在使用CSDN插件浏览 MOOC 网站时,遇到了一些网络故障。具体表现为: 点击CSDN插件首页的 MOOC(中国大学慕课)图标时,网页加载缓慢且资源加载不完全,导致 网页显示不全或无法正常使用 。 在已登录并保存了Cookie的情况下,个人课程页面一直处于白屏加载状态,

    2024年02月04日
    浏览(53)
  • 终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移

    找到如图设置,修改网络首选项顺序 1、在系统设置里新建一个管理员用户 2、在访达-前往-电脑-磁盘-找到新建用户的那个文件夹,拖至桌面 新用户点击左上角访达设置,在侧边栏显示出硬盘消息

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包