【发布时间】:2011-11-28 10:26:45
【问题描述】:
我有一个窗口,其主视图类型为NSView,子视图是NSOpenGLView 的子类,其名称为CustomOpenGLView。
NSOpenGLView 的子类是通过 Interface Builder 中的 Custom View 并将其类设置为 CustomOpenGLView 获得的。
这是根据 Apple 示例代码 Layer Backed OpenGLView 制作的。
应用程序会每隔 0.05 秒向 OpenGLContext 绘制一些内容。 使用 Core Animation Layer disabled 我可以在视图中看到移动的对象,这是视图不断重绘的结果。一切都完美无缺。
我现在想在CustomOpenGLView 之上有一个半透明的视图,以容纳播放/停止/ecc 等控制按钮。
为此,我向CustomOpenGLView 添加了一个子视图,并在CustomOpenGLView 上启用了核心动画层。控制按钮放置在这个新的子视图中。
这样,带有控制按钮的视图正确显示在CustomOpenGLView 之上,但现在视图不会重绘。只有当我调整包含所有这些视图的窗口大小时,它才会绘制。
结果是我没有看到任何“动画”...我只看到一个静止图像,它代表绘制循环开始时绘制的第一帧。 如果我调整窗口大小,openGLContext 会重新绘制,直到我停止调整窗口大小。之后,我再次看到在调整大小期间发生了最后一次绘制的静止图像。
此外,当绘图循环开始时,屏幕上只出现第一个“帧”,如果我调整窗口大小,比如说 5 秒后,我会在视图中看到它应该在 5 秒后绘制的确切内容绘图循环的开始。
看来我需要设置[glView setNeedsDisplay:TRUE]。我这样做了,但没有任何改变。
错在哪里?为什么添加核心动画层会破坏重绘?这是否意味着我没有得到什么?
【问题讨论】:
-
有什么原因不能使用 CAOpenGLLayer 代替吗?那么您就不必担心图层支持,因为您的内容将直接托管在图层中。像你一样,我在尝试使用 CALayer 支持 NSOpenGLView 时看到了伪像。
-
@BradLarson 我在使用 CAOpenGLLayer 时遇到了很多问题。我是一名新手开发人员,我已经阅读了一些关于从 NSOpenGLView 到 CAOpenGLLayer 的过渡的教程,但我无法让它工作。该应用程序使用
CVDisplayLink,并且绘制由 displaylink 回调控制。我知道 CAOpenGLLayer 不需要 CVDisplayLink 之类的东西,但我遇到了一些我无法解决的问题。该应用程序实际上是一个电影播放器,通过 displaylink 回调我检查在给定时间内是否有新帧可用;如果有新的框架可用,它就会被绘制。 -
@BradLarson(我在这里继续,因为我已经达到了上一条评论中的最大字符数)使用 NSOpenGLView 可以按预期工作。使用 CAOpenGLLayer,我在检查新图像是否可用时遇到问题,因为实例变量始终为
nil -
使用 CAOpenGLLayer,我在检查新图像是否可用时遇到问题,因为实例变量(应该调用检查新帧可用性的方法)始终是
nil。经过多天的挣扎,我因此放弃了 CAOpenGLLayer.. -
我在这里描述了我如何在一个应用程序中使用 CAOpenGLLayer:stackoverflow.com/questions/6113922/…。 CVDisplayLink 和 CAOpenGLLayer 不能很好地配合使用,正如我在这里提到的:stackoverflow.com/questions/5316474/…,但我听说有一些方法可以使用它来更新 CAOpenGLLayer 而不会出现我看到的工件。内部 CAOpenGLLayer 异步回调在大多数情况下应该可以正常工作,但 50 FPS 视频会导致问题。
标签: core-animation calayer nsview redraw nsopenglview