问题标签 [nsopenglview]

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 投票
0 回答
82 浏览

macos - NSOpenGLView的帧率

我有一个显示 SceneKit 场景的 NSOpenGLView。

使用 SCNView 时,我可以简单地调用 showStatistics 让它显示统计信息,例如 FPS。使用 NSOpenGLView,是否有一种简单的方法可以在不使用 Apple 的 OpenGL Profiler 应用程序的情况下测量和显示 FPS?

0 投票
0 回答
410 浏览

swift - NSOpenGLView:从不同的线程绘图,实时调整大小时出现故障/闪烁

我是 macOS 开发的新手。

目前我正在NSOpenGLView使用第三方库实现一个。

  • update函数是来自库的回调,将在新帧到达时调用。由于预计会立即返回,因此应该异步调用绘图。
  • 我尝试在DispatchQueue.main.async()这里使用,但是我发现它会阻塞主线程,例如当容器窗口被调整大小时不会有动画。所以我创建了一个用于绘图的调度队列。
  • 现在调整大小非常顺利,但是在调整大小时视图会出现严重故障。我认为原因应该是从不同的线程绘制(调整大小时,视图也从主线程重绘),但我不确定具体原因。
  • 故障仅在窗口边界发生变化时发生。在调整大小期间,如果停止拖动一段时间,则没有观察到故障。

(更新:只有启用双缓冲时才会出现问题)

演示截图: 截屏

我尝试了几种解决方案。

  • 在主队列中调用videoView.drawRect()将完全阻止调整大小。
  • 添加锁定update()draw()将消除故障,但 UI 线程仍然很慢,调整大小不连贯。
  • 检查window.inLiveResizevideoView.drawRect()如果为真则停止调用。调整大小时,会自动调用 draw() 函数。这种方法可以很好地调整大小,但是当暂停拖动时,由于 LiveResize 事件未完成,视图将冻结。

我终于设法找到了一个解决方法,但它仍然不完美,我确信这不是正确的方向。

请建议我是否以正确的方式执行此操作,或者在不阻塞 UI 的情况下进行绘图的更好解决方案/最佳实践。谢谢!

0 投票
0 回答
705 浏览

objective-c - com.apple.root.default-qos 线程上的 NSAnimation 崩溃

我正在开发一个利用 CVDisplayLink 线程驱动的 NSOpenGLView 的 Cocoa 应用程序。

我们最近看到了一些带有以下堆栈跟踪的崩溃报告(在野外)。仅限 10.11。

我们有一个处于以下状态的 CVDisplayLink 驱动线程:

当我在 中设置符号断点时CA::Render::create_image,我无法让它在com.apple.root.default-qos thread. 所以我得到第一个问题——这个堆栈什么时候发生在 QOS 线程中?(而不是主线程)。

我应该注意到,有时崩溃会发生在上方(in 中CGImageGetProperty)。任何帮助,将不胜感激。

0 投票
0 回答
72 浏览

objective-c - OpenGL Picking 在 NSOpenGLView 中不起作用

我正在尝试在 NSOpenGLView 中实现拾取,但不起作用,这是代码。

我只渲染我需要选择的没有灯光的对象,并在正常渲染中渲染场景。

始终命中 = 0,并且 selectBuf 为空。

任何想法。谢谢

0 投票
0 回答
209 浏览

nsopenglview - 挂在 [NSOpenGLContext flushBuffer]

我有两个 NSOpenGLView,分别命名为 myView1 和 myView2。myView2 是 myView1 的子视图。然后我使用CVDisplayLinkCreateWithCGDisplay为主显示创建显示链接。myView1 和 myView2 都将使用 OpenGL 在主线程中(即在drawRect函数中)绘制一些东西。在显示链接回调中,我还将使用 OpenGL 为 myView1 绘制一些东西。

绘图代码类似于

目前一切正常。但是如果我为 myView1 和 myView2 添加以下代码,它很容易陷入挂起。

调用堆栈在这里:在此处输入图像描述

似乎主线程和显示链接回调都锁定在 [NSOpenGLContext flushBuffer] 中。有谁知道如何解决这个问题?

0 投票
0 回答
88 浏览

macos - _enableNeedsDisplayInRectNotifications 中的 NSOpenGLView 子类崩溃

更新:在 Sierra 10.12.6 上不会发生崩溃。但它确实每次都出现在我的 High Sierra 10.13.4 机器上。所以这似乎是在 High Sierra 中某个时候引入的 AppKit 问题。记录了 Apple 的错误。


我在这里创建了一个最小的示例。

NSWindowController的负载NSWindow来自 .xib 文件。该窗口仅包含一个NSScrollView. 在awakeFromNib中,我将滚动视图文档设置为我的NSOpenGLView子类的一个实例:

NSOpenGLView子类可以是完全空的实现,例如:

标题

实施

现在抓住窗口的一角并开始调整大小。将手指放在鼠标按钮上,拖动窗口边缘直到崩溃。

手表

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“不平衡需要在 rect 发布计数中显示。”

(我把完整的堆栈跟踪放在帖子的末尾,你会看到它都是框架代码)。

所以这些方法_enableNeedsDisplayInRectNotifications_enableNeedsDisplayInRectNotifications. 让我们覆盖它们:

我们可以看到,当我们调整窗口大小时,_enableNeedsDisplayInRectNotifications会重复调用。一旦我们松开鼠标并结束调整大小,_disableNeedsDisplayInRectNotifications每次调用都会调用一次_enable...

问题是,如果我们的计数达到 -63;我们崩溃了。

我可以通过覆盖这些方法而不是调用super.

到底是怎么回事?

完整的堆栈跟踪:

0 CoreFoundation 0x00007fff504d932b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x00007fff77b53c76 objc_exception_throw + 48 2 CoreFoundation
0x00007fff504df0c2 +[NSException raise:format:arguments:] + 98 3
Foundation 0x00007fff525fb340 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193 4
AppKit 0x00007fff4e2a9af2 -[NSView(NSInternal) _disableNeedsDisplayInRectNotifications] + 190 5 test2 0x000000010949ffb3 -[SessionView _disableNeedsDisplayInRectNotifications] + 83 6 AppKit 0x00007fff4e06876b] + [_NSPortalView72 setSourceView:
0x00007fff4e06802a -[NSPortalView dealloc] + 89 8 libobjc.A.dylib
0x00007fff77b49087 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 817 9 CoreFoundation 0x00007fff50412a56 _CFAutoreleasePoolPop + 22 10 Foundation 0x00007fff525378ad -[NSAutoreleasePool drain] + 144 11 AppKit
0x00007fff4d9e3990 -[NSApplication run] + 1031 12 AppKit
0x00007fff4d9b2a72 NSApplicationMain + 804 13 test2
0x000000010949ffe2 主要 + 34 14 libdyld.dylib
0x00007fff7876d015 开始 + 1 15 ???
0x0000000000000001 0x0 + 1

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0
libsystem_kernel.dylib 0x00007fff788bdb6e __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff78a88080 pthread_kill + 333 2 libsystem_c.dylib 0x00007fff788191ae abort + 127 3 libc++abi.dylib 0x00007fff7671df8f abort_message + 245 4 libc++abi.dylib 0x00007fff7671e12b default_terminate_handler() + 265 5 libobjc.A.dylib
0x00007fff77b55ea3 _objc_terminate() + 97 6 libc++abi.dylib
0x00007fff767397c9 std::__terminate(void ( )()) + 8
libc++abi.dylib 0x00007fff7673926f __cxa_throw + 121 8 libobjc.A.dylib 0x00007fff77b53da5 objc_exception_throw + 351 9 com.apple.CoreFoundation 0x00007fff504df0c2 +[NSException raise:format:arguments:] + 98 10 com.apple.Foundation 0x00007fff525fb340 -[NSAssertionHandler handleFailureInMethod :object:file:lineNumber:description:] + 193 11 com.apple.AppKit 0x00007fff4e2a9af2 -[NSView(NSInternal) _disableNeedsDisplayInRectNotifications] + 190 12 dev.test2 0x000000010949ffb3 -[SessionView _disableNeedsDisplayInRectNotifications] + 83 (SessionView.m) 131:2 .apple.AppKit 0x00007fff4e06876b -[_NSPortalView2 setSourceView:] + 166 14 com.apple.AppKit
0x00007fff4e06802a -[NSPortalView dealloc] + 89 15 libobjc.A.dylib
0x00007fff77b49087 (anonymous namespace)::AutoreleasePoolPage::pop(void
) + 817 16 com.apple.CoreFoundation 0x00007fff50412a56 _CFAutoreleasePoolPop + 22 17 com.apple.Foundation 0x00007fff525378ad -[NSAutoreleasePool排水] + 144 18 com.Apple.Appkit 0x00007fff4d9e3990- [NSAPPLICICATION RUN] + 1031 19 COM.APPLE.APPLE.APPKIT 0X00007FFF4D9B2A72 NSAPPLICATION MAIN + 804 20 DEV.TEST2 0X0000000000010949FFE2 MAIN.LIB
+ 34(MAIN.LIB)(MAIN.LIB)(MAIN.LIB)(MAIN.LIB)(4
) 1

0 投票
2 回答
134 浏览

objective-c - 在不同的NSWindow中的NSOpenGLView上绘制不同的形状

我在 Mac OS 上的目标 c 中使用 AudioVisualizer。我有 2 个 NSWindows,里面有 NSOpenGLView。

在此处输入图像描述

如果仅使用 NSOpenGLView 打开 1 个 NSWindow,它会显示没有任何问题的形状。

但是如果打开2个上面有NSOpenGLView的NSWindows,只有一个GLView绘制一个形状,但是在其他NSWindow中播放其他音频时,该形状与它的音频不匹配。

在 NSOpenGLViews 中,只要 CADisplayLink 需要显示,它就会调用 redraw 方法。

这是与OpenGLContext相关的部分。

这是redraw方法

这里是 redrawWithPoints 方法

我想同时在不同的 NSOpenGLViews 中显示不同的音频可视化器。

有可能与OpenGL有关吗?

0 投票
0 回答
191 浏览

macos - Cocoa API 不断重置我们的 NSCursor

我们有一个应用程序,它有一个全屏视频播放器和一个浮动窗口(托盘),可以为用户提供修改视频的工具,视频播放只有一个视图,所有的绘图都发生在那里,它是一个 NSOpenGLView子类。如果用户单击托盘中的按钮,然后将托盘移动到视频视图上,我们使用 mouseEntered: 将光标 -[NSCursor set] 更新为 1 以反映用户正在绘图,但大约一秒钟后, Cocoa 将光标设置回箭头光标。

我在 -[NSCursor set] 上创建了一个符号断点,以查看它的来源,这是我得到的调用堆栈。

我尝试将实现从使用 -[NSCursor set] 和 mouseEntered: events 更改为 -[NSView addCursorRect:cursor:] 并带有整个视图边界的矩形,但这根本不会设置光标,可能是因为我们正在使用一个 NSOpenGLView 子类?

奇怪的是光标并不总是重置,如果您单击按钮并暂停然后移出托盘,我们不会得到带有上述堆栈的 -[NSCursor set],只有当您直接移动时,才有可能它与托盘更改的调整窗口框架光标大小有关,但我不确定。

我想出了一个使用 mouseMoved 的 hacky 解决方案:检查光标是什么,但它只有在用户移动光标时才有效,我宁愿弄清楚为什么我得到不需要的 -[NSCursor set] 和改为修复它。

0 投票
3 回答
2446 浏览

macos - OpenGL 无法在 macOS Mojave 上渲染

如果您在 macOS Mojave 上创建NSView和自定义NSOpenGLContext,则在调整大小之前不会渲染窗口。但是,如果您改用它,一切都会起作用NSOpenGLView。我看到很多以编程方式调整窗口大小的黑客(http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp),然后再渲染或调用[NSOpenGLContext update]两次(https:// github.com/go-gl/glfw/pull/229/commits/9e6129a572227a13ff9acb4904443d2ae7d66e77),但它们看起来真的很老套且不可靠。

0 投票
0 回答
306 浏览

opengl - NSOpenGLView 子类不在 Mojave 上呈现

在针对 Mojave 框架使用 Xcode 10 进行编译时,我遇到了一个非常奇怪的错误。

事实证明,OpenGL 停止显示。看起来它实际上在某个地方(支持层覆盖它?)在快速更新窗口的可见区域(!)或最小化时可见(精灵效果使用的快照显示它!)

最奇怪的是,我在另一个项目中使用了几乎相同的类,并且在为 Mojave 构建时它工作正常!

我看到了为使用单独上下文的人发送更新到 OpenGLContext 的解决方案,但这是 NSOpenGLView 的一个简单子类。在这种情况下,Cocos2D 的 SpriteBuilder 的一个分支。

我尝试更新底层上下文,将视图设置为支持高分辨率并尝试防止创建支持层。到目前为止没有任何效果。

编码: