gpt4 book ai didi

cocoa - 在循环中刷新 NSOpenGLView,而不释放 Cocoa 中的主运行循环

转载 作者:行者123 更新时间:2023-12-03 16:29:39 25 4
gpt4 key购买 nike

我正在构建一个 Cocoa/OpenGL 应用程序,每次大约 2 秒,我需要控制每个视频帧以及写入数字 IO 设备。如果在我进行 openGL 调用之后我放开了主线程(就像我在计时器触发方法中以 0.01 秒的间隔进行 openGL 调用),每次调用 glFinish()
但是,如果我让主线程保持忙碌状态,就像在 2 秒长的 while 循环中一样,openGl 调用将无法工作(令人惊讶的是,第一次调用 glFinish() 会工作,但其余的则不会)。文档说,glFinish 应该阻塞线程,直到执行 gl 命令为止。任何人都可以帮助我了解这里发生的事情或提供此问题的解决方案。为了说清楚,我想一个接一个地呈现 200 帧,而不会丢失一帧,并通过写入数字 IO 端口来标记每一帧刷新(我对此没有问题),所有这些都在 Snow Leopard 上进行。

最佳答案

这不完全是我的部门 - 漂亮的 Vanilla NSOpenGLView我自己的用户 - 但来自Mac OpenGL docs看起来您可能想使用 CVDisplayLink (Q&A1385)为此。即使这不起作用,那里的其他东西可能会有帮助。

编辑

我只对此进行了一些基本测试,但看起来只要您首先设置正确的 OpenGL 上下文,然后在每帧后交换缓冲区(假设您使用的是双缓冲),您就可以做您想做的事情上下文):

// inside an NSOpenGLView subclass, somewhere outside the usual drawing loop
- (void) drawMultipleFrames
{
// it might be advisable to also do a [self lockFocus] here,
// although it seems to work without that in my simple tests

[[self openGLContext] makeCurrentContext];

// ... set up common OpenGL state ...

for ( i = 0; i < LOTS_OF_FRAMES; ++i )
{
// ... draw your frame ...

glFinish();
glSwapAPPLE();
}

// unlockFocus here if locked earlier
}

我之前尝试过使用[[self openGLContext] flushBuffer]相反,在每帧的末尾 - 不需要 glSwapAPPLE但不会像 glFinish 那样阻止所以你可能会看到框架互相踩踏。这似乎与其他应用程序一起工作正常,在后台运行等,但当然 YMMV。

关于cocoa - 在循环中刷新 NSOpenGLView,而不释放 Cocoa 中的主运行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com