Я разрабатываю очень простое приложение для платформы Mac OSX, использующее Qt и OpenGL (и QtOpenGL), чтобы облегчить кроссплатформенность.
Приложение получает переменное количество видеопотоков, которые должны быть отображены на экране. Каждый кадр этих видеопотоков используется в качестве текстуры для отображения прямоугольника в трехмерном пространстве (очень похоже на видеостену).
Помимо таких вещей, как получение, блокировка, загрузка видеоданных, синхронизация потоков ... Я считаю, что это довольно простое приложение.
Дело в том, что все работает нормально при использовании двоичных файлов Qt 4.7 на основе какао (по умолчанию) в Mac 10.5.
Но мой код должен нормально работать на всех версиях OSX, начиная с (включая) до 10.4. Итак, я попробовал код на 10.4 машине, и он завис при запуске. После нескольких часов чтения в интернете я обнаружил, что для приложения Qt, нацеленного на 10,4, необходимо использовать углеродную основу на основе Qt. Поэтому я перестраиваю весь проект с новым фреймворком.
Когда запускается новый получившийся двоичный файл, все работает хорошо, за исключением того факта, что fps приложения падает примерно до 2 fps !! И он ведет себя одинаково на обеих машинах (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-битной. Он работал частично так же.
- Я прочитал кое-что о углероде, имеющем проблемы (больше, чем обычно) с переключением контекста.
- может быть, реализация OpenGL является многопоточной, а код - нет? (или наоборот?) Это может привести к большому количеству остановок.
- может быть, углерод обрабатывает события иначе, чем какао? (я имею в виду диспетчеризацию сигнала / события, основной цикл ...)
Хорошо, это (извините за столь долгое написание) моя настоящая головная боль. Любое предложение, идея ... будет очень признателен.
Спасибо заранее.