当UI处于空闲状态时,iOS后台线程会变慢

Phi*_*aré 10 c# multithreading xamarin.ios ios xamarin

首先是一些背景

我有一个Xamarin应用程序,基本上从远程服务器流式传输视频.我有一个像这样循环的后台线程(伪代码):

private void UpdateMethod()
{
    while (running)
    {
        bool success = WaitForUpdate();

        if (!success)
        {
            break;
        }

        Update update = GetUpdate();
        SendUpdateToConcurentQueue(update);
    }

    Disconnect();
}
Run Code Online (Sandbox Code Playgroud)

我像这样启动后台线程:

Thread thread = new Thread(UpdateMethod);
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)

问题

当我开始流时,一切都很完美.只有在不与设备交互约10秒后,它变得非常慢.我已经从后台线程中输出了更新的数量,而且它们看起来要慢得多.我通常每次更新处理2-6次更新(60fps).当它超级慢时,我得到1个6更新周期.

令我困惑的一件事是:当我下拉iOS顶部栏菜单时,更新会恢复,流会突然恢复正常速度.更新速度上升了大约10秒,它又像疯了一样回落.

我试过的

我尝试启动一个只有它的Dispatch队列,如下所示:

DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);
Run Code Online (Sandbox Code Playgroud)

它似乎没有任何帮助.

我还试图在我的更新线程中更改QualityOfService属性,如下所示:

NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated
Run Code Online (Sandbox Code Playgroud)

也不起作用!在我看来iOS由于某种原因降低了我的线程的优先级.如果我在我的UpdateMethod方法中放置一个断点,那么当应用程序没有滞后时它会被击中.但是当出现滞后时,断点就不会受到打击.现在这真让我困惑,因为代码仍在运行!我仍然收到更新,它只是慢一点......

编辑:我使用Instruments测试,发现网络受到限制......调查,但如果有人知道iOS上任何类型的网络限制,请告诉我.

Sus*_*ver 4

尝试将 设为IdleTimerDisabledtrue我们在 iOS 游戏中一直这样做,以防止 iOS 闲置我们的游戏。

\n

polite way注意:只有当用户由于观看重播、改变关卡的多媒体转场等而没有触摸屏幕时,我们才会执行此操作...

\n

注意:确保在不需要时(当您的应用程序确实进入后台时等)重置空闲状态,因为这样会耗尽电池电量并使用户对您的应用程序感到不满,而真正的杀手:Apple商店拒绝

\n

Apple:应用程序空闲计时器信息

\n

Xamarin:UIKit.UIApplication.IdleTimerDisabled 属性

\n
\n

该属性的默认值为“否”。当大多数应用程序在短时间内没有触摸作为用户输入时,系统会将设备置于“睡眠\xe2\x80\x9d”状态,屏幕会变暗。这样做是为了节省电量。但是,不这样做的应用程序除了加速计\xe2\x80\x94games之外没有用户输入,例如\xe2\x80\x94可以通过将此属性设置为YES,禁用\xe2\x80\x9cidle计时器\xe2\x80\x9d来避免系统睡眠。

\n

| 重要的

\n

您应该仅在必要时设置此属性,并确保在不再需要时将其重置为 NO。大多数应用程序应该让系统在空闲计时器到期时关闭屏幕。这包括音频应用程序。通过正确使用音频会话服务,当屏幕关闭时,播放和录音可以不间断地进行。唯一应禁用空闲计时器的应用程序是地图应用程序、游戏或应用程序需要在用户交互最少时继续显示内容的程序。

\n
\n