QQuickItem не будет отображаться

Я в тупике от этой ошибки. Любые предложения о том, как отследить его, будут оценены.

Предыстория:

Я пытался реализовать представление ogre3d как QQuickItem в Qt5. Есть пример (qmlogre), который показывает, что это возможно. Код примера нуждался в значительном рефакторинге для Win32 и делал больше, чем просто демонстрацию. Пример является лишь доказательством концепции.

Проблема:

Когда я вызываю определенный метод в коде Ogre (SceneManager::createEntity), элемент Qt больше не будет отображаться. Если я закомментирую вызов метода, он будет отображаться нормально. Если я закомментирую код в методе и заменю его на «возврат 0», он больше не будет отображаться. Рассматриваемый код не связан с графикой (он загружает трехмерный объект в память).

Что я пробовал:

  • Проверен журнал людоеда, где показаны исключения.
  • перенаправил ведение журнала Qt в файл для просмотра предупреждений/исключений.
  • Проверено "этот" указатель. Я динамически приводил this при входе в метод к классу, в котором он работал, и получил ненулевой указатель. Итак, rtti считает, что это правильный указатель класса.
  • Чтобы убедиться, что код Qt правильный, я заменил пользовательский код рендеринга из примера qmlogre кодом, который рендерит прямоугольник с плоским цветом.
  • Я, кажется, не потерял память

Могу ли я запустить что-то такое большое и сложное под valgrind? Есть ли подобные полезные инструменты? (Компилятором является Mingw, предоставленный Qt в загрузке версии 5.1 для Windows 7)

Я понимаю, что Qt5 по умолчанию многопоточный. Как узнать, превысил ли размер стека потоков?

Ogre не является потокобезопасным. Возможно ли, что код Qt одновременно работает в разных потоках и приводит к сбою людоеда? Мой код вызывается событием из QML (он находится в слоте Qt).


person Jay    schedule 25.09.2013    source источник
comment
Пробовали ли вы использовать другую систему рендеринга в конфигурации ogre? Пока ваш проект не так уж сильно связан со специальным RS прямо сейчас.   -  person dhein    schedule 26.09.2013
comment
Qt использует OpenGL для рендеринга. Я не уверен, как вы будете смешивать OpenGL и DirectX в одном окне.   -  person Jay    schedule 11.11.2013
comment
Я имею в виду, что, может быть, что-то не так с совместимостью текущей конфигурации Ogre rs с тем, что вы ожидаете?   -  person dhein    schedule 12.11.2013


Ответы (2)


Я не знаю Ogre в деталях, но в документации говорится, что класс Entity использует буферы OpenGL. Тогда, возможно, у вас есть конфликты между потоками для доступа к серверной части OpenGL.

Пробовали ли вы отладчики OpenGL, такие как GLIntercept или gDEBugger (см. https://www.opengl.org/wiki/Debugging_Tools< /а>) ?

person gbdivers    schedule 25.09.2013
comment
Я попробовал gDEBugger и разбил его. Буферы OpenGL могут быть просто проблемой. Спасибо! - person Jay; 26.09.2013
comment
Между прочим, у ogre есть несколько движков рендеринга, используемых внутри, в основном он обеспечивает D3D openGL и lich, а также что-то, что называется NULL-RS, но это совсем другое. - person dhein; 26.09.2013
comment
Qt5 использует OpenGL. Использование OpenGL также упрощает его портирование на другие платформы. Нулевая система рендеринга может быть полезна для отладки кода. Тогда я мог бы, по крайней мере, получить подтверждение, что проблема в системе рендеринга. - person Jay; 26.09.2013

Вы говорите, что загружаете объект из QML. По умолчанию в Qt 5 это будет означать, что вы загружаете объект, находясь в рабочем потоке Qt, а не в потоке рендеринга QML. Это не работает. Все вызовы Ogre должны выполняться из потока рендеринга, в котором был создан Ogre, иначе вы получите неопределенное поведение.

Я бы также рекомендовал проверить мой форк примера QML Ogre по адресу https://github.com/advancingu/QmlOgre< /а>. Это пример кода, который вы упомянули, но преобразованный в библиотеку. Еще слишком рано быть готовым к производству, но вы, возможно, сможете почерпнуть из него некоторые идеи для своего кода.

person advancingu    schedule 02.10.2013