【发布时间】: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
标签: cocoa qt macos opengl macos-carbon