gpt4 book ai didi

iphone - cocoa touch 编程。内循环中的KVO/KVC super 慢。我怎样才能加快速度?

转载 作者:行者123 更新时间:2023-12-03 20:50:14 24 4
gpt4 key购买 nike

我已经成为 KVO/KVC 的忠实粉丝。我喜欢它让我的 MVC 架构保持干净的方式。然而,我并不喜欢当我在我正在设计的 3D 渲染应用程序的内部渲染循环中使用 KVO 时所遭受的巨大性能损失,其中消息将以每秒 60 次的速度为每个观察对象(可能有数百个)触发。

加速 KVO 的技巧和窍门有哪些?具体来说,我正在观察一个标量值 - 而不是一个对象 - 所以也许包装/展开正在杀死我。我也在设置和拆除观察

[foo addObserver:bar forKeyPath:@"fooKey" options:0 context:NULL];
[foo removeObserver:bar forKeyPath:@"fooKey"];

在内循环中。也许我因此而受到打击。

我真的非常想保留 KVO 为我提供的巨大灵 active 。有速度狂人可以帮忙吗?

干杯,道格

最佳答案

Objective-C 的消息调度和其他功能经过调整,并且速度非常快,但它们仍然无法达到调整后的 C 在计算任务方面的潜力:

NSNumber *a = [NSNumber numberWithIntegerValue:(b.integerValue + c.integerValue)];

比以下慢得多:

NSInteger a = b + c;

由于这个原因,实际上没有人对 Objective-C 中的对象进行数学运算(而且语法很糟糕)。

Objective-C 的强大之处在于,您拥有一个基于表达性消息的良好对象系统,您可以在需要时丢弃昂贵的位并使用纯 C。 KVO 是最昂贵的位之一。我喜欢 KVO,我一直在使用它。它的计算成本很高,尤其是当您有大量观察对象时。

内部循环是您一遍又一遍地运行的一小段代码,其中的任何事情都会一遍又一遍地完成。如果需要,您应该在此处消除 OOP 功能,不应在此处分配内存,应考虑用静态内联函数替换方法调用。即使您以某种方式设法在渲染循环中获得可接受的性能,它的性能也会比您从那里获得所有昂贵的通知和分派(dispatch)逻辑要低得多。

如果您确实想尝试使用 KVO 继续保持下去,您可以尝试执行以下一些操作来加快速度:

  1. 在对象中从自动 KVO 切换为手动 KVO。这可以让您减少虚假通知
  2. 聚合更新:如果某个时间间隔内的中间值不相关,并且您可以推迟一段时间(例如下一个动画帧),则不要发布更改,请标记需要发布更改并等待为了让相关的计时器响起,您可能会避免一堆短暂的中间更新。您还可以使用某种代理来聚合多个对象之间的相关更改。
  3. 合并可观察的属性:如果一种类型的对象中有大量可能会更改的属性,那么最好进行单个“hasChanges”属性观察并让观察者查询属性。

关于iphone - cocoa touch 编程。内循环中的KVO/KVC super 慢。我怎样才能加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1155012/

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