1

我对这个错误束手无策。任何有关如何追踪它的建议将不胜感激。

背景:

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

问题:

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

我试过的:

  • 检查显示异常的食人魔日志。
  • 将 Qt 日志重定向到文件以查看警告/异常。
  • 检查'this'指针。我在方法的入口处动态地将“this”转换为正在运行的类,并接收到一个非空指针。所以 rtti 认为它是一个有效的类指针。
  • 为了确保 Qt 代码正确,我将 qmlogre 示例中的自定义呈现代码替换为呈现纯色矩形的代码。
  • 我似乎没有内存不足

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

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

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

4

2 回答 2

0

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

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

于 2013-10-02T15:17:49.260 回答
0

我不详细了解 Ogre,但文档说 Entity 类使用 OpenGL 缓冲区。那么也许你在访问OpenGL后端的线程之间存在冲突。

您是否尝试过 GLIntercept 或 gDEBugger 之类的 OpenGL 调试器(参见https://www.opengl.org/wiki/Debugging_Tools)?

于 2013-09-25T17:47:30.813 回答