com.alicizax.unity.framework/Runtime/Audio/AudioSourceObject.cs
陈思海 46194ddee8 重构音频模块 1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优 2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历 3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点 4. 支持3D环境音并具备距离衰减、遮挡等空间属性 5. 新增音频类型(BGM/SFX/Voice/Ambient) 6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
重构音频模块
1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优
2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历
3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点
4. 支持3D环境音并具备距离衰减、遮挡等空间属性
5. 新增音频类型(BGM/SFX/Voice/Ambient)
6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
2026-04-23 17:21:36 +08:00

83 lines
2.2 KiB
C#

using AlicizaX;
using AlicizaX.ObjectPool;
using UnityEngine;
namespace AlicizaX.Audio.Runtime
{
internal sealed class AudioSourceObject : ObjectBase
{
private AudioSource _source;
private AudioLowPassFilter _lowPassFilter;
public AudioSource Source => _source;
public AudioLowPassFilter LowPassFilter => _lowPassFilter;
public static AudioSourceObject Create(string name, AudioSource source, AudioLowPassFilter lowPassFilter)
{
if (source == null)
{
throw new GameFrameworkException("Audio source is invalid.");
}
AudioSourceObject audioSourceObject = MemoryPool.Acquire<AudioSourceObject>();
audioSourceObject.Initialize(name, source);
audioSourceObject._source = source;
audioSourceObject._lowPassFilter = lowPassFilter;
return audioSourceObject;
}
protected internal override void OnSpawn()
{
if (_source != null)
{
_source.gameObject.SetActive(true);
}
}
protected internal override void OnUnspawn()
{
ResetSource();
if (_source != null)
{
_source.gameObject.SetActive(false);
}
}
protected internal override void Release(bool isShutdown)
{
if (_source != null)
{
Object.Destroy(_source.gameObject);
}
}
public override void Clear()
{
base.Clear();
_source = null;
_lowPassFilter = null;
}
private void ResetSource()
{
if (_source == null)
{
return;
}
_source.Stop();
_source.clip = null;
_source.loop = false;
_source.volume = 1f;
_source.pitch = 1f;
_source.spatialBlend = 0f;
if (_lowPassFilter != null)
{
_lowPassFilter.enabled = false;
_lowPassFilter.cutoffFrequency = 22000f;
}
}
}
}