转向Carbon时,相同的QtOpenGL代码运行速度大约低15倍(vs Cocoa)

Not*_*oti 7 opengl macos cocoa qt macos-carbon

我正在为Mac OSX平台开发一个非常简单的应用程序,利用Qt和OpenGL(和QtOpenGL),因此跨平台变得更容易.
应用程序接收可变数量的视频流,这些视频流必须呈现给屏幕.这些视频流的每个帧用作用于在3D空间中映射矩形的纹理(非常类似于视频墙).除了接收,锁定,上传视频数据,同步线程之类的东西......我认为很明显它是一个非常简单的应用程序.

事实是,当在10.5 Mac中使用基于可可的Qt 4.7二进制文件(默认值)时,一切都表现良好.但是我的代码必须在从(并包括)10.4开始的所有OSX版本中运行良好.所以我在10.4机器上尝试了代码,它在启动时崩溃了.经过几个小时的互联网阅读后,我发现,对于目标为10.4的Qt应用程序,必须使用碳Qt.所以我用新框架重建整个项目.
当新生成的二进制文件运行时,一切正常,除非应用程序的fps下降到大约2 fps!并且它在两台机器上的行为相同(10.5计算机具有明显更好的功能)我花了很多时间研究这个但我还没有达成解决方案.有什么建议?

有关应用程序和我尝试过的事情的更多信息

  • 重新编译碳时,代码尚未修改
  • 只使用了两个(256x256纹理)视频,以确保它不是带宽限制问题(虽然我知道它不应该因为第一个代码工作)
  • 2个视频流来自网络(本地)
  • 当视频流到达时,会发出信号并将数据上传到OpenGL纹理(glTexSubImage2D)
  • 计时器使渲染(paintGL)发生在大约20ms(~50 fps)
  • 渲染代码使用纹理(更新或不更新)来绘制矩形.
  • 仅当视频到达时才能呈现,因为有2个(异步)视频流; 除了必须在屏幕上绘制更多的东西.
  • 只使用基本的OpenGL命令(没有PBO,FBO,VBO ......)唯一有问题的可能是使用着色器(仅在Qt 4.7中提供),但它的代码很简单.
  • 我使用了OpenGLProfiler和Instruments.没有观察到任何特殊/奇怪的东西.

我怀疑的一些事情(结论)

  • 很明显,这不是硬件问题.同一台计算机的行为也不同
  • 它让我感觉它是一个线程/锁定问题,但为什么呢?
  • 碳是32位.10.5应用程序是64.它不可能开发64位碳.
  • 为了给出32位可能的原因,我还重建了32位的第一个项目.它的工作原理相同.
  • 我已经阅读了关于碳有问题(比平常更多)与上下文切换的东西.
  • 也许OpenGL实现是多线程而代码不是?(或相反的?)这可能会导致很多失速.
  • 也许碳处理事件与可可的不同?(我的意思是信号/事件调度,主循环...)

好吧,这是(抱歉这么久的写作)我的实际头痛.任何建议,想法..将非常感激.

Thx提前.

小智 1

我可以问一个诊断问题吗?您能确保它不会被传递给软件渲染器吗?

我记得10.4发布时,对quartz Extreme、quartz和carbon存在一些混淆,其中一些被禁用,其中一些默认禁用硬件渲染器,这需要最终用户进行配置才能使其正常工作。我不确定这个信息是否相关,因为你说,以 10.4 为目标,问题在 10.4 和 10.5 上都出现,是吗?

即使在 10.5 Carbon 中,默认情况下也有可能不使用硬件渲染器(尽管我承认我在这里抓住了救命稻草)。我想尽管 OSX 在所有情况下都更喜欢硬件渲染器而不是软件渲染器,但考虑到您已经对其他选项进行了彻底的研究,可能值得花一点时间进行研究。

祝你好运。