【问题标题】:QQuickItem will not renderQQuickItem 不会渲染
【发布时间】:2013-09-25 13:09:27
【问题描述】:

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

背景:

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

问题:

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

我的尝试:

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

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

我知道 Qt5 默认是线程化的。如何判断是否超出了线程堆栈大小?

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

【问题讨论】:

  • 你试过在 ogre config 中使用不同的渲染系统吗?就目前而言,您的项目与特殊的 RS 没有太大关系。
  • Qt 使用 OpenGL 进行渲染。我不确定你会如何在同一个窗口中混合 OpenGL 和 DirectX。
  • 我的意思是,也许当前的 ogre rs 配置的兼容性有问题,而你所期望的呢?

标签: c++ windows qml qt5 ogre


【解决方案1】:

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

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

【讨论】:

  • 我尝试了 gDEBugger 并使其崩溃。 OpenGL 缓冲区可能只是个问题。谢谢!
  • 顺便说一句,ogre 内部使用了多个渲染引擎,主要提供 D3D openGL 和 lich 以及一些称为 NULL-RS 的东西,但那是完全不同的。
  • Qt5 使用 OpenGL。使用 OpenGL 还可以更轻松地将其移植到其他平台。空渲染系统可能对调试代码很有用。然后我至少可以确认是渲染系统出了问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2019-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多