Я разрабатываю очень простое приложение для платформы 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 является многопоточной, а код - нет? (или наоборот?) Это могло вызвать множество срывов.
- Может быть, углерод обрабатывает события иначе, чем какао? (я имею в виду отправку сигналов / событий, основной цикл ...)
Хорошо, это (извините за столь долгое письмо) моя настоящая головная боль. Любые предложения, идеи ... были бы очень признательны.
Спасибо заранее.
задан Noti 6 December 2010 в 03:02
поделиться