QQuickItem不会渲染

时间:2013-09-25 13:09:27

标签: c++ windows qml qt5 ogre

我在这个错误上结束了我的智慧。任何关于如何追踪它的建议都将受到赞赏。

背景

我一直在尝试在Qt5中将ogre3d视图实现为QQuickItem。 有一个例子(qmlogre)显示它是可能的。需要示例代码 对Win32进行了大量的重构,并且不仅仅是演示。这个例子只是一个概念证明。

问题:

当我在Ogre代码(SceneManager :: createEntity)中调用特定方法时,Qt项将不再呈现。如果我注释掉该方法的调用,它就会很好。如果我注释掉方法中的代码并将其替换为“return 0”,则不再渲染。有问题的代码与图形无关(它将3d实体加载到内存中)。

我尝试了什么:

  • 检查食人魔日志显示例外情况。
  • 将Qt日志记录重定向到文件以查看警告/例外。
  • 选中'this'指针。我在方法的入口处动态地将'this'转换为它运行的类并接收到非空指针。所以rtti认为它是一个有效的类指针。
  • 为确保Qt代码正确,我将qmlogre示例中的自定义渲染代码替换为呈现平面颜色矩形的代码。
  • 我似乎没有记忆

我可以在valgrind下运行这么大而复杂的东西吗?是否有类似的工具有用? (编译器是Mingw,由Qt在Windows 7上的v5.1下载中提供)

我知道Qt5默认是线程化的。你怎么知道你是否超过了你的线程堆栈大小?

Ogre不是线程安全的。是否有可能Qt代码同时在不同的线程上运行并且崩溃了ogre?我的代码是由来自QML的事件调用的(它在Qt插槽中)。

2 个答案:

答案 0 :(得分:0)

我不太了解Ogre,但文档说Entity类使用OpenGL缓冲区。然后,您可能在线程之间存在冲突,无法访问OpenGL后端。

您是否尝试过像GLIntercept或gDEBugger这样的OpenGL调试器(cf https://www.opengl.org/wiki/Debugging_Tools)?

答案 1 :(得分:0)

您说您正在从QML中加载对象。默认情况下,在Qt 5中,这意味着您在Qt工作线程中而不是在QML渲染线程中加载对象。这不起作用。所有Ogre调用都需要从创建Ogre的渲染线程中进行,否则会得到未定义的行为。

我还建议在https://github.com/advancingu/QmlOgre查看我的QML Ogre示例分支。这是您提到的示例代码,但重构为库。现在接近生产准备就绪还为时尚早,但您也许可以从中获得一些关于代码的想法。