2013-10-13 2 views
3

Я работаю над переносным графическим интерфейсом для Linux и Windows и сталкивался с некоторой проблемой производительности. На нескольких системах (как мой нетбук, основанный на печально известной Intel GMA 3650) очень сильно влияет установленный драйвер.X11 GUI performance

Но каков парадокс, когда установлен резервный драйвер VESA, производительность моего кода намного выше, чем у выделенного проприетарного драйвера.

С другой стороны, с проприетарным водителем, , как и ожидалось Производительность компьютера очень хорошая. Аппаратное ускорение работает, видео высокой четкости воспроизводятся без проблем, и таким образом только мой код затрагивается в этом странном обратном порядке.

Мой код использует общие библиотеки, как Xlib, Xft, Pthreads и т.д.

Порт Windows (использует WinApi) работает в большой скорости без каких-либо проблем. Даже в Вине. Как еще один парадокс, та же самая программа, скомпилированная для Windows и работающая в WINE, рисуется намного быстрее, чем компилированная программа Linux.

Что может быть причиной этого эффекта и где его нужно копать, чтобы исправить это.

Репозиторий исходный код managed by fossil scm

Один тестовый пример в trunk/freshlib/TestFreshLib.fpr (для простого FASM компилировать freshlib/test_code0/TestLib.asm)

Это портативный пример и может быть скомпилирован для Windows, и Linux, а также.

Обновление 1: После некоторой мысли и изучения кода у меня есть гипотеза. Я использую два разных метода для рисования графики на окнах:

  1. Использование функций рисования XLib для рисования линий и прямоугольников.
  2. Использование библиотеки Xft для рисования текстов.

Элементы управления, которые я тестирую, используют двойную буферизацию, где буфер изображения представляет собой pixmap на стороне сервера.

Но IIRC, Xft рисует на стороне клиента, а затем отправляет изображение в виде растрового изображения на X-сервер, в то время как XLib рисует непосредственно на стороне сервера.

Возможно ли возникнуть конфликт между этими двумя методами (и каким-то соединением с аппаратным ускорением), чтобы вызвать ухудшение производительности?

+0

Это звучит невероятно. Вы можете выделить проблему в SSCCE? –

+0

Что такое SSCCE? Заметьте, я не специалист по программированию на C/C++ или даже Linux/X11. :) – johnfound

+1

А, я понял: «Короткий, самосохраненный, правильный, пример». Но, к сожалению, нет. Я могу, конечно, указать вас в репозиторий - это открытый исходный код, но есть довольно большой набор файлов, и я не знаю, где искать проблему. (и это на языке ассемблера :)) – johnfound

ответ

0

Хотя он может автоматически делать (Apple разработала Opencl для этой цели с помощью XQuartz API), библиотеки X не предназначены для использования аппаратного ускорения. OpenGL и directX хорошо знают, как это сделать для 3D-сред, которые вы обычно можете найти в играх.

Но вы также можете использовать его для 2D. Direct3D предназначен для использования многоугольников Direct2D предназначен для пластинчатой ​​графики. Вначале OpenGl был разработан для обеспечения общего назначения: поэтому у вас есть много функций, которые вы можете использовать для аппаратной ускоренной графики.

Основные варианты X11 включают GLX DRI и Gallium.
Я никогда не писал что-то, что использует эти API, но я просто знаю, что некоторые программы ускоряют их рисунки таким образом.

Преимущества производительности, наблюдаемые с резервным VESA, могут иметь следующее объяснение: Проприетарный драйвер выполняет дополнительные проверки (например, чтобы проверить, было ли предложено использовать аппаратное ускорение, а затем, поскольку он является обычным Xlib, он не ускоряется большую часть времени), в то время как резервный драйвер не может использовать аппаратные ускорения и идти вперед, чтобы использовать процессор вместо графического процессора.