Нашёл причину утечки памяти
This commit is contained in:
1 parent
60c28f54f2
commit
320847af5b
229 files changed
+3094
-18282
No files matched your search
@@ -88,10 +88,24 @@ namespace Code.Infrastructure.Audio
|
||||
_pool.ReleaseSource(audioSource);
|
||||
}
|
||||
|
||||
private Dictionary<KeyValuePair<AudioNames, int>, CancellationTokenSource> _cancellationTokenSources = new();
|
||||
|
||||
public void CancelMusic(AudioNames groupName, int id) => _cancellationTokenSources[new KeyValuePair<AudioNames, int>(groupName, id)].Cancel();
|
||||
public void ReleaseCancellationSource(AudioNames groupName, int id) => _cancellationTokenSources[new KeyValuePair<AudioNames, int>(groupName, id)] = null;
|
||||
private Dictionary<AudioNameIdPair, CancellationTokenSource> _cancellationTokenSources = new();
|
||||
|
||||
public void CancelMusic(AudioNames groupName, int id)
|
||||
{
|
||||
var key = new AudioNameIdPair(groupName, id);
|
||||
|
||||
if (!_cancellationTokenSources.ContainsKey(key)) return;
|
||||
|
||||
_cancellationTokenSources[key].Cancel();
|
||||
_cancellationTokenSources.Remove(key);
|
||||
}
|
||||
|
||||
public void ReleaseCancellationSource(AudioNames groupName, int id)
|
||||
{
|
||||
// _cancellationTokenSources[new KeyValuePair<AudioNames, int>(groupName, id)] = null; никаких полумер
|
||||
_cancellationTokenSources.Remove(new AudioNameIdPair(groupName, id));
|
||||
}
|
||||
|
||||
public async UniTaskVoid PlayRepeatedly(AudioNames groupName, int id, AudioGroupType audioGroupType,
|
||||
AudioSourceType sourceType = AudioSourceType.NoBlend, AudioSource audioSource = null, CancellationTokenSource cancellationTokenSource = null)
|
||||
{
|
||||
@@ -100,7 +114,7 @@ namespace Code.Infrastructure.Audio
|
||||
if(cancellationTokenSource == null)
|
||||
{
|
||||
cancellationTokenSource = new CancellationTokenSource();
|
||||
_cancellationTokenSources[new KeyValuePair<AudioNames, int>(groupName, id)] = cancellationTokenSource;
|
||||
_cancellationTokenSources[new AudioNameIdPair(groupName, id)] = cancellationTokenSource;
|
||||
}
|
||||
|
||||
if (!audioSource) audioSource = _pool.GetSource(sourceType);
|
||||
@@ -108,11 +122,10 @@ namespace Code.Infrastructure.Audio
|
||||
audioSource.outputAudioMixerGroup = _audioMixerGroups[audioGroupType];
|
||||
audioSource.Play();
|
||||
|
||||
await UniTask.NextFrame();
|
||||
// await UniTask.WaitUntil(audioSource, _ => audioSource.isPlaying);
|
||||
var (isCanceled, _) = await UniTask.WaitUntilValueChanged(audioSource,
|
||||
_ => !audioSource.isPlaying,
|
||||
cancellationToken: cancellationTokenSource.Token).SuppressCancellationThrow();
|
||||
UnityEngine.Debug.LogError("Music skipping");
|
||||
|
||||
if (isCanceled)
|
||||
{
|
||||
@@ -129,6 +142,7 @@ namespace Code.Infrastructure.Audio
|
||||
}
|
||||
|
||||
public AudioClip GetClip(AudioNames groupName, int id) => _audioClips[groupName][id];
|
||||
|
||||
public bool CheckClip(AudioNames groupName, int id) => _audioClips[groupName].ContainsKey(id);
|
||||
|
||||
public void AudioClipsLoaded(AudioNames groupname, Dictionary<int, AudioClip> clips)
|
||||
@@ -150,10 +164,37 @@ namespace Code.Infrastructure.Audio
|
||||
_mixer.SetFloat(effectName, newValue);
|
||||
}).OnComplete(callback);
|
||||
}
|
||||
|
||||
public void ChangeGroupVolume(AudioGroupType groupType, float value, float time, Action callback = null)
|
||||
{
|
||||
ApplyParameter(_audioMixerGroups[groupType].name, Mathf.Log10(value == 0f ? 0.001f : value) * 20, time, callback);
|
||||
}
|
||||
|
||||
private struct AudioNameIdPair : IEquatable<AudioNameIdPair>
|
||||
{
|
||||
public AudioNames AudioNames;
|
||||
public int ID;
|
||||
|
||||
public AudioNameIdPair(AudioNames audioNames, int id)
|
||||
{
|
||||
AudioNames = audioNames;
|
||||
ID = id;
|
||||
}
|
||||
public bool Equals(AudioNameIdPair other)
|
||||
{
|
||||
return AudioNames == other.AudioNames && ID == other.ID;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return obj is AudioNameIdPair other && Equals(other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return HashCode.Combine((int)AudioNames, ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface IReadyToPlayHandle : IGlobalSubscriber
|
||||
|
||||
Reference in new issue
Block a user