使用 Carbon(与 Cocoa 相比)时,相同的 QtOpenGL 代码运行速度慢约 15 倍
Posted
技术标签:
【中文标题】使用 Carbon(与 Cocoa 相比)时,相同的 QtOpenGL 代码运行速度慢约 15 倍【英文标题】:Same QtOpenGL code runs as about 15 times slower when going to Carbon (vs Cocoa) 【发布时间】:2010-12-06 03:02:52 【问题描述】:我正在使用 Qt 和 OpenGL(以及 QtOpenGL)为 Mac OSX 平台开发一个非常简单的应用程序,因此跨平台变得更加容易。 应用程序接收到必须呈现到屏幕的可变数量的视频流。这些视频流的每一帧都用作在 3D 空间中映射矩形的纹理(非常类似于视频墙)。 除了接收、锁定、上传视频数据、同步线程……我认为很明显这是一个非常简单的应用程序。
事实上,在 10.5 Mac 中使用基于可可的 Qt 4.7 二进制文件(默认二进制文件)时,一切正常。 但是我的代码必须在从 10.4(包括到)10.4 开始的所有 OSX 版本中运行良好。所以我在 10.4 机器上尝试了代码,它在启动时就崩溃了。在互联网阅读了几个小时后,我发现要针对 10.4 的 Qt 应用程序,必须使用基于碳 Qt 的。所以我用新框架重建了整个项目。 当新生成的二进制文件运行时,除了应用程序的 fps 下降到大约 2 fps 之外,一切都运行良好!并且它在两台机器上的行为都相同(10.5 计算机具有明显更好的功能) 我已经花了很多时间来解决这个问题,但我还没有找到解决方案。有什么建议吗?
有关应用程序和我尝试过的事情的更多信息
重新编译基于碳的代码没有被修改 只使用了两个(256x256 纹理)视频,以确保它不是带宽限制问题(尽管我知道它不应该因为第一个代码有效) 2 个视频流来自网络(本地) 当视频流到达时,会发出信号并将数据上传到 OpenGL 纹理 (glTexSubImage2D) 计时器使渲染 (paintGL) 发生在大约 20 毫秒 (~50 fps) 渲染代码使用纹理(无论是否更新)来绘制矩形。 仅在视频到达时渲染将不起作用,因为有 2 个(异步)视频流;除了更多的东西必须在屏幕上绘制。 仅使用基本的 OpenGL 命令(无 PBO、FBO、VBO、...)唯一有问题的事情可能是使用着色器(仅从 Qt 4.7 可用),但它的代码是微不足道的。 我已经使用了 OpenGLProfiler 和 Instruments。没有观察到任何特别/奇怪的情况。我怀疑的一些事情(结论)
很明显这不是硬件问题。同一台计算机的行为不同 它让我感觉这是一个线程/锁定问题,但是,为什么? 碳是 32 位。 10.5 的应用是 64。不可能在 carbon 中开发 64 位。 为了放弃 32 位可能的原因,我还为 32 位重建了第一个项目。它的工作原理大致相同。 我读过一些关于碳在上下文切换方面存在问题(比平时更多)的文章。 也许 OpenGL 实现是多线程的,而代码不是? (或相反?)这可能会导致很多停顿。 也许 carbon 处理的事件与 cocoa 的不同? (我的意思是信号/事件调度,主循环......)好的,这是(抱歉写了这么长)我真正的头痛。任何建议、想法.. 将不胜感激。
提前致谢。
【问题讨论】:
carbondev.com/site/?page=64-bit+Carbon 可能会有所帮助。苹果保持碳,但不添加新功能,所以我猜他们也不会改变引擎盖下的任何东西。他们可能不会优化任何东西,因为他们的主要目标是在他们的平台上完全进入 Obj-C 【参考方案1】:我可以问一个诊断问题吗?你能确保它没有被传递给软件渲染器吗?
我记得当 10.4 发布时,对石英极端、石英和碳有些混淆,其中一些被禁用,其中一些硬件渲染器默认禁用,这需要最终用户进行配置才能获得它正常工作。我不确定此信息是否相关,因为您说,针对 10.4,问题在 10.4 和 10.5 上都出现,是吗?
有可能(尽管我承认我在这里抓住了稻草)即使在 10.5 carbon 默认情况下也不使用硬件渲染器。我想尽管 OSX 在所有情况下都更喜欢硬件渲染器而不是软件渲染器,但考虑到您已经在研究其他选项的程度,可能值得花一点时间研究。
祝你好运。
【讨论】:
【参考方案2】:如果您使用的是 Qt,我猜您的代码可以在 windows 或 linux 平台上运行。您是否在这些平台下尝试过您的应用程序?
这将很快揭示它是来自 Qt 还是 mac OSX 版本。
【讨论】:
以上是关于使用 Carbon(与 Cocoa 相比)时,相同的 QtOpenGL 代码运行速度慢约 15 倍的主要内容,如果未能解决你的问题,请参考以下文章
进行 Carbon FSExchangeObjectsCompat 调用的 Cocoa 方法是啥?
Qt 4.5发布(最大的变动是换用LGPL许可证,移植进了苹果的Cocoa框架。之前的Qt只支持Carbon框架,现在的Qt 4.5两者都支持。单一源代码创建出支持32位或64位字节的Intel或Po