gpt4 book ai didi

macos - UI 更改的建议频率是多少?

转载 作者:行者123 更新时间:2023-12-03 17:49:01 26 4
gpt4 key购买 nike

我有一个 cocoa 应用程序窗口(NSWindow),它在屏幕上的位置应该经常更新(取决于一些计算)。正如文档中所指出的,UI 更改应该在主线程上进行:

void calculationThread()
{
while(true)
{
calculatePosition();
if(positionChanged)
{
dispatch_async(dispatch_get_main_queue(), ^{ setWindowPos(); });
}
}
}

void setWindowPos()
{
[window setFrame:_newFrame display:YES];
}

现在我遇到的问题是窗口移动非常慢并且延迟。在进行一些分析后,我发现计算过程大约需要 40 毫秒,这意味着我每秒排队 UI 更新 25 次。我读过here这可能比它们的处理速度要快,并且应该使用计时器每隔十分之一秒左右触发一次更改。但是,对于人眼来说,这不是太慢了吗(我的意思是,在这种情况下,运动不会被延迟,但会滞后,造成几乎相同的影响)。我将感谢一些这方面的知识分享。实际上我的主要两个问题是:

  1. 每秒 25-30 次 UI 更新真的太多了吗?
  2. 如果是,建议的 UI 更改频率是多少?

最佳答案

窗口在屏幕上毫无问题地移动的频率当然取决于用户机器的速度、他们拥有的显卡、窗口的大小以及可能的许多其他因素。对此没有一个好的答案。但是,如果您只是在屏幕上拖动一个窗口,您会发现它可能可以非常顺利地移动(除非您的计算机非常繁忙或内存非常低或其他原因);我不认为每秒 25 次会在现代 Mac 上产生问题。事实上,甚至还差得远。

@RobNapier 关于核心动画等的观点很好,但我认为有些夸大其词;如果您确实想要这样做,那么使用计时器或其他定期更新来更改 UI 本身并没有什么问题。 CoreAnimation 是一个使某些类型的动画变得更容易的工具包;使用它不是必需的,并且它并不适合所有问题。同样,如果您想要进行的更改实际上与屏幕刷新同步,那么 CVDisplayLink 很有用,但听起来并不是您真正想要做的。

就您的目的而言,您的基本方法似乎不错,尽管我建议添加 NSDate 检查,以便在上次更新时间小于之前的 1/60 秒时跳过更新。毕竟,在您的计算机上计算似乎需要 40 毫秒,但在其他计算机上可能会快得多;为了成为一个好公民,您想将绘图限制在合理的速度。

那么问题出在哪里呢?我怀疑问题实际上可能是您的调用[window setFrame:_newFrame display:YES]。如果你看Apple's docs对于该方法,他们声明“当 YES 时,窗口会在其 View 层次结构中发送 displayIfNeeded 消息,从而重绘所有 View 。”那么,每次调用该方法时,您不仅会移动窗口(我认为这是您的意图),而且还会移动窗口。您也正在重绘窗口的所有内容,并且很慢。如果您不需要这样做,那么这就是您需要消除的开销。改为调用 setFrameOrigin:setFrameTopLeftPoint: (这使得语义清晰,您正在移动窗口而不调整其大小或重新绘制它),或者可能只是 setFrame:显示:传递NO而不是YES,我猜你的性能问题将会消失。

如果您实际上每次都需要重绘窗口内容,那么请编辑问题描述以反射(reflect)这一点。在这种情况下,解决方案必须涉及分析窗口绘制速度缓慢的原因,并找出优化方法,这是一个完全不同的问题。

关于macos - UI 更改的建议频率是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com