Unity音乐内存优化

embedded/2025/3/21 2:20:48/

文章目录

  • 音乐
    • 下载远程音乐

音乐

音乐文件如果只从工程目录里面读取,那有很多种方法可以优化,比如设置Load Type直接采用流式加载方式,内存直接降最小(但是记住,每种优化都是有对应的代价的,优化是一种平衡的艺术)。但是如果我是从url加载进来的音乐呢 是不是就无能为力了

下载远程音乐

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using UnityEngine;
using UnityEngine.Networking;public class MusicTest : MonoBehaviour
{public AudioSource audioSource;public string audioUrl = "http://music.163.com/song/media/outer/url?id=447925558.mp3";private void Start(){GetAudio(audioUrl, (result, clip, tips) =>{audioSource.clip = clip;audioSource.loop = true;audioSource.Play();});}public bool GetAudio(string url, Action<bool, AudioClip, string> callback){if (string.IsNullOrEmpty(url)){callback?.Invoke(false, null, "URL is empty");return false;}if (!Uri.IsWellFormedUriString(url, UriKind.Absolute)){callback?.Invoke(false, null, "Invalid URL format");return false;}StartCoroutine(DownloadAudioCoroutine(url, callback));return true;}private IEnumerator DownloadAudioCoroutine(string url, Action<bool, AudioClip, string> callback){using (var request = UnityWebRequestMultimedia.GetAudioClip(url, DetectAudioType(url))){request.disposeDownloadHandlerOnDispose = true;request.timeout = 30;var operation = request.SendWebRequest();while (!operation.isDone){// float progress = request.downloadProgress;yield return null;}if (request.result == UnityWebRequest.Result.Success){AudioClip clip = DownloadHandlerAudioClip.GetContent(request);if (clip != null){clip.name = Path.GetFileNameWithoutExtension(url);callback?.Invoke(true, clip, null);}else{callback?.Invoke(false, null, "Audio decoding failed");}}else{string errorMsg = $"Download failed: {request.error} (HTTP {request.responseCode})";Debug.LogError(errorMsg);callback?.Invoke(false, null, errorMsg);}}}private AudioType DetectAudioType(string url){string ext = Path.GetExtension(url).ToLower();return ext switch{".mp3" => AudioType.MPEG,".wav" => AudioType.WAV,".ogg" => AudioType.OGGVORBIS,".aiff" => AudioType.AIFF,_ => AudioType.UNKNOWN};}
}

这是一份很正常的代码,使用UnityWebRequest下载一首音乐资源,随便从开源的歌曲直链里面就能拿到,比如我代码上的这首资源,时长3分50,大小3.5MB,然后我加载进来,用Memory Profile跑一下,内存
这么大,手算大小44100 × 2 × 2 × 230 ≈ 40,548,000 字节 ≈ 38.7MB,还真差不多。完了,动态加载进来的,clip不能在后面设置压缩比和加载方式。
我当初在找资料的时候,一大片都没说明优化方案,大多都在强调如何从工程中导入的时候做优化,其实就加一行代码就能解决内存爆表的问题,

request.downloadHandler = new DownloadHandlerAudioClip(url,AudioType.MPEG){ streamAudio = true };

streamAudio这个参数还是我翻源码翻出来的。比较可惜的是,现在问一些稍微深入的一点AI,它们给出的回答里面,也会提到这个优化点,可惜了。


http://www.ppmy.cn/embedded/174308.html

相关文章

【八股文】ArrayList和LinkedList的区别

先讲讲两者是如何实现的 ArrayList public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData; private int size; } 通过源码可以看出&#xff0c;ArrayLis…

Android Audio基础(18)——最小缓冲区

在创建 AudioTrack 时有一个缓冲区大小的参数&#xff0c;最小缓冲区参数通过 AudioTrack.getMinBufferSize() 获取。 一、最小缓冲区 为了让音频数据通路能正常运转&#xff0c;共享FIFO必须达到最小缓冲区的大小。如果数据缓冲区分配得过小&#xff0c;那么播放声音会频繁遭…

uni-app——计时器和界面交互API

API 基本概要 概念说明 API&#xff08;应用程序接口&#xff09;是预先定义的方法集合&#xff0c;用于实现特定功能。在 uni-app 中&#xff0c;通过全局对象 uni 调用 API&#xff0c;例如 uni.getSystemInfoSync 获取设备信息。 API 分类与调用规则 事件监听型 以 on 开…

标准 Git Commit 模板格式指南

✅ 标准 Git Commit 模板格式指南 格式模板 <type>(<scope>): <subject><body> ← 可选&#xff0c;详细说明做了什么&#xff0c;为啥这么做&#x1f4cc; 常见的 <type> 类型说明 类型说明feat新增功能&#xff08;feature&#xff09;fix…

软考程序员考试知识点汇总

软考程序员考试&#xff08;初级资格&#xff09;主要考察计算机基础理论、编程能力及软件开发相关知识。以下是核心知识点总结及备考建议&#xff1a; 一、计算机基础 数制与编码 二进制、八进制、十进制、十六进制转换原码、反码、补码表示&#xff08;整数与浮点数&#xf…

设计模式(行为型)-备忘录模式

目录 定义 类图 角色 角色详解 &#xff08;一&#xff09;发起人角色&#xff08;Originator&#xff09;​ &#xff08;二&#xff09;备忘录角色&#xff08;Memento&#xff09;​ &#xff08;三&#xff09;备忘录管理员角色&#xff08;Caretaker&#xff09;​…

c++图论(四)之有向无环图特的拓扑排序

在 C 中实现有向无环图&#xff08;DAG&#xff0c;Directed Acyclic Graph&#xff09;的拓扑排序&#xff0c;可以通过两种经典方法&#xff1a;BFS遍历法和 DFS 后序遍历。以下是两种方法的实现原理、代码示例及详细说明&#xff1a; 一、拓扑排序的概念 拓扑排序&#xff…

软件测试之测试覆盖率

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们将讨论测试覆盖率的相关问题&#xff0c;以及它如何帮助提高软件质量的。 测试覆盖率概述 测试覆盖率被定义为一种测试技术指标&#xff0c;它表明我们的…