是否遇到过在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(
文章来源:https://www.toymoban.com/news/detail-675512.html
到了这里,关于Unity 音频卡顿 静帧 等待等问题的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!