Тот же код QtOpenGL работает примерно в 15 раз медленнее при переходе на Carbon (по сравнению с Cocoa)

Я разрабатываю очень простое приложение для платформы Mac OSX, использующее Qt и OpenGL (и QtOpenGL), поэтому кроссплатформенность становится проще.
Приложение получает переменное количество видеопотоков, которые необходимо отобразить на экране. Каждый кадр этих видеопотоков используется в качестве текстуры для отображения прямоугольника в трехмерном пространстве (очень похоже на видеостену). Помимо таких вещей, как получение, блокировка, загрузка видеоданных, синхронизация потоков ... я считаю очевидным, что это довольно простое приложение.

Дело в том, что все работает нормально при использовании двоичных файлов Qt 4.7 на основе какао ( по умолчанию) в 10.5 Mac. Но мой код должен нормально работать на всех версиях OSX, начиная с (и включая до) 10.4. Итак, я попробовал код на машине 10.4, и он разбился при запуске. После нескольких часов чтения в Интернете я обнаружил, что для приложения Qt, ориентированного на версию 10.4, необходимо использовать углеродную версию Qt. Поэтому я перестроил весь проект с новым фреймворком.
Когда запускается новый результирующий двоичный файл, все работает хорошо, за исключением того факта, что частота кадров приложения падает примерно до 2 кадров в секунду !! И он ведет себя одинаково на обеих машинах (компьютер 10.5 имеет значительно лучшие функции) Я потратил довольно много времени, работая над этим, но я не нашел решения. Есть ли предложения?

Дополнительная информация о приложении и вещах, которые я пробовал

  • код не был изменен при перекомпиляции на основе углерода
  • , используются только два (текстуры 256x256) видео, чтобы убедиться, что это не ограничение пропускной способности проблема (хотя я знаю, что этого не должно быть, потому что первый код работал)
  • 2 видеопотока прибывают из сети (локальной)
  • , когда поступает видеопоток, выдается сигнал и данные будут загружены в OpenGL текстура (glTexSubImage2D)
  • таймер заставляет визуализацию (paintGL) происходить примерно через 20 мс (~ 50 кадров в секунду)
  • код визуализации использует текстуры (обновленные или нет) для рисования прямоугольников.
  • рендеринг только при поступлении видео не будет работать из-за наличия 2 (асинхронных) видеопотоков; кроме того, на экране нужно рисовать больше вещей.
  • используются только базовые команды OpenGL (без PBO, FBO, VBO, ...). Единственная проблемная вещь может заключаться в использовании шейдеров (доступных только в Qt 4.7), но его код банально.
  • Я использовал OpenGLProfiler и инструменты. Ничего особенного / странного не наблюдалось.

Я подозреваю, что (выводы)

  • Ясно, что это не проблема оборудования. Тот же компьютер ведет себя по-разному
  • , это дает мне ощущение, что это проблема потоковой передачи / блокировки, но почему?
  • углерод имеет 32 бита. Приложение 10.5 было 64. Оно не может развить 64 бита в углероде.
  • Чтобы выдать 32 бита, я также пересобираю первый проект для 32 бита. Отчасти это сработало так же.
  • i ' вы читали кое-что о углеродных проблемах (больше, чем обычно) с переключением контекста.
  • может быть, реализация OpenGL является многопоточной, а код - нет? (или наоборот?) Это могло вызвать множество срывов.
  • Может быть, углерод обрабатывает события иначе, чем какао? (я имею в виду отправку сигналов / событий, основной цикл ...)

Хорошо, это (извините за столь долгое письмо) моя настоящая головная боль. Любые предложения, идеи ... были бы очень признательны.

Спасибо заранее.

7
задан Noti 6 December 2010 в 03:02
поделиться