LINUX.ORG.RU

Сравнение производительности Qt и Cairo


2

0

Зак Русин провел сравнение производительности векторной графики в Qt и Cairo. Тест состоит из рендеринга трех сложных полигонов: text path, маленький полигон с большим количеством вершин на одной линии, огромный полигон с количеством вершин порядка 100000.

Измерялось количество кадров в секунду, использовались версии Cairo 1.2.5 (XRender и Glitz), Amanith из svn, Qt 4.3 (XRender и OpenGL) на Pentium4 3.2ГГц, 1Гб, NVIDIA 6600 с драйвером 1.0-9625.

Все тесты использовали антиалиасинг, и были предприняты усилия, чтобы поставить библиотеки в равные условия. Результаты очень интересны:

* Qt быстрее Cairo в XRender в 5-7 раз
* Qt(OpenGL) быстрее Qt(XRender) в 5-7 раз, но упирается в производительность GPU при 80000+ вершин
* Cairo(Glitz) показывает одинаковую производительность с Cairo(XRender)
* Ни Amanith, ни Cairo(XRender) не могут справится с последним полигоном в 100000 вершин.
* С большим полигоном Cairo(Glitz) отображает 0.2 кадра в секунду, а Qt переваливает за 10 fps.
* Qt(XRender) на порядок превосходит по производительности и Cairo(Glitz), и Amanith, хотя последние работают с OpenGL ускорением, а первый без него.


Выводы: Qt на голову выше других библиотек, а в OpenGL настолько быстр, что сравнивать с чем либо ещё просто нечестно.


PS от автора новости: Остается надеяться, что OpenSource позволит авторам Cairo "подсмотреть" построение тесселятора и рендерера, чтобы сократить разрыв до приемлемых значений.

>>> Подробности

★★★★★

Проверено: Shaman007 ()

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

здесь нечего думать. javascript c DOM манипуляциями SVG деревом не умеет никакого отношения как к 3D играм, так и к идиотизму "5000 вершин никак рабочий стол не перевалит, это точно"

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

> Да не, тот анонимус правильно сказал что для простых текстовых таблиц Qt сотворила подлость если нужно их постоянно ресайзить ибо тогда приходится перед ресайзом удалять все элементы (::clear() кстати разве не чистит память?)

Кажется, я его пробовал, но это ничего не дало. То ли память не освобождалась, то ли вообще сегфолтилось. В общем, пришлось делать костыли, запоминать число ячеек в последней инкарнации таблицы, перед перерисовкой чистить массивы этих QTableWidgetItem и пр. Код выглядит омерзительно, честно говоря... Хоть и работает и не течёт.

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

> еще один дурак а что в С память уже сама освобождается ? задача стояла сделать динамическую таблицу ? кто тебе сказал что память не будет освобождаться, типа gtk в голову ударила ?

Просто ПНХ. Нах ты GTK приплёл? Я про то, что при переходе Qt3 -> Qt4 работа с простыми динамическими таблицами резко усложнилась. Иди остынь и сунь голову в морозилку, флеймер.

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

> Внимание, вопрос: почему вызвались деструкторы?

Потому что ты явно вызвал removeRow. А теперь попробуй просто сделать setRowCount

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

> в Qt4 этого также не надо делать, Qt справляляется сама.

Ложь. Я проверял. Итак, что именно мне нужно написать. Была заполненная таблица 3x19, теперь нужна 10x16, всё содержимое изменится. Это пример. А в общем случае - как rowCount, так и columnCount, могут как увеличиваться, так и уменьшаться.

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

> Круто. Давно зюзя стала отдельным ДЕ?

Спроси на сайте OOo.

> Курить http://www.gnome.org/projects/ooo/.

Дядь, ты тупой? Я тебя спрашивал, где это написано НА САЙТЕ OOo? Чё ты мне филькиной/гномкиной грамотой тычешь? Я ща на своей страничке тоже напишу, что Vista разрабатывалась под моим руководством. И чё?

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

> Чё ты мне филькиной/гномкиной грамотой тычешь?

Вы б хоть для начала почитали, что там написано.

While OO.o didn't start it's life as a Gnome project, it is increasingly deeply embedded into Gnome - consider what parts of Gnome and the freedesktop are used in G/OO.o:

Сам ОО ("ванильный") действительно к гному имеет не очень близкое отношение. Но кто ж использует его, ванильный-то? ;) (если что - отвечать "я использую!" не обязательно). Он, как и ванильные ядра - материал в основном для дистромейкеров и Самоделкиных.. AFAIK дистрибуты очень плотно используют гномовские патчи (включающие те самые зависимости, которые перечислены на странице) - для интеграции...

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

> Потому что ты явно вызвал removeRow. А теперь попробуй просто сделать setRowCount

А сделать clear() перед setRowCount() и setColumnCount() тебе религия не позволяет? Контент ведь другой намечается.

baka-kun ★★★★★
() автор топика
Ответ на: комментарий от svu

Он умеет интегрироваться как с gnome(gui,evolution,gnome-vfs)/kde(gui,kioslaves,kde-addressbook) так и с windows(gui,directx). Он вообще всеядный, и в холиварах его можно использовать в любых направлениях =) .

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

> здесь нечего думать

Неправильный ответ. Я тебе в ответ на твои речи про абсурдность 3D игр на Cairo показал простую двухмерную игру в SVG с несколькими вершинами. И что я от тебя слышк? А ты мне в ответ маразм про рабочий стол на SVG. Не видно причины и следствия. Может давай ещё Xorg на ПХП перепишем чтоб до кучи было?

los_nikos ★★★★★
()
Ответ на: комментарий от baka-kun

>А сделать clear() перед setRowCount() и setColumnCount() тебе религия не позволяет? Контент ведь другой намечается.

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

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

>> Потому что ты явно вызвал removeRow. А теперь попробуй просто сделать setRowCount

> А-а-а, ну тогда ССЗБ....

А самая прикольная фишка в том, что setRowCount() использует
insertRows() или removeRows(). А в последнем есть такой
замечательный цикл:

    QTableWidgetItem *oldItem = 0;
    for (int j = i; j < n + i; ++j) {
        oldItem = tableItems.at(j);
        if (oldItem)
            oldItem->model = 0;
        delete oldItem;
    }

Так что, течёт память у него не из-за Qt, а по собственной глупости.

baka-kun ★★★★★
() автор топика
Ответ на: комментарий от los_nikos

>Я тебе в ответ на твои речи про абсурдность 3D игр на Cairo показал простую двухмерную игру в SVG с несколькими вершинам

аналогия: я тебе в ответ на твои речи про квантовый эффект показал простой яблочный пирог с несколькими вишнями.

как svg тетрис подтверждает твой тезис "5000 вершин никак рабочий стол не перевалит" и оправдывает требование 3D игр на Cairo ?

если тебе не понятно как "рабочий стол" связан с сложной SVG картинкой, то представь что та сложная картинка использована как значок. почему нет ? причем тут тетрис все тормоза которого в основном в jscripte ?

>Сегодня тема со 100000 вершин на рабочем не актуально точно

очень даже актуально, но SVG рендеринг(librsvg) бэкэндом которого является Cairo тормозит.

тяжёлый случай короче.

давайте голосовать - кто из-нас идиот(zort vs los_nikos) пройдите по треду вверх

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

> Этот флейм на N страниц позорит linux.org.ru да и все Славянское Linux Community.

сильно завернул! respect.
ps: чево, простите, он позорит?! какое коммюнити??? :-O

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от baka-kun

>А самая прикольная фишка в том, что setRowCount() использует insertRows() или removeRows(). А в последнем есть такой замечательный цикл:

....

>Так что, течёт память у него не из-за Qt, а по собственной глупости.

Блин, ну я тогда просто не знаю, КАК можно умудриться организовать утечку памяти.... =\

MYMUR ★★★★
()


судя по этому флейму, некоторым русскоговорящим пользователям что gnome , что kde ну совершенно некуда деть свое время. осмелюсь предположить, что к слову "работа" указанные товаристчи имеют весьма отдаленное отношение бо за время, потраченное на флейм, можно было влегкую заработать пару-тройку сотен баксов и спокойно пойти пить пиво. впрочем, пылу, с которым они защищают свой идеал и его применимость на "Серьезном Рабочем Десктопе в Серьезной Конторе" может позавидовать даже бывалый сейлз. забавно. это трейнинг такой молодых сейлзов, я угадал?

// wbr

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

>> течёт память у него не из-за Qt

> Блин, ну я тогда просто не знаю, КАК можно умудриться организовать утечку памяти.... =\

Например, передавать в setItem() не ссылку на объект, а на его копию. А когда юморист "вылечил Qt" -- это он просто стал снаружи отслеживать создание/удаление *своих* копий ;)

baka-kun ★★★★★
() автор топика
Ответ на: комментарий от klalafuda

> бо за время, потраченное на флейм, можно было влегкую заработать пару-тройку сотен баксов и спокойно пойти пить пиво.

Это что за работа такая? На урановых рудниках что ли? Простите, после такой работы уже не до пива будет ;-)

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

> это трейнинг такой молодых сейлзов, я угадал?

ЖжошЪ! :) В лорквотесы, однозначно.

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

>давайте голосовать - кто из-нас идиот(zort vs los_nikos) пройдите по треду вверх

Может я ничего не смыслю в идиотах, но я точно знаю, что SVG тетрис не имеет ничего общего с 3D играми. Может игру на Cairo и можно написать (как и, скажем, произносить слова на вдохе, а не выдохе), но эффективность будет ниже плинтуса...

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

если подумать, то треугольники можно Кайрой рисовать. Но что делать с попиксельным Z буфером ? заменить его на потреугольный ? получается 3d игры на Кайро даже в теории не возможны.

zort
()

Даже зарегистрировался в честь такого флейма :)

Хотел сообщить (как lead-developer), что в настоящее время система оформления, изготовления и контроля загран. документов нового поколения разрабатывается на Qt (работать под Линуксом все будет, можно не волноваться). И в целом все более чем довольны ;) (работать данная система будет по всей стране на всех объектах ФМС для оформления и выдачи загран. паспортов, а также на всех пунктах пропуска через границу)

ig_
()

тут анекдот вспомнил: "есть красные и черные муравьи. Нам все равно, а они друг с другом воюют". Просто представил себе, как эта потасовка KDE vs Gnome выглядит со стороны...

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

>работать под Линуксом все будет, можно не волноваться

Это посто мега-гуд (хотя я и не в РФ живу, но все равно приятно).

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

>Просто представил себе, как эта потасовка KDE vs Gnome выглядит со стороны...

Мдя, забавно так выглядит ))) Особенно расслоение и пересечение мыслей о C/C++,Unix-way/неUnix-way,Enterprise/Домохозяйки,интеграция/единообразие,GPL/etc ...etc...etc...
Хотя читать под конец и тяжеловато, но прикольно )))

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

> Хотел сообщить (как lead-developer), что в настоящее время система оформления, изготовления и контроля загран. документов нового поколения разрабатывается на Qt (работать под Линуксом все будет, можно не волноваться). И в целом все более чем довольны ;) (работать данная система будет по всей стране на всех объектах ФМС для оформления и выдачи загран. паспортов, а также на всех пунктах пропуска через границу)

А когда будет происходить переход? А то я, находясь в Германии и не имея возможности выехать в Россию, заказал обмен паспорта в Бонне за 85 EUR. Говорят, длится это 4..6 месяцев, 90% этого времени - в России и на пути туда-обратно. Интересно получу я теперь паспорт вообще? :)

anonymous
()
Ответ на: комментарий от baka-kun

>> Блин, ну я тогда просто не знаю, КАК можно умудриться организовать утечку памяти.... =\
> Например, передавать в setItem() не ссылку на объект, а на его копию. А когда юморист "вылечил Qt" -- это он просто стал снаружи отслеживать создание/удаление *своих* копий ;)

Хм, ради интереса сделал тестовую программу:

int i, j, k, dx, dy;
for (k=0; k<100000; k++) {
dx = rand()%100 + 1;
dy = rand()%100 + 1;
m_win->ui.tableWidget->setColumnCount(dx);
m_win->ui.tableWidget->setRowCount(dy);
for (i=0; i<dy; i++)
for (j=0; j<dx; j++)
m_win->ui.tableWidget->setItem(i, j, new QTableWidgetItem(tr("%1").arg((i+1)*(j+1))));
m_win->ui.pushButton->setText(tr("%1").arg(k));
}

собственно просто постоянный ресайзинг таблицы
вроде как не должна же захавать память ... но ... :( она ее захавала ... сначала я думал - немного пожует себе в кэш и успокоится, но сволочь уже вот 160 метров отгрызла и дальше понемногу кушает и судя по всему останавливаться не думает :(
кушает по чуть-чуть - метров 5-10 в минуту, но один фиг странно это...
Qt 4.1.4
где я мог ошибиться??? старый qt? или может не надо было обновлять таблицу которая на экране, а просто в памяти ее мучать...


anonymous
()

А вот знаете, как интересно..

У меня ненависть к kde куда больше ненависти к винде и microsoft ;) Я бы очень многое отдал за то, чтобы kde, qt и быдлософт, их использующий были уничтожены с лица этой земли. Микрософт особой агрессии не вызывает - пусть живет, что с ним. Я скорее готов оставить существовать винду (ей есть хоть какое-то предназначение), чем kde (которому вообще нет смысла существовать, а вопящих тут пионеров-пользователей можно, к примеру, временно отправить в консоль на перевоспитание, авось обучатся уму-разуму, или пусть на винду возвращаются).

Мда.. что-то меня совсем плющит. Но думаю, смысл понятен - самая ненавистная компьютерная технология, которую я знаю, это kde'шный быдлодесктоп. А те, кто орут "винда маст дай", просто еще не осознали, что бывают вещи куда хуже.

А еше меня очень удручает тотальное засилие невменяемых kde'шных фанатиков на лоре, которые не внимают здравым аргументам гномеров и прочих умных людей, а только поливают грязью все и вся. От постоянного чтения лоровских флеймов с вопящими и опускающими все, кроме qt и kde пионерами моя ненависть в kde постоянно усиливается и достигает совсем неимоверных стадий. Люди, пожалейте мое психическое здоровье! Одумайтесь! Не способны пока перелезть на гном - так хотя бы держите это при себе.

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

>Люди, пожалейте мое психическое здоровье!

Похоже, жалеть больше нечего... ГНОМосексуализм осложненный красноглазием налицо...

blaster999 ★★
()

GPL3 потому и застряла, что любителей гнома, gtk и прочего развелось ... Что будет с enterprise дистрибутивами и их любимым гномом когда в GPL внесут запрет на линковку GPL-ных библиотек с комерческим софтом. Это во-первых. А во-вторых цена на комерческий софт абсолютно не зависит от того с какой (комерческой или открытой) библиотекой он линкуется. Только бабла они срывают поболее при линковке с открытой библиотекой. Пример Autodesk. Эти гады выпустили Maya-7(о 8-й не знаю) под Виндовс и под Линукс в одну цену. Под виндой слинковались со всем комерческим софтом и в том числе с QT-3.3.4, а под Линуксом все построили на Open Motif.

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

> У меня ненависть к kde
> которому вообще нет смысла существовать

Может тебе к психотерапевту обратится ? Я серьезно, у нормального человека не будет ненависти к тому, чем его не заставляют пользоватся.

> пионеров-пользователей можно, к примеру, временно отправить в консоль на перевоспитание

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

> А еше меня очень удручает тотальное засилие невменяемых kde'шных фанатиков на лоре

А меня удручают все невменяемые фанатики - и KDE и Gnome и др., а также среднестатистическая глупость посетителей ЛОРа.


> которые не внимают здравым аргументам гномеров и прочих умных людей
Ты попробуй внять в здравые аргументы умных КДЕшников.

> От постоянного чтения лоровских флеймов с вопящими и опускающими все
Не принимай глупости близко к сердцу. Там где сильнее всего вопят - там наиболее глупые вещи пишут.

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

> Ты попробуй внять в здравые аргументы умных КДЕшников.

Помоему они напрочь отсутствуют как класс на ЛОР, либо не учавствуют в таких флеймах.

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

> получается 3d игры на Кайро даже в теории не возможны.

МЛЯЯЯ... Ну сколько можно?! Какие нафиг "3d игры"??? Вы доку хоть читали? "Cairo is a 2D graphics library with support for multiple output devices" (c) www.cairographics.org

no-dashi ★★★★★
()
Ответ на: комментарий от anonymous

>где я мог ошибиться???

Где, где - в коде конечно! Слишком много new и мало delete. Вместо нулей в циклах ставь предыдущие размеры таблицы.

Раз уж тут такой флеймогон пошел - кто из гномеров скажет - в гтк у меню появились тени? (без компизов если)

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

> Там где сильнее всего вопят - там наиболее глупые вещи пишут.

Обсуждение неоптимизированного под Cairo теста Qt на 50000-100000 вершин - что может быть глупее...

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

>Раз уж тут такой флеймогон пошел - кто из гномеров скажет - в гтк у меню появились тени? (без компизов если)

А оно Вам надо?

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

"Да, я вот тоже ненавижу людей, которые носят серые носки. Я бы многое отдал, чтобы серые носки исчезли с лица земли. Я готов вообще ходить босиком, чем в серых носках. Красные носки - тру. Серые носки - суксь и маздай!!! Еще меня удручает засилие тупых пионеров-сероносочников, которые не слушают мудрые мысли красноносочников и прочих гениев. От постоянного чтения флеймов меня вообще пропоносило. Одумайтесь, грешники! Не способны носить красные носки - тогда молчите и слушайте меня!!!

Что-то меня сегодня плющит. Не надо было курить старые портянки..."

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

>> Кажется, я его пробовал, но это ничего не дало. То ли память не освобождалась, то ли вообще сегфолтилось. В общем, пришлось делать костыли, запоминать число ячеек в последней инкарнации таблицы, перед перерисовкой чистить массивы этих QTableWidgetItem и пр. Код выглядит омерзительно, честно говоря... Хоть и работает и не течёт.

п-дишь музыкант
видно ручки кривые раз сегфолтилось

void QTableWidget::setRowCount(int rows)
{
Q_D(QTableWidget);
d->model()->setRowCount(rows);
}


void QTableModel::setRowCount(int rows)
{
int rc = verticalHeaderItems.count();
if (rows < 0 || rc == rows)
return;
if (rc < rows)
insertRows(qMax(rc, 0), rows - rc);
else
removeRows(qMax(rows, 0), rc - rows);
}

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