Советы по снижению заикания кадров opengl 3 и 4 под Linux - PullRequest
1 голос
/ 09 сентября 2011

В последние годы я разработал несколько небольших игр и приложений для OpenLG 2 и ES.Сейчас я пытаюсь построить граф сцены на основе opengl 3+ для случайной «трехмерной» графики в настольных системах.(Ничего сложного, в отличие от нереального или крипто-движка).

Я начал свою разработку с OsX 10.7 и был впечатлен недавним выпуском Apples ogl 3.2, который дает эквивалентные результаты по сравнению с системами Windows.

В противном случае результаты для Linux разочаровывают.Даже самая простая анимация заикается и разрушает впечатление реальности.Результаты не отличались между инструментариями Windows FreeGlut и GLFW.(Расширения загружаются с glew 1.7)

Я хотел бы отметить, что я говорю о новом ядре opengl, а не о старом opengl 2 render-path, который отлично работает в Linux, но использует вместо этого процессорграфического процессора для сложных операций.

После просмотра профессиональных демонстраций, таких как «Демо Unigine heaven», я думаю, что существует общая проблема использования современной трехмерной графики в реальном времени с Linux.

Любые предложения по решению этой проблемы приветствуются.

ОБНОВЛЕНИЕ :

Я использую: AMD Phenom II X6, Radeon HD57XX с последней версиейпроприетарные драйверы (11.8) и Unity (64Bit).

Вы можете взять мой renderloop из документации инструментария:

do {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ...
} while (!glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED));

Я использую VBOs , и все этапы преобразования выполняются с помощью шейдеров.Время анимации выполняется с помощью glfwGetTime () .Эта проблема возникает в оконном и полноэкранном режиме.Я не знаю, мешает ли менеджер композиций полноэкранным приложениям.Но также невозможно потребовать от пользователя отключить его.

Обновление 2 :

Опечатка : я использую карту HD57XX.

GLX_Extension: http://snipt.org/xnKg

Дамп PCI: 01:00.0 VGA compatible controller: ATI Technologies Inc Juniper [Radeon HD 5700 Series]

X Информация: http://pastie.org/2507935

Обновление 3:

Отключение диспетчера композиции уменьшает, но не полностью удаляет заикание.(Я заменил стандартный оконный менеджер на «ubuntu classic без расширений»). Раз в секунду анимация останавливается и появляются ужасные искажения:

(Изображение удалено - не разрешено публиковать изображения.)

ХотяВертикальная синхронизация включена в драйвере и проверена в приложении.

1 Ответ

1 голос
/ 09 сентября 2011

Поскольку вы работаете в Linux, нам нужно немного подробной информации:

  • Какое оборудование вы используете?

    Пока только NVidia, AMD / ATI и Intel предлагают 3D-ускорение.

  • Какие драйверы?

    Для NVidia и AMD / ATI существуют проприетарные(nvidia-glx, fglrx) и драйверы с открытым исходным кодом (nouveau, radeon).Для Intel существуют только драйверы с открытым исходным кодом.

    • Из всех 3D-драйверов с открытым исходным кодом драйверы Intel предлагают наилучшее качество.
    • Драйверы AMD / ATI с открытым исходным кодом, "radeon""достигли приемлемого состояния, но все еще не на должном уровне с точки зрения производительности.
    • Для графических процессоров NVidia единственными драйверами, которые имеет смысл использовать продуктивно, являются проприетарные.Драйверы с открытым исходным кодом "nouveau" просто не сокращают его, пока.
  • Вы запускаете менеджер окон композитинга?

    Компоновка создает целую кучувопросов синхронизации и синхронизации.Также (некоторые из них) код OpenGL, который вы можете найти в композитных WM в некоторых местах, вызывает слезы на глазах опытного кодера OpenGL, особенно если у вас есть опыт написания 3D (игровых) движков реального времени.

    KDE4 иGNOME3 по умолчанию использует композитирование, если доступно.То же самое относится и к настольной оболочке Ubuntu Unity.Также для некоторых некомпозиционных WM скрипты по умолчанию начинаются с xcompmgr для эффектов прозрачности и тени.

  • И последнее, но не менее важное: Как вы реализовали свой цикл рендеринга?

    Часто встречающаяся ошибка заключается в том, что таймер используется для выдачи событий повторного отображения с «регулярными» интервалами.Это не так, как это делается правильно.События таймера могут быть произвольно задержаны, и стандартные таймеры сами по себе тоже не очень точны.

    Правильный способ - вызвать функцию отображения в замкнутом цикле и измерить время, которое требуется между итерациями рендеринга, затемиспользуйте это время, чтобы продвинуть анимацию соответственно.Действительно элегантный метод - использовать одно из расширений VSync, которое обеспечивает частоту обновления дисплея и счетчик обновлений.Таким образом, вместо того, чтобы использовать таймер, вам сообщают точное время между кадрами в периодах цикла обновления дисплея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...