Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Carbon(与Cocoa相比)时,同样的QtOpenGL代码运行速度大约慢15倍_Cocoa_Qt_Macos_Opengl_Macos Carbon - Fatal编程技术网

使用Carbon(与Cocoa相比)时,同样的QtOpenGL代码运行速度大约慢15倍

使用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版

我正在为MacOSX平台开发一个非常简单的应用程序,使用Qt和OpenGL(以及QtOpenGL),因此跨平台变得更容易。
应用程序接收必须呈现到屏幕上的可变数量的视频流。这些视频流的每一帧都用作纹理,用于在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