Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 层支持的NSOpenGLView+;动画计时器=奇怪的绘图行为?_Cocoa_Opengl_Core Animation - Fatal编程技术网

Cocoa 层支持的NSOpenGLView+;动画计时器=奇怪的绘图行为?

Cocoa 层支持的NSOpenGLView+;动画计时器=奇怪的绘图行为?,cocoa,opengl,core-animation,Cocoa,Opengl,Core Animation,我正在创建一个应用程序,它将NSOpenGLView子类化,以绘制一些OpenGL图形。现在我想添加一个覆盖控件,类似于QuickTime X。我尝试的第一件事是将NSOpenGLCPSurfaceOrder设置为-1,并使我的窗口不不透明。它确实有效,但我丢失了windows阴影,因此不是可行的解决方案 然后,通过调用[setWantsLayer:YES]并将我的控制框添加为子视图,我创建了NSOpenGLView子类层。它奏效了,但我注意到性能大幅下降。我做了一些研究,发现: 我正在使用NS

我正在创建一个应用程序,它将NSOpenGLView子类化,以绘制一些OpenGL图形。现在我想添加一个覆盖控件,类似于QuickTime X。我尝试的第一件事是将
NSOpenGLCPSurfaceOrder
设置为-1,并使我的窗口不不透明。它确实有效,但我丢失了windows阴影,因此不是可行的解决方案

然后,通过调用
[setWantsLayer:YES]
并将我的控制框添加为子视图,我创建了NSOpenGLView子类层。它奏效了,但我注意到性能大幅下降。我做了一些研究,发现:

我正在使用NSTimer对象每秒调用一个方法
[timerFired::
60次。工作完美。我在这个方法中所做的唯一一件事就是调用
[self-setNeedsDisplay:YES]
,因为当使用一个以图层为背景的OpenGLView时,需要重载
[drawRect:rect]
方法并在那里绘制所有OpenGL图形。问题是:
[drawRect:rect]
经常被调用,尽管计时器没有启动

起初我认为“当然,它会绘制NSOpenGLView,所以它可能会被窗口管理器或其他东西调用”。因此,删除了我的计时器对象,以确定在
[timerFired::
调用之间如何调用它。结果是:根本没有调用它,至少在不调整窗口大小或拖动窗口时没有调用

所以下一步我用计时器的时间间隔做实验。事实证明,在每秒55次之前,
[drawRect:rect]
在每秒60到70次之间被调用,从每秒59次的计时器间隔开始,
[drawRect:rect]
在每秒100到120次之间被调用

我怀疑调用我的图形的这种高度不可预测的方式会导致性能损失,或者是因为不均匀,或者是因为大量OpenGL图形阻塞了线程,而没有足够的时间来执行或者其他什么。我还了解到,以层为基础的OpenGLViews不能与vsync一起工作,尽管我无法确认这一点

有人有解释吗?有人知道如何只在计时器上绘制OpenGL吗

我已经尝试过这种简单的方法,添加了一个布尔变量,在我的
[timerFired:
中将其设置为true,并使我的
[drawRect:rect]
仅在变量为true时调用OpenGL绘图方法。结果是一个非常忽悠和口吃的动画,所以没有运气

使用带有异步动画的CAOPENGLayer命令CVDisplayLink怎么样?要么有帮助


编辑另一件可能有用的信息:我已经使用了
[setNeedsDisplay:YES]
,而我的视图没有图层备份,因此我可以轻松地在图层备份和非图层备份之间切换,并且我没有上述任何问题,因此这肯定与我的视图有图层备份有关。只要调用
[setWantsLayer:YES]

,一切都变得一团糟,所以我用CVDisplayLink替换了我的NSTimer对象,一切又恢复了正常。虽然我不明白为什么。似乎请求一个支持层破坏了垂直同步,但这并不能解释突然出现的对
drawRect
的随机调用

另外,我真的很想知道vsync是否与层支持的NSOpenGLView和/或CAOpenGLLayer一起工作。我找不到任何官方信息