当经历一个非常长的数组,或者每个索引都有一个复杂的计算时,有没有办法在迭代数组后产生最长的时间。最长时间是每帧的最长时间。
例如:
for(int i = 0; i < 100000; i++){
do something complicated;
if(maximum amount of time /*right before the user feels lag*/)
yield; (come back and resume i where it last yielded)
}
}
//order does not matter
所以基本上,我想要实现的是cpu的高百分比使用率,但是,我不希望它超过100%,用户将遇到滞后
编辑: 对不起有点困惑。一个更清晰的例子可能是在诸如blender之类的程序中进行3d渲染。当用户点击渲染时,它会计算每个像素以确定它需要的颜色。当人们查看cpu使用情况时,它接近100%。但是,它在计算像素时不会冻结,同时计算最大量
答案 0 :(得分:5)
如果您在多个CPU上运行代码(如multithreading
标记所暗示的那样),则应该(在通常情况下)不需要停止执行循环以使您的用户界面保持响应。在一个或多个后台线程上执行计算,并让这些后台线程根据需要更新UI线程。
有一种方法可以在迭代数组后产生最长的时间
如果按收益率表示只是停止(并从下一帧开始重启),那么肯定。您可以将CancellationToken传递给您的主题,并定期检查取消请求。您可以在每个帧的开头使用计时器来触发该请求,或者更可能的是,使用已经执行帧结束处理的现有机制来触发线程停止工作。
如果你的收益意味着停在我所在的位置,并在下一帧开始时在那个地方继续,我会问为什么停止假设你有多个CPU。如果你必须停止,你可以像以前一样使用CancellationToken,但只是跟踪你在循环中的位置,从那里而不是在开始时恢复。
所以基本上,我想要实现的是cpu的高百分比使用率,但是,我不希望它超过100%,用户将遇到滞后
根据定义,您永远不会超过100%的CPU使用率。为避免CPU利用率较高时出现滞后感,请使用thread priorities确保前台线程的优先级高于后台线程。
答案 1 :(得分:0)
除非我错过了什么......
double MAX_PROCESSTIME = 50.0;
DateTime loopStart = DateTime.Now();
for(int i = 0; i < 100000; i++){
// do something complicated;
double timePassed = (DateTime.Now() - loopStart).TotalMilliseconds;
if(timePassed > MAX_PROCESSTIME)
{
break;
}
}
答案 2 :(得分:0)
通常,此问题的解决方案是将工作移至不能中断UI的单独线程,并让UI或控制器线程在被调用时取消工作。
另一个选择是,我已经读过一些典型人类的感知水平约为25毫秒;两个事件被认为是同时发生的,只要它们相隔小于25毫秒即可。可悲的是,我再也找不到原始参考,但我至少找到了a corroborating article。你可以使用这个事实来设置一个大约那么长的计时器,让程序运行到你想要的程度,直到计时器关闭。您可能还想要考虑非典型人类,特别是如果您的应用程序位于可能具有高于平均反应能力的人群中。
答案 3 :(得分:0)
您考虑使用推模型,并行迭代并提升事件,以便消费者只需处理每件商品吗?