【问题标题】:iOS background thread slow down when UI is idleUI空闲时iOS后台线程变慢
【发布时间】:2016-05-05 18:24:07
【问题描述】:

先了解一下上下文

我有一个 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)。当它超级慢时,我会得到 1 次 6 次更新周期。

让我感到困惑的一件事是:当我拉下 iOS 顶部栏菜单时,更新又回来了,并且流突然恢复了正常速度。更新率上升了约 10 秒,然后又回到了疯狂的滞后状态。

我的尝试

我试图启动一个只有这个的调度队列,像这样:

DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);

这似乎没有任何帮助。

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

NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated

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

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

【问题讨论】:

    标签: c# ios multithreading xamarin xamarin.ios


    【解决方案1】:

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

    注意:我们在polite way 中执行此操作仅当用户由于观看回放、级别更改多媒体转场等而没有触摸屏幕时...

    注意:确保在不需要空闲时(当您的应用确实进入后台等时)重置空闲,以免耗尽电池并使用户对您的应用感到厌烦。杀手:Apple Store 拒绝

    苹果:App Idle Timer info

    Xamarin:UIKit.UIApplication.IdleTimerDisabled Property

    此属性的默认值为 NO。当大多数应用程序在短时间内没有用户输入时,系统会将设备置于屏幕变暗的“睡眠”状态。这样做是为了节省电量。但是,没有用户输入的应用程序除了加速度计——例如游戏——可以通过将此属性设置为 YES 来禁用“空闲计时器”以防止系统休眠。

    |重要

    您应仅在必要时设置此属性,并且应确保在不再需要时将其重置为 NO。大多数应用程序应该让系统在空闲计时器结束时关闭屏幕。这包括音频应用程序。通过适当使用音频会话服务,当屏幕关闭时,播放和录制不会中断。 唯一应该禁用空闲计时器的应用是映射应用、游戏或程序,在这些应用需要在用户交互最少的情况下继续显示内容。

    【讨论】:

    • 我很确定我也试过这个......但我会再试一次。似乎这是为了屏幕变暗,这似乎不会在 10 秒后发生。
    • 我刚刚测试过...仍然滞后:(
    • @PhilippeParé 物理设备还是模拟器?蜂窝网络(3g/4g/lte)?无线网络?
    • 任何物理设备,wifi。
    • @PhilippeParé “假设”在模拟器上你没有看到这种行为(?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多