我有一个Unity应用,该应用需要处理大量数据而不冻结UI。
显而易见的解决方案:协程!
直觉的是要做
while (thingsLeftToDo()) {
doThings()
yield return null;
}
这将调用doThings()
一次,然后等待下一帧。
我想做的是在屈服之前在一帧时间内尽我所能。如果我的帧率为30fps,则在我需要放弃控制之前,我可能有三十次({或其他任何时间)致电doThings()
。但是我该怎么做呢?
我在想类似的东西
while (thingsLeftToDo()) {
doThings()
if (timeSpent > 1/fps) yield return null;
}
但是,当我查看how Unity does time时,似乎对任何一个的调用都将返回相同的值,而不管它们在帧中被调用了多少次,即时钟仅在帧之间更新。那我该怎么办呢?
我是否需要超越Unity API来使用系统时钟并自己负责?
startTime = SomeSystemClockFunction()
while (thingsLeftToDo()) {
doThings()
if (SomeSystemClockFunction() - startTime > 1/fps) {
yield return null;
startTime = SomeSystemClockFunction()
}
}
感觉有点脏。想法?