LINUX.ORG.RU

как можно ускорить отрисовку

 , , ,


0

2

есть окно, в нем gtkdrawingarea, окно развернуто на весь экран, нужно рисовать графику @30fps.

cairo: делаем cairo_rectangle(cr, 0,0,width,height); cairo_fill(cr); для очистки экрана - получаем 15% нагрузку на CPU в процессе X

opengl: ничего не жрет, загрузка буквально 0%, все рисуется быстро (не только очистка экрана), но это если отключен композит. включаем — нагрузка на проц от 20 до 55% (зависит от видеокарты и драйверов).

gdk: примерно та же история, что с cairo.

какие еще есть варианты, чтобы везде работало, и была приемлемая скорость? в линуксе такое вообще возможно?

★★★★★
Ответ на: комментарий от waker

Не, ну быстрее, чем на опенГЛ не бывает.
А тут уже многое зависит от драйвера.

Bad_ptr ★★★★★
()

Если в отношении cairo, то FAQ you.

какие еще есть варианты, чтобы везде работало, и была приемлемая скорость? в линуксе такое вообще возможно?

В зависимотсти от задач и ожидаемого требования к оборудованию. Например, твой быстрый и нежрущий opengl низвергнет в пучины горести и печали владельцев не очень мощных видеокарт. SDL это хороший вариант.

auto12884835
()
Ответ на: комментарий от auto12884835

Если в отношении cairo, то FAQ you.

My application's slower than I think it should be. What can I do to help the cairo community find the problem?

вы про это? как это поможет мне ускорить графику в моем приложении? мне нужно чтобы работало сейчас, на моем компе, и после релиза на всех дистрах линуха которые сейчас есть. в т.ч. на древних версиях каиры которые были во времена debian lenny.

В зависимотсти от задач и ожидаемого требования к оборудованию.

рисовать несложную векторную графику — spectrum analyzer, scope, и т.п., для аудио-плеера. требования к оборудованию — любое, на котором запустится программа. 600mhz, 256Mb ram, видеокарта уровня riva tnt.

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

то что я собираюсь рисовать — работало быстро под вендой на riva tnt >10 лет назад, на 200-400mhz процах. под линуксом+opengl тоже работает быстро — но не с композитом. ищу как решить эту проблему. нужно решение, которое без композита работает не сильно медленнее чем opengl, а с композитом ну хотя бы пусть 15% жрет, но не 55. сейчас пока единственное решение, которое придумалось, это писать 2 рендера (opengl и cairo), и рисовать разными в зависимости от включенности композита. но это треш и угар. поэтому решил спросить на лоре, вдруг есть вменяемое решение.

SDL это хороший вариант.

на какой тестовой программе можно проверить данное предположение?

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

писать 2 рендера (opengl и cairo), и рисовать разными в зависимости от включенности композита

фигня это. Рисуй openGLом, имхо, и не парься.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

не подходит. с использованием opengl на любом современном дистрибутиве искоробочно 20-55% нагрузка на проц. просить юзеров отключать композит в xorg.conf ну совсем не вариант.

пример: http://img809.imageshack.us/img809/5864/withspectrum.png

см. в коньки на скриншоте. такая нагрузка появляется только когда плеер рисует спектрум через opengl.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

вы про это? как это поможет мне ускорить графику в моем приложении? мне нужно чтобы работало сейчас, на моем компе, и после релиза на всех дистрах линуха которые сейчас есть. в т.ч. на древних версиях каиры которые были во времена debian lenny.

Там есть про методы оптимизации вызовов cairo. Хотя да, для единственной операции - отрисовки битмапа это вряд ли поможет.

рисовать несложную векторную графику

Бывает Xara например. Либы от E17 очень хороши и быстры - Core EFL components.

на какой тестовой программе можно проверить данное предположение?

В самоучителе емнип был хелловорд для SDL. Можно заменить подпрограмму картинки на свою и посмотреть что будет. А так - сомневаться не приходится. Игры его пользуют, и ffmpeg например.

auto12884835
()
Ответ на: комментарий от auto12884835

Бывает Xara например. Либы от E17 очень хороши и быстры - Core EFL components.

да, я в курсе про evas и прочее, но его прикручивать к gtk весьма накладно. с xara скорее всего то же самое.

А так - сомневаться не приходится. Игры его пользуют, и ffmpeg например.

для игр и ffmpeg вполне нормально при проигрывании полноэкранной картинки жрать 100% CPU, так что не показатель. кроме того, SDL сам по себе не предоставляет функций для отрисовки векторной графики — нет ни градиентов, ни сглаживания, ни шрифтов, ни более сложных примитивов чем прямые линии и прямоугольники. это все придется сверху накручивать через другую библиотеку, а потом накручивать на gtk - получится, что SDL просто лишнее звено.

и тормоза, скорее всего, связаны не с самой каирой, а с интеграцией каиры в gtk, помноженной на композит. вероятно, что если заставить SDL рисовать в gtk widget — эти же тормоза проявятся. поэтому я и спросил пример — helloworld я и сам могу, а хочется увидеть SDL+GTK без тормозов.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

да, я в курсе про evas и прочее, но его прикручивать к gtk весьма накладно.

А зачем? Это отдельный фреймворк для создания приложений. Не считаю хорошей идеей мешать их все использовать в одном приложении. Получилось бы как gtk-приложение, в котором используется Qt Canvas. Можно, но извратно и бессмысленно. Qt кстати тоже есть. Он быстрее gtk.

с xara скорее всего то же самое.

Это дело другое. Она узкоспециализированная только для отрисовки, как и SDL.

SDL сам по себе не предоставляет функций для отрисовки векторной графики

Нету. Я поэтому про задачу и спросил. Не факт, что твоя графика+быстрая отрисовка при помощи SDL получится лучше и быстрее, чем cairo.

и тормоза, скорее всего, связаны не с самой каирой, а с интеграцией каиры в gtk, помноженной на композит.

Нет. Cairo - это слой абстракции. У него бывают бэкэнды, много. Тормоза добавляются как при преобразовании формата битмапов из каировского в пригодный для конкретного бэкенда, так и при отрисовке самим бэкендом. Очевидно, что пользовать opengl напрямую быстрее, чем cairo с opengl backend.

auto12884835
()
Ответ на: комментарий от auto12884835

А зачем? Это отдельный фреймворк для создания приложений.

я не собираюсь переписывать deadbeef на efl, как и на qt. если бы я был уверен, что evas даст удовлетворительную скорость в связке с gtk — я бы его использовал. просто нет такой уверенности. если это какая-то архитектурная ошибка в gtk - то это не получится так просто исправить, сменой графической библиотеки.

вобщем, не буду цитировать и отвечать на очевидности. просто перефразирую и уточню вопрос:

можно ли в линуксе, в рамках gtk, быстро рисовать векторную графику в линуксе, не используя opengl? под словом «быстро» я тут подразумеваю скорость, сравнимую с gdi+ под вендой на том же самом железе. интересует _экспертное_ мнение людей, которые сталкивались с этим лично, проводили бенчмарки, и у которых есть пример приложения, на котором можно это продемонстрировать. высосанные из пальца примеры вроде SDL, без привязки к GTK, не интересуют.

если нельзя — хрен с ним, будет быстро хотя бы у части юзеров, а остальным не повезло.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

Если честно, не понимаю, как OpenGL может столько кушать - у меня простенькая программа с 40 кадрами в секунду и тремя затекстурированными модельками ест 1% ЦПУ, на драйверах интела, и это на ubuntu 12.04 с композитингом. Да и гномовский монитор процессов походу не име

Да и оставшиеся накладные расходы можно убрать, если не обновлять картинку, пока окно плеера закрыто/свёрнуто.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

Да и гномовский монитор процессов походу не име

Начал писать и не дописал ;) Гномовский монитор по дефолту показывал 4%, и вообще подсовывал числа кратные четырём почему-то.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

ест 1% ЦПУ, на драйверах интела, и это на ubuntu 12.04 с композитингом.

у меня 1% получается только с отключенным композитом в xorg.conf.

как только включаю композит — подскакивает неслабо.

если включаю эффекты — подскакивает еще.

но у меня nvidia blob, так что видимо дело в этом.

а у человека который делал скриншот (выше) — блоб ati.

ты пробовал свою прогу запускать на блобах?

waker ★★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

ну это вселяет надежду, что не везде дела совсем плохи. 7% это конечно тоже жесть, а 2% это очень хорошо, если композит включен

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

SDL это хороший вариант.

на какой тестовой программе можно проверить данное п

редположение?

любая SDL игра. Например sdlroids или defendguin.

dikiy ★★☆☆☆
()
Ответ на: комментарий от waker

рисовать несложную векторную графику — spectrum analyzer, scope, и т.п., для аудио-плеера. требования к оборудованию — любое, на котором запустится программа. 600mhz, 256Mb ram, видеокарта уровня riva tnt.

хм.у меня на Duron 600 с 64mb и RivaTNT2 xmms летал с любыми визуализаторами.

Ну и не забывай, что RivaTNT - это не такая уж и слабая карточка.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

тему не читать, сразу отвечать?

waker ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.