我正在使用我的实时音频合成应用程序的Android版本,并且遇到了一些性能问题,这些问题在iOS方面不是问题。共享代码很困难,因为各个块分散在各个文件中,但是我会尽力而为。这是基本问题:
流代码发生在一个简单的工作线程中:
protected void StartAndroid()
{
if (PlaybackWorker == null) PlaybackWorker = new Thread(() => {
while (true)
{
_SetSampleCountToNextBeat();
AudioManager.FillAudioBuffer(GeneratorFactory, this);
}
} );
PlaybackWorker.Priority = ThreadPriority.Highest;
PlaybackWorker.Start();
}
问题:每当UI发生任何事情时,无论是通过我通过代码明确进行的调用还是通过直接用户交互而发生的,音频都将停顿/停顿/抖动/等。通常情况并不严重,但非常引人注意,而且由于音频应用基于节奏,因此会引起问题。
问题:对于长期的流音频任务,我是否以最有效的方式设置了工作线程?我知道有一个低级线程优先级,可以执行“极高/音频/紧急”任务,但是使用我正在使用的线程,我只能使用ThreadPriority.Highest的少数选项。 ..最高...虽然每次UI似乎都赢了。
让我知道是否需要更多代码。同样,在iOS方面,我没有问题...但是我也没有在使用后台工作程序来填充音频缓冲区(我使用的是iOS的AudioQueue缓冲区回调机制,所以我没有需要设置一个单独的线程...)我感觉在Android方面,我正在一场我不完全了解的线程之战(UI与Worker @ ThreadPriority.Highest)。
再加上一些代码点以达到良好的效果:
public void InitAudioSystem()
{
int minSize = AudioTrack.GetMinBufferSize((int)Globals.SampleRate, ChannelOut.Mono, Encoding.PcmFloat);
audioTrack = new AudioTrack.Builder().SetAudioAttributes(new AudioAttributes.Builder()
.SetUsage(AudioUsageKind.Media)
.SetContentType(AudioContentType.Music)
.Build())
.SetAudioFormat(new AudioFormat.Builder()
.SetEncoding(Encoding.Pcm16bit)
.SetSampleRate((int)Globals.SampleRate)
.SetChannelMask(ChannelOut.Mono)
.Build()).SetBufferSizeInBytes(minSize)
.Build();
}
public void WriteAudio()
{
if (audioTrack != null && EnabledDAC)
{
audioTrack.Write(_Buffer, 0, _Buffer.Length, WriteMode.Blocking);
if (audioTrack.PlayState != PlayState.Playing)
{
audioTrack.Play();
}
}
}
谢谢!