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上任何类型的网络限制,请告诉我.
尝试将 设为IdleTimerDisabled,true我们在 iOS 游戏中一直这样做,以防止 iOS 闲置我们的游戏。
polite way注意:只有当用户由于观看重播、改变关卡的多媒体转场等而没有触摸屏幕时,我们才会执行此操作...
注意:确保在不需要时(当您的应用程序确实进入后台时等)重置空闲状态,因为这样会耗尽电池电量并使用户对您的应用程序感到不满,而真正的杀手:Apple商店拒绝
\nApple:应用程序空闲计时器信息
\nXamarin:UIKit.UIApplication.IdleTimerDisabled 属性
\n\n\n该属性的默认值为“否”。当大多数应用程序在短时间内没有触摸作为用户输入时,系统会将设备置于“睡眠\xe2\x80\x9d”状态,屏幕会变暗。这样做是为了节省电量。但是,不这样做的应用程序除了加速计\xe2\x80\x94games之外没有用户输入,例如\xe2\x80\x94可以通过将此属性设置为YES,禁用\xe2\x80\x9cidle计时器\xe2\x80\x9d来避免系统睡眠。
\n| 重要的
\n您应该仅在必要时设置此属性,并确保在不再需要时将其重置为 NO。大多数应用程序应该让系统在空闲计时器到期时关闭屏幕。这包括音频应用程序。通过正确使用音频会话服务,当屏幕关闭时,播放和录音可以不间断地进行。唯一应禁用空闲计时器的应用程序是地图应用程序、游戏或应用程序需要在用户交互最少时继续显示内容的程序。
\n
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |