首先需要一些背景信息
我有一个Xamarin应用程序,基本上从远程服务器流式传输视频。我有一个后台线程像这样循环(伪代码):
private void UpdateMethod()
{
while (running)
{
bool success = WaitForUpdate();
if (!success)
{
break;
}
Update update = GetUpdate();
SendUpdateToConcurentQueue(update);
}
Disconnect();
}
我这样启动后台线程:
Thread thread = new Thread(UpdateMethod);
thread.IsBackground = true;
thread.Start();
问题
当我开始流播放时,一切都很完美。只有在与设备无交互约10秒钟后,它变得非常缓慢。我输出了后台线程的更新数量,它们似乎要慢得多。我通常每个更新处理2-6次更新(60fps)。当速度非常慢时,我每6个更新周期才会得到1次更新。
有一件让我困惑的事情:当我下拉iOS顶部栏菜单时,更新率就会上升,流播放突然回到正常速度。更新速率会提高约10秒钟,然后又会像疯子一样滞后。
我的尝试
我尝试启动一个仅执行此操作的Dispatch队列,如下所示:
DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);
这似乎完全没有帮助。
我还尝试像这样更改我的更新线程中的QualityOfService属性:
NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated
也不行!我觉得iOS出于某种原因降低了我的线程优先级。如果我在UpdateMethod
方法中设置断点,当应用程序不会出现延迟时,它会被命中。但当出现延迟时,断点不会被命中。现在这真的让我感到困惑,因为代码仍在运行!我仍然收到更新,只是速度慢了很多...
编辑:我使用Instruments进行了测试,并发现网络正在受到限制...正在进行调查,但如果有人知道iOS上任何类型的网络限制,请让我知道。