mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
修正音频模块回收池
修正音频模块回收池
This commit is contained in:
@@ -4,6 +4,50 @@ using YooAsset;
|
|||||||
|
|
||||||
namespace TEngine
|
namespace TEngine
|
||||||
{
|
{
|
||||||
|
public class AudioData : MemoryObject
|
||||||
|
{
|
||||||
|
public AssetOperationHandle AssetOperationHandle { private set; get; }
|
||||||
|
|
||||||
|
public bool InPool { private set; get; } = false;
|
||||||
|
|
||||||
|
public override void InitFromPool()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RecycleToPool()
|
||||||
|
{
|
||||||
|
if (!InPool)
|
||||||
|
{
|
||||||
|
AssetOperationHandle.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
InPool = false;
|
||||||
|
AssetOperationHandle = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static AudioData Alloc(AssetOperationHandle assetOperationHandle, bool inPool)
|
||||||
|
{
|
||||||
|
AudioData ret = MemoryPool.Acquire<AudioData>();
|
||||||
|
ret.AssetOperationHandle = assetOperationHandle;
|
||||||
|
ret.InPool = inPool;
|
||||||
|
if (!ret.InPool)
|
||||||
|
{
|
||||||
|
Log.Error("Is not In Pool");
|
||||||
|
}
|
||||||
|
ret.InitFromPool();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void DeAlloc(AudioData audioData)
|
||||||
|
{
|
||||||
|
if (audioData != null)
|
||||||
|
{
|
||||||
|
MemoryPool.Release(audioData);
|
||||||
|
audioData.RecycleToPool();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 音频代理辅助器。
|
/// 音频代理辅助器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -11,7 +55,7 @@ namespace TEngine
|
|||||||
{
|
{
|
||||||
private int _instanceId;
|
private int _instanceId;
|
||||||
private AudioSource _source;
|
private AudioSource _source;
|
||||||
private AssetOperationHandle _assetOperationHandle;
|
private AudioData _audioData;
|
||||||
private AudioModuleImp _audioModuleImp;
|
private AudioModuleImp _audioModuleImp;
|
||||||
private Transform _transform;
|
private Transform _transform;
|
||||||
float _volume = 1.0f;
|
float _volume = 1.0f;
|
||||||
@@ -32,6 +76,7 @@ namespace TEngine
|
|||||||
{
|
{
|
||||||
public string Path;
|
public string Path;
|
||||||
public bool BAsync;
|
public bool BAsync;
|
||||||
|
public bool BInPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -47,7 +92,7 @@ namespace TEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源操作句柄。
|
/// 资源操作句柄。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public AssetOperationHandle AssetOperationHandle => _assetOperationHandle;
|
public AudioData AudioData => _audioData;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 音频代理辅助器音频大小。
|
/// 音频代理辅助器音频大小。
|
||||||
@@ -196,7 +241,8 @@ namespace TEngine
|
|||||||
_source = host.AddComponent<AudioSource>();
|
_source = host.AddComponent<AudioSource>();
|
||||||
_source.playOnAwake = false;
|
_source.playOnAwake = false;
|
||||||
AudioMixerGroup[] audioMixerGroups =
|
AudioMixerGroup[] audioMixerGroups =
|
||||||
audioCategory.AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", audioCategory.AudioMixerGroup.name, $"{audioCategory.AudioMixerGroup.name} - {index}"));
|
audioCategory.AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", audioCategory.AudioMixerGroup.name,
|
||||||
|
$"{audioCategory.AudioMixerGroup.name} - {index}"));
|
||||||
_source.outputAudioMixerGroup = audioMixerGroups.Length > 0 ? audioMixerGroups[0] : audioCategory.AudioMixerGroup;
|
_source.outputAudioMixerGroup = audioMixerGroups.Length > 0 ? audioMixerGroups[0] : audioCategory.AudioMixerGroup;
|
||||||
_source.rolloffMode = audioCategory.AudioGroupConfig.audioRolloffMode;
|
_source.rolloffMode = audioCategory.AudioGroupConfig.audioRolloffMode;
|
||||||
_source.minDistance = audioCategory.AudioGroupConfig.minDistance;
|
_source.minDistance = audioCategory.AudioGroupConfig.minDistance;
|
||||||
@@ -218,7 +264,7 @@ namespace TEngine
|
|||||||
_duration = 0;
|
_duration = 0;
|
||||||
if (!string.IsNullOrEmpty(path))
|
if (!string.IsNullOrEmpty(path))
|
||||||
{
|
{
|
||||||
if (_audioModuleImp.AudioClipPool.TryGetValue(path, out var operationHandle))
|
if (bInPool && _audioModuleImp.AudioClipPool.TryGetValue(path, out var operationHandle))
|
||||||
{
|
{
|
||||||
OnAssetLoadComplete(operationHandle);
|
OnAssetLoadComplete(operationHandle);
|
||||||
return;
|
return;
|
||||||
@@ -239,7 +285,7 @@ namespace TEngine
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_pendingLoad = new LoadRequest { Path = path, BAsync = bAsync };
|
_pendingLoad = new LoadRequest { Path = path, BAsync = bAsync, BInPool = bInPool};
|
||||||
|
|
||||||
if (_audioAgentRuntimeState == AudioAgentRuntimeState.Playing)
|
if (_audioAgentRuntimeState == AudioAgentRuntimeState.Playing)
|
||||||
{
|
{
|
||||||
@@ -277,16 +323,15 @@ namespace TEngine
|
|||||||
{
|
{
|
||||||
if (handle != null)
|
if (handle != null)
|
||||||
{
|
{
|
||||||
handle.Completed -= OnAssetLoadComplete;
|
|
||||||
if (_inPool)
|
if (_inPool)
|
||||||
{
|
{
|
||||||
_audioModuleImp.AudioClipPool.TryAdd(handle.GetAssetInfo().AssetPath, handle);
|
_audioModuleImp.AudioClipPool.TryAdd(handle.GetAssetInfo().Address, handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_pendingLoad != null)
|
if (_pendingLoad != null)
|
||||||
{
|
{
|
||||||
if (handle != null)
|
if (!_inPool && handle != null)
|
||||||
{
|
{
|
||||||
handle.Dispose();
|
handle.Dispose();
|
||||||
}
|
}
|
||||||
@@ -294,19 +339,21 @@ namespace TEngine
|
|||||||
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
|
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
|
||||||
string path = _pendingLoad.Path;
|
string path = _pendingLoad.Path;
|
||||||
bool bAsync = _pendingLoad.BAsync;
|
bool bAsync = _pendingLoad.BAsync;
|
||||||
|
bool bInPool = _pendingLoad.BInPool;
|
||||||
_pendingLoad = null;
|
_pendingLoad = null;
|
||||||
Load(path, bAsync);
|
Load(path, bAsync, bInPool);
|
||||||
}
|
}
|
||||||
else if (handle != null)
|
else if (handle != null)
|
||||||
{
|
{
|
||||||
if (_assetOperationHandle != null)
|
if (_audioData != null)
|
||||||
{
|
{
|
||||||
_assetOperationHandle.Dispose();
|
AudioData.DeAlloc(_audioData);
|
||||||
|
_audioData = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_assetOperationHandle = handle;
|
_audioData = AudioData.Alloc(handle, _inPool);
|
||||||
|
|
||||||
_source.clip = _assetOperationHandle.AssetObject as AudioClip;
|
_source.clip = handle.AssetObject as AudioClip;
|
||||||
if (_source.clip != null)
|
if (_source.clip != null)
|
||||||
{
|
{
|
||||||
_source.Play();
|
_source.Play();
|
||||||
@@ -350,8 +397,9 @@ namespace TEngine
|
|||||||
{
|
{
|
||||||
string path = _pendingLoad.Path;
|
string path = _pendingLoad.Path;
|
||||||
bool bAsync = _pendingLoad.BAsync;
|
bool bAsync = _pendingLoad.BAsync;
|
||||||
|
bool bInPool = _pendingLoad.BInPool;
|
||||||
_pendingLoad = null;
|
_pendingLoad = null;
|
||||||
Load(path, bAsync);
|
Load(path, bAsync, bInPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
_source.volume = _volume;
|
_source.volume = _volume;
|
||||||
@@ -371,9 +419,9 @@ namespace TEngine
|
|||||||
Object.Destroy(_transform.gameObject);
|
Object.Destroy(_transform.gameObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_assetOperationHandle != null)
|
if (_audioData != null)
|
||||||
{
|
{
|
||||||
_assetOperationHandle.Dispose();
|
AudioData.DeAlloc(_audioData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -127,7 +127,7 @@ namespace TEngine
|
|||||||
|
|
||||||
for (int i = 0; i < AudioAgents.Count; i++)
|
for (int i = 0; i < AudioAgents.Count; i++)
|
||||||
{
|
{
|
||||||
if (AudioAgents[i].AssetOperationHandle == null || AudioAgents[i].IsFree)
|
if (AudioAgents[i].AudioData?.AssetOperationHandle == null || AudioAgents[i].IsFree)
|
||||||
{
|
{
|
||||||
freeChannel = i;
|
freeChannel = i;
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user