问题标签 [cadisplaylink]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3028 浏览

ios - How to set desired render frequency (FPS) in an iOS application?

I'm using CADisplayLink on an iOS app with a renderOneFrame method/handler. My understanding is this is triggered every screen refresh, i.e. 60Hz.

However my app is struggling to run at 60FPS and with more features to add, I worry that on older hardware this isn't feasible. Rather than have it running at variable rate, I'd rather render at 30FPS and give myself more breathing room.

Is there a way to make this happen easily?

This seems to be the core of it, but I'm a C++ coder porting to iOS so it's a bit confusing (I copied it from a sample I found):

0 投票
1 回答
540 浏览

ios - iOS - 检测 CALayer 内容的变化

我有一个CALayer其中有一个CAKeyFrameAnimation.

有没有办法检测内容的变化CALayer

就像,每当 的内容(图像)CALayer由于 而改变时CAKeyFrameAnimation,我想用 播放短的声音AVAudioPlayer

更新

我通过这样做解决了它。

当然,不要忘记在CADisplayLink不再需要它时使其无效。

0 投票
1 回答
1668 浏览

ios - 使用 CADisplayLink 时出现口吃动画

我正在尝试为一些 UIImageViews 设置动画以使用CADisplayLink调用MoveObjects函数来“跌倒”页面。然而,尽管函数调用的间隔是一致的 0.0155-0.017 秒,但动画似乎每隔几帧就会断断续续,就像我尝试使用 aNSTimer调用函数时一样。有什么我做错了,导致口吃吗?

viewDidLoad

当前 gameloop pnly 调用 UpdateObjects:

0 投票
2 回答
1242 浏览

iphone - CADisplayLink 和 UIView 动画不可靠

我正在尝试创建一个动画管理器类,它将为我处理递归动画。它正在工作,但不可靠。例如,有时,当使用它时,动画就像“背靠背”一样发生,它们之间没有延迟。其他时候使用它时,动画之间会留下延迟(这发生在位于其他视图控制器上的其他元素上)

这是我的代码:

0 投票
0 回答
289 浏览

ios - 我应该为集合视图中的每个单元格使用多个 CADisplayLink 对象还是使用单个 displayLink 和转发回调

什么更有效CADisplayLink?有多个实例,每个单元一个,还是有一个实例并将呼叫转发到每个单元?

0 投票
1 回答
4997 浏览

objective-c - 使用 CADisplayLink 作为动态频率定时器

我一直在使用 NSTimer 根据用户设置的频率淡入/淡出我的应用程序中的一些图像。例如,如果用户将频率设置为 5 秒,则每 5 秒将执行以下代码:

(确切的代码并不重要,只是淡入/淡出的整体概念。)然而,正如 StackOverflow 和各种网站上的许多人指出的那样,使用 NSTimer 会导致动画卡顿,因为它与帧率。所以我尝试改用 CADisplayLink :

但这并没有达到预期的效果;图像只是以非常快速的连续显示,而不是每 5 秒等待淡入/淡出。

知道什么是正确的方法吗?

0 投票
1 回答
223 浏览

ios - UIKit 动画块,例如 animateWithDuration:animations:completion 是否使用 CADisplaylink?

我希望是一个直截了当的问题。我一直在到处寻找这个问题的答案,但似乎找不到。有人知道吗?UIKit 动画块是否使用显示链接进行操作?

0 投票
3 回答
1448 浏览

ios - 从运行循环中删除 CADisplayLink 时游戏有时会崩溃

并不是每次玩游戏时都会发生这种情况,可能每玩 5 次或 10 次就会发生一次。当游戏结束时,我从运行循环中删除了我的 CADisplayLink(我用它来为游戏区域设置动画,有点像 Flappy Bird 中的管道)。但是,在少数情况下,它会在那条线上崩溃。在该行旁边,它具有:

这是代码:

如果我注释掉第一个 CADisplayLink 部分,它只会在第二个部分崩溃。

这是堆栈跟踪:

在此处输入图像描述

它具有与上述相同的“线程 1”错误。

到底是怎么回事??

0 投票
2 回答
8209 浏览

ios - 有多少种方法可以以编程方式计算 iOS 应用程序的 FPS(每秒帧数)?

既然我们在谈论programmatically仪器不在我的考虑范围之内。

预先列出的一些参考资料:

1. 使用CADisplayLink

根据文档,

持续时间属性提供帧之间的时间量。您可以在应用程序中使用此值来计算显示的帧速率...

所以在我的演示项目中,我为 UITrackingRunLoopMode 添加了一个 displayLink 到 mainRunLoop:

并用于duration计算 FPS。但出乎我的意料,duration无论 tableView 是否平滑滚动,它总是 0.016667 (~ FPS 60)。

我如何使 tableView 滞后是添加一行- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

然后我转向displayLink.timestamp,它起作用了。

2. 观察drawRect:

我的第二个想法是观察drawRect:,我认为当 tableView 滚动时,它drawRect:会被逐帧调用,然后我可以根据调用之间的时间差异计算 FPS drawRect:

但它失败了,因为drawRect:它只被调用了一次(而单元格被调用了很多次)。这种方式类似于Using CADisplayLink,但也许我选择了错误的位置/方法(如drawRect:)来观察,有什么推荐的方法供我观察吗?

问题:

  1. 仪器如何准确测量 FPS?
  2. 医生说错了吗using duration to calculate FPS
  3. 观察计算 FPS 的正确/最佳方法是什么?

谢谢!

0 投票
0 回答
910 浏览

ios - CADisplayLink 和 drawRect

我需要帮助来更好地了解其方式CADisplayLinkdrawRect行为,以便我可以弄清楚如何将我的应用程序的帧速率保持在平稳的 60fps。到目前为止,我的(可能是不正确的)理解如下:

1)CADisplayLink在显示刷新时调用指定的选择器(所谓的“垂直同步”事件;大约每 16 毫秒)。

2) iOS 使用双缓冲,这意味着在显示一个帧缓冲区时,我们可以准备(绘制)另一个,并且在下一个垂直同步事件时交换两者。

3)因此,从显示链接触发的那一刻起,我有大约 16ms 的时间来确保下一帧所需的所有计算和绘图都已完成,以便在交换缓冲区和屏幕刷新时一切就绪。

4) 自定义 UIView 的 drawRect 方法绘制到后台缓冲区,所以在drawRect调用该方法后的下一个 v-sync 事件中显示任何自定义绘制。

这真的是这样吗?(如果下一个垂直同步事件发生在我完成绘制到后台缓冲区之前会发生什么?)

那么,我应该如何使用CADisplayLink重绘自定义 UIViews 呢?我尝试setNeedsDisplay在显示链接触发时调用,但是在 drawRect 方法实际开始之前有一个延迟:

这是一个非常简化的示例,该方法中几乎没有绘制drawRect。我的一些更复杂的 drawRect 可能需要 10 毫秒才能完成。drawRect但是从启动到下一次显示刷新之间只有 5ms !另外,在显示链接触发和 drawRect 开始之间显然“浪费”了 11 毫秒!我该如何利用这段时间?

如果我尝试直接在显示链接选择器中调用drawRect,我会得到如下信息:

现在我的绘图代码似乎有足够的时间来执行。但是,Apple 文档明确指出“您永远不应该drawRect自己直接调用该方法”。那么为什么这是错误的做法呢?以及如何最大限度地利用我必须绘制每一帧的 16 毫秒?