问题标签 [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 回答
195 浏览

ios - IOS编程中模型和视图之间的数据通信

我正在从头开始构建一个 iPhone 横向卷轴视频游戏。我有一个敌人模型需要改变敌人的手臂和腿的位置。我需要将这些更改传达给视图以进行显示。我是否应该在模型中使用 NSTimer 来更改这些位置,然后让 ViewController 基于 KVO 观察这些更改,让 ViewController 将信息发送到 View,并让 View 调用 setNeedsDisplay?自然,我希望拥有尽可能快的帧速率。

0 投票
2 回答
328 浏览

iphone - 从另一个有 CADisplayLink 的方法调用一个方法

我想从方法“method1”调用另一个方法“method2”。问题是“method1”上有一个 CADisplayLink,当我想从“method1”调用“method2”时,它以 6Ofps 的速度调用它,因此每秒调用 60 次,但我只想让它调用一次。我知道我必须使用 BOOL 变量,但我不知道如何使用它们。谁能帮我 ?对不起我的英语我是法国人:/

//编辑:方法1上有一个CADisplayLink:

}

所以每次'leScore % 20000 == 0'调用一次方法2。

0 投票
6 回答
11616 浏览

iphone - 如何正确停止和恢复 CADisplayLink?

我发现了 CADisplayLink 的一个大问题。

我有最基本的 EAGLLayer 和 OpenGL ES 1.1 绘制一个旋转三角形进行测试。这需要以屏幕刷新率调用运行循环方法,所以我像这样启动运行循环:

当测试应用程序启动时,我调用 -startRunloop。当我点击屏幕时,我调用 -stopRunloop。当我再次点击时,我调用 -startRunloop。等等。乒乓。

我正在测量 -drawFrame 方法在 20 秒内被调用的频率,以及 NSLog 它。

  • FIRST 启动/停止循环始终以 100% 执行。我得到最大帧速率。

  • 所有 SUBSEQUENT 启动/停止循环仅显示大约 80% 的性能。我得到一个明显更小的帧速率。但是:总是几乎完全相同,+/- 2 帧。即使在 50 多个启动/停止循环之后,也没有进一步退化的趋势。

总之:像我上面那样创建一个 CADisplayLink 很好,直到它失效或暂停。之后,任何新的 CADisplayLink 都不再表现良好。即使它是新的并且以与以前完全相同的方式创建。如果我通过使用 YES/NO 调用 -setPaused: 方法来暂停/恢复它,情况也是如此。

我已经通过 Allocations 和 VM Tracker Instruments 确保没有内存管理问题。我还检查了 CADisplayLink 的 -invalidate 方法是否真的被调用了。

设备上的 iOS 4.0 (iPhone 4)。

这是为什么?我错过了什么吗?

0 投票
0 回答
151 浏览

ios - iOS:Default.png 和第一个 OpenGL ES 帧之间的灰屏

我正在尝试移植我以前的 openGL iPhone 应用程序以使用 Xcode 的新 OpenGL ES 模板,该模板使用 CADisplayLink。

我注意到的是,在显示 Default.png 之后,在绘制第一帧之前,在我的应用程序处理第一帧上的加载内容时,中间有一个灰色屏幕。

如何将 Default.png 一直显示到准备好绘制第一帧?

0 投票
1 回答
3738 浏览

ios5 - RunLoop 中的 CADisplayLink 未调用回调

我有以下代码应该使每一帧都调用drawFrame,但它没有:

displayLink 是指向 CADisplayLink 的指针。在我看来,它们连接到一个标签。此视图连接到 viewReference。self 是 ViewController。声明了drawFrame

当我在 viewDidLoad 中测试时,可以设置 thel.text。

似乎 drawFrame 从未被调用过。该应用程序基于带有自定义故事板文件的 Xcode 4.2 空应用程序模板(我后来添加了它,而不是选择在创建时使用故事板)。除了视图控制器、视图和标签之外,它是空的。

我是新手。当调用 [[NSRunLoop currentRunLoop] run] iOS 5.0 Simulator 根本不显示应用程序。currentRunLoop 无论如何都应该是默认的主 runLoop。

0 投票
1 回答
4131 浏览

iphone - 仅使用 Core Graphics 和 CADisplayLink 的图像动画示例

我正在寻找使用 Core Graphics 和 CADisplayLink(不是 UIKit、CAANimation、CALayer)完成的图像动画(使用文件中的图像的动画)的示例。真正低级的东西。有谁知道这样的例子?

谢谢。

0 投票
0 回答
976 浏览

iphone - iOS 上 OpenGL ES 的 CADisplayLink 精度问题

我的 iOS 游戏目前使用 CADisplayLink 来计时 OpenGL 渲染操作。我在第二个线程上运行了一个 GCD 调度队列,该线程向 GPU 发出所有 OpenGL 渲染和状态调用。一切正常,除了时机不完美。即使动画间隔从 1 (60Hz) 更改为 2 (30Hz),我有时也会看到跳帧和故障。

CADisplayLink 从主线程上的 RunLoop 调用您的选择器,这意味着它只能在其他已调度的作业和主线程正在处理的输入事件之间触发。(我已经通过记录这些作业/事件确认了这种情况)。如果这些操作需要几毫秒,那么 CADisplayLink 将永远不会完全准确,因为它无法中断当前在主线程上运行的任何内容。正如我想象的大多数游戏一样,我在主线程上运行游戏模拟、物理和场景剔除。

所以我在想的是,我应该将所有游戏模拟和物理内容移出主线程,以便触摸事件和 CADisplayLink 可以在尽可能接近的时间触发。但我不确定这是否能解决任何问题,而且这不是一项微不足道的工作。

我想知道,由于 presentRenderBuffer 调用实际上是使您的帧与实际硬件显示同步的东西,也许我需要的只是一个非常准确的计时器,它可以在它自己的线程中运行(可能以更高的优先级)并触发渲染那样。然后我可以将所有内容保留在主线程上。似乎 CADisplayLink 提供的所有方法都是在我的代码运行速度超过 60Hz 的情况下等待的一种方式,所以在我看来,类似的延迟可以使用单独的线程轻松编码。我在这里想念什么?

0 投票
0 回答
128 浏览

iphone - 有人可以向我解释一下主线程和 NSThread 之间的调度是如何工作的吗?

例如,它是否从 pthreads 执行诸如 SCHED_FIFO 或 SCHED_RR 之类的操作?调度策略可以改变吗?可以将优先级分配给主线程和 NSThread 吗?

最终,我希望主线程使用 CADisplayLink 以 30 Hz 的频率运行。此外,NSThread 将以较低的优先级运行。理想情况下,主线程会抢占 NSThread 以保持 30 Hz。我不知道这是否可能。

0 投票
1 回答
2242 浏览

iphone - 跟踪 UIScrollView 时,没有为每一帧执行带有 NSRunLoopCommonModes 的 CADisplayLink?

我正在尝试在常规(非 OpenGL)iPhone 应用程序的每一帧上执行一小段代码。目标是有一个帧计数器,这样我就可以测量(而不是猜测)应用程序中的慢点在哪里,并修复它们以创造更好的用户体验。

到目前为止我所做的是为所有模式(包括跟踪)注册一个 CADisplayLink:

执行的代码如下所示(lastDraw 是一个 NSDate* 并计算一个 int):

这里的想法是每隔一秒更新一次关于在过去一秒内绘制了多少帧。

这似乎工作正常,但在 UIScrollView 中滚动时数字肯定是关闭的:如果我只是像普通人一样滚动,那么帧速率似乎是有意义的。但是,如果我用力上下滚动,则显示的速率会下降到 1 或 2 fps,但显然每秒绘制的帧数多于一帧。

当我像这样更改框架方法时:

很明显,当我滚动时触发的事件很少。

我在这里和网上阅读了很多关于 UIScrollViews 和 NSRunLoopCommonModes 与 NSDefaultRunLoopMode 的文章,但没有找到描述我的问题的人。我发现的最接近的是在这个问题中

请记住,如果 CADisplayLink 无法触发屏幕刷新(由于主线程忙于绘制前一帧之类的事情),那么它可能会跳过它,因为它没有足够的时间来完成。

不过,我似乎在官方文档中找不到任何证据,希望我做错了什么......

如果有任何区别,则有问题的设备正在运行 iOS 4.3.3。

0 投票
1 回答
259 浏览

iphone - 在 iPhone 上,是否可以在 CADisplayLink 回调方法执行时触发 touchesBegan:withEvent?

touchesBegan:withEvent 不会总是在 CADisplayLink 回调的每次迭代“之前”或“之后”触发吗?

编辑:这是我的 CADisplayLink 实例: