问题标签 [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 投票
2 回答
334 浏览

ios - 应用程序在任何 UI 滚动操作期间停止接收 NSTimer 选择器回调

我在 NSTimer 触发的主窗口上有一个 OpenGL 动画绘图。如果我打开一个带有可滚动 UITableView 菜单的弹出窗口,动画会在滚动过程中冻结。一旦滚动动画停止,计时器回调就会重新开始。只有当用户主动尝试滚动时,主窗口才会停止更新。

似乎 Apple 的滚动动画以某种方式阻止了主循环上的调度。这是真的吗?有办法解决吗?

如果我能提供帮助,我真的不想引入多线程,因为这会成倍地增加我的代码的复杂性。

我也尝试使用 CADisplayLink 而不是 NSTimer 并且显示链接调用也被滚动动画阻止。

0 投票
2 回答
212 浏览

iphone - 每次调用方法时,CADisplay 链接似乎都在加速

我正在开发一个 iPhone 应用程序,在我的应用程序中有一个从屏幕顶部移动到底部的对象。为此,我使用 CADisplay 链接。一旦对象离开屏幕,它就应该重新开始它的路线。我遇到的问题是,每次对象重新启动其路线时,它都会加速。这种情况一直持续到物体运动得如此之快以至于你几乎看不到它。任何想法为什么会发生这种情况以及如何阻止它?任何帮助表示赞赏,在此先感谢!

0 投票
0 回答
567 浏览

ios - CADisplayLink frameInterval fps difference when using multiple OpenGL views

So this isn't exactly a real problem for me, but I would just like to know if anyone knows why this is happening.

I have 2 views that are side by side, although only one is visible at a time on screen, but both are active at the same time (need responsive swiping so dont want to destroy the views when they go off the screen). now when i just had the one view done, a frameInterval of 2 would result in a fps of 30, which is normal. when i added the second view, a frameInterval of 2 resulted in 60fps. I changed it to 4 on both views and then I started getting 30 fps as i intended.

Im not sure why its like this but i would like to know. Seems like a bug or something to me.

0 投票
2 回答
578 浏览

cadisplaylink - 即使显示不刷新,CADisplaylink 代码也会触发

注意:从 iOS7 开始,这个问题可能只出现在模拟器中——仍在测试中。

我有一个 CADisplayLink 的实现,当且仅当显示实际刷新时我才需要运行代码

这不会发生。

这是一个非常简单的测试程序:

我开始运行显示链接;在第一帧 aLabel 应该显示“WordFlash”;对于接下来的 19 帧,它应该显示“--------”,对于接下来的 100 帧,它应该是空白的;那么这个循环应该重复。

偶尔(比如 8 次中有 1 次),并且出乎意料的是,屏幕不会刷新以显示“WordFlash”,尽管代码确实已经触发(因为计数器已经前进)。仅当“WordFlash”已成功显示 1 帧时,我才需要计数器前进。

有任何想法吗?我完全被难住了。

注意:这种显示刷新跳过似乎与设备执行简单代码所需的时间无关(如在 NSLogged time-to-execute 中,代码可以在两个不同的周期中相同,而只有一个周期成功闪过这个词。

非常感谢,

b

0 投票
1 回答
580 浏览

ios - 跳跃的 CADisplayLink 动画

如前一篇文章 ( Here ) 中所述,我正在创建一个从初始角度开始并移动到结束角度的动画。我决定使用CADisplayLink这个动画,因为动画需要在用户输入期间尽可能快地运行,所以CALayeraCAKeyframeAnimation似乎实现这一点太慢了。

在实现CADisplayLink调用之后setNeedsDisplay,我确实让动画工作了,但它看起来真的很糟糕,因为它将 endAngle 和 initialAngle 之间的差异分成非常明显的角度块,而不是创建从一个角度到下一个角度的连续流动。这是我拥有的当前代码:

另外,kDrawDuration定义为3.0f,所以我希望动画从initialAngleendAngle需要 3.0 秒。我通过计算将整个圆(2*M_PI弧度)分成相等的部分2*M_PI / kNumAnglesInAnimation,最好我想为每帧动画其中一个角度,但不知何故,我仍然必须考虑kDrawDurationelapsedTime考虑到这一点,我只是不知道如何实现。

感谢您提供解决此问题的任何帮助!

0 投票
2 回答
240 浏览

ios - 如何使用 CADisplayLink 更新以编程方式生成的 UILabel?

UILabels在一个UIView(数据库中的每条记录一个)中以编程方式生成了一些。我希望这些定期更新(比如每 5 秒一次),但由于它们是动态的,因此很难对它们进行“处理”以改变它们的值。

任何人都知道如何做到这一点?

0 投票
1 回答
570 浏览

ios - 在情节提要之间暂停和恢复 CADisplayLink

我为我的游戏循环设置了一个 CADisplayLink 来处理动画循环。

当游戏结束时,我会展示另一个带有游戏结果的故事板。在该故事板上,用户可以选择再试一次。如果是这样,我选择再次展示游戏情节提要。

如何以正确的方式暂停和恢复 CADisplayLink?或者我应该销毁 CADisplayLink 并在游戏重新开始时创建一个新的?

0 投票
1 回答
8594 浏览

ios - 为圆形 UIBezierPath 设置动画

我有一个项目,我正在根据设定的进度为 UIBezierPath 设置动画。BezierPath 是圆形的,位于 UIView 中,动画现在使用 CADisplayLink 在 drawRect 中完成。简单地说,根据设定的进度x,路径应该径向扩展(如果x比以前大)或收缩(如果比以前x小)。

这是x自我们上次更新以来缩小的情况。我遇到的问题实际上有几个:

  1. 形状总是从 45º 开始绘制(除非我旋转视图)。我还没有找到任何方法来改变这一点,将其设置startAngle为 -45º 并没有什么区别,因为它总是“弹出”为 45。对此我能做些什么,或者我必须求助于其他绘图方法吗?
  2. 有没有其他方法可以让这些东西动起来?我已经阅读了很多关于使用的内容,CAShapeLayer但我还不太了解使用这两种方法的实际区别(就缺点和好处而言)。如果有人能澄清一下,我将非常感激!

更新:我将代码迁移到 CAShapeLayer,但现在我面临一个不同的问题。最好用这张图片来描述:

在此处输入图像描述

发生的情况是,当该层应该收缩时,细外线仍然存在(无论移动方向如何)。当条形缩小时,x除非我明确地在其上创建一个新的白色形状,否则不会删除 1- 的增量。代码如下。有任何想法吗?

更新 2:我已经解决了大多数其他错误。原来只是我一直很傻,把整个动画过度复杂化(更不用说到处乘以 1,什么?)。我制作了一个我无法解决的错误的 gif 图像:

径向控制故障

有任何想法吗?

更新3:(和关闭)。我设法通过调用摆脱了这个错误

现在一切正常。感谢所有的帮助!

0 投票
0 回答
576 浏览

ios - What causes CADisplayLink to fire only sporadically/get delayed?

Maybe you don't need all this information to help me with this problem. The core questions is: What can cause a CADisplayLink to delay firing, and how to check for possible reasons?

I'm using a CADisplayLink timer to velocity-/inertia-scroll my own implementation of an audio waveform view:

I'm experiencing problems with the accuracy of the timer. It usually fires 50 or 60 times a second (not sure, but exact number doesn't matter here). During certain actions, this rate goes down to about 3 to 5 fires per second, which is way too low for smooth scrolling. I am unable to identify what causes these delays.

I've tried:

  • Completely uncoupling drawing and loading by outsourcing the loading of audio data to a dedicated dispatch queue, which loads the data asynchronously.
  • Profiling and optimizing the drawing method. At peaks, it takes a maximum of 6ms.
  • Profiling the method called when the timer fires (velocityScroll:). It usually takes less than 1ms to execute, sometimes peaks are at 3ms.
  • using NSRunLoopCommonModes instead of NSDefaultRunLoopMode for the CADisplayLink timer

In the caching, I have a lot of dispatch_sync's and a few dispatch_barrier_sync's. Although most of them should be irrelevant, I've

  • profiled every dispatch-to-start time in my caching
  • profiled every execution time of dispatched blocks in the caching

Although most of them must be irrelevant. I didn't find any waits/blocking which took more than 50ms. This is a bit slow, but still I think it should not get the timer down to 5 fires/second or worse.

For profiling, I've not used a profiling tool (couldn't handle them). Instead, I used the typical approach:

Here is the method executed when the timer fires. The three methods in the middle are mostly plain simple position-calculations which are executed in almost no time, except the last one, which does a dispatch_sync to the main queue. However, this completes extremely quickly (less then 3ms, see above).

I know you guys would like to see more code, but there is a lot of code and I don't want to post all of it. Please ask for individual parts, which I will then post here, if you need them.

What could cause the delays between fires of the CADisplayLink timer or how to find it out?

0 投票
0 回答
208 浏览

ios - 多个 CADisplayLink 或尽可能少?

例子

  • 我有一个 UIView,它只是使用 CoreGraphics 绘制一个自定义微调器。它正在使用 CADisplayLink 进行自我更新,因此它可以绘制每一帧。
  • 另一个 UIView 子类也使用 CoreGraphics 绘制进度条。它还使用 CADisplayLink 更新自身。

这份名单可能会继续下去。正如你所看到的,每个组件都有自己的 CADisplayLink 显然是最简单的。

拥有多个 CADisplayLink 是好还是坏?(拥有多个 CADisplayLink 实例的一种解决方法是让一个实例在每个回调中发送给多个委托/块)