使用Carbon(与Cocoa相比)时,同样的QtOpenGL代码运行速度大约慢15倍
我正在为MacOSX平台开发一个非常简单的应用程序,使用Qt和OpenGL(以及QtOpenGL),因此跨平台变得更容易。使用Carbon(与Cocoa相比)时,同样的QtOpenGL代码运行速度大约慢15倍,cocoa,qt,macos,opengl,macos-carbon,Cocoa,Qt,Macos,Opengl,Macos Carbon,我正在为MacOSX平台开发一个非常简单的应用程序,使用Qt和OpenGL(以及QtOpenGL),因此跨平台变得更容易。 应用程序接收必须呈现到屏幕上的可变数量的视频流。这些视频流的每一帧都用作纹理,用于在3D空间中映射矩形(非常类似于视频墙)。 除了接收、锁定、上传视频数据、同步线程等功能外。。。我认为这是一个非常简单的应用。 事实上,在10.5 Mac中使用基于cocoa的Qt4.7二进制文件(默认的)时,所有的行为都正常。 但是我的代码必须在从10.4开始(包括到10.4)的所有OSX版
应用程序接收必须呈现到屏幕上的可变数量的视频流。这些视频流的每一帧都用作纹理,用于在3D空间中映射矩形(非常类似于视频墙)。 除了接收、锁定、上传视频数据、同步线程等功能外。。。我认为这是一个非常简单的应用。 事实上,在10.5 Mac中使用基于cocoa的Qt4.7二进制文件(默认的)时,所有的行为都正常。 但是我的代码必须在从10.4开始(包括到10.4)的所有OSX版本上都能正常运行。所以我在一台10.4版本的机器上尝试了这段代码,但它在启动时崩溃了。在网上阅读了几个小时后,我发现要使Qt应用程序以10.4为目标,就必须使用基于碳的Qt。因此,我用新框架重建了整个项目。
当新生成的二进制文件运行时,除了应用程序的fps下降到大约2fps之外,所有的程序都运行良好!!它在两台机器上的表现都是一样的(10.5计算机有更好的功能) 我花了相当长的时间在这方面,但我还没有达成一个解决方案。有什么建议吗 关于应用程序和我尝试过的东西的更多信息
- 重新编译碳基代码时未修改代码
- 仅使用了两个(256x256纹理)视频,以确保不存在带宽限制问题(尽管我知道不应该,因为第一个代码起作用)
- 2个视频流从网络(本地)到达
- 当视频流到达时,会发出一个信号,数据将上传到OpenGL纹理(glTexSubImage2D)
- 计时器使渲染(paintGL)以大约20毫秒(~50 fps)的速度进行
- 渲染代码使用纹理(更新或未更新)绘制矩形李>
- 由于有2个(异步)视频流,仅在视频到达时渲染将不起作用;此外,还有更多的东西需要在屏幕上画出来李>
- 只使用基本的OpenGL命令(没有PBO、FBO、VBO等)。唯一有问题的是着色器的使用(仅从Qt4.7中提供),但其代码很简单李>
- 我使用了OpenGLProfiler和工具。没有观察到任何特殊/奇怪的情况
- 很明显,这不是硬件问题。同一台计算机的行为不同
- 这让我觉得这是一个线程/锁定问题,但为什么
- 碳是32位。10.5应用程序为64。它不可能产生64位的碳原子
- 为了给出32位的可能原因,我还重建了32位的第一个项目。它的工作原理基本相同
- 我读过一些关于碳在环境转换方面有问题(比平常更多)的文章
- 也许OpenGL实现是多线程的,而代码不是?(或相反?)这可能会导致很多摊位
- 也许碳处理事件与可可不同?(我是指信号/事件调度、主回路…)
提前谢谢。我可以问一个诊断问题吗?您能确保它没有被传递到软件渲染器吗 我记得当10.4发布时,对quartz extreme、quartz和carbon有一些混淆,其中一些被禁用,一些默认情况下硬件渲染器被禁用,这需要最终用户进行配置以使其正常工作。我不确定这些信息是否相关,因为你说,针对10.4,问题同时出现在10.4和10.5上,是吗 即使在10.5Carbon中,默认情况下也不使用硬件渲染器,这是可能的(尽管我承认我在这里抓住了救命稻草)。我想,尽管OSX在所有场景中都更喜欢硬件渲染器而不是软件渲染器,但考虑到您已经在仔细研究其他选项,可能值得花一点时间进行研究
祝你好运。如果你使用的是Qt,我想你的代码可以在windows或linux平台上运行。您是否在这些平台下试用过您的应用程序 这将很快揭示它是来自Qt还是mac OSX版本。这可能会有所帮助。苹果保留碳元素,但不增加新功能,所以我保证他们也不会改变引擎盖下的任何东西。他们可能不会优化任何东西,因为他们的主要目标是在他们的平台上完全进入Obj-C