LINUX.ORG.RU

Qt, производительная 2D-графика.


0

2

Я вот знаю, что есть QPixmap, хранящий данные в памяти, принадлежащей иксам, а сам хранящий только ID иксового буфера или указатель на иксовую память. Это делает очень быстрой операцию отрисовки QPixmap - иксам никуда не надо ходить, берут готовый буфер, преобразованный под удобный им формат и тупо копируют в видеопамять.

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

Есть функции рисования примитивов у QPainter, типа drawLine. Они наверное транслируются в соответствующие иксовые или WinAPI-вызовы.

А есть ещё всякие фреймворки типа QGraphicScene - он упрощающает разработку простых 2D-графических приложений, грубо говоря: решает какие из миллионов объектов на сцене надо показывать, какие даже не надо пытаться рисовать, ибо они за экраном, какой там уровень зума и т.п. и т.д.

Я хочу на пальцах разобраться в вопросах производительности графики в Qt. Можно даже сказать, что меня интересует «геймерская графика» на самом низком уровне, но не ниже вызовов библиотеки Qt.

То есть мне интересно, какие сущности собственно являются средством рисования объектов на экране, какие сущности управляют только логикой и свойствами неких объектов (типа QGraphicScene). Скажем так, если задать себе такой дебильный вопрос, типа «какие штуки помогают оптимизировать производительность», то можно сказать так:

1) QGraphicScene - полезна потому, что её быстрые алгоритмы способны быстро найти объекты, которые надо показывать за счёт какого-нибудь там 2D-бинарного-дерева.

2) QPixmap держит данные в самом оптимальном для отображения формате (и месте), поэтому показать картинку из QPixmap - быстрее, чем из QImage.

Хочется для начала выяснить, сколько способов вывести что-то в окно существует в Qt, не прибегая к платформенно-зависимым вещам (типа вставить кусок ассемблерного кода, который в обход Qt что-то где-то нарисует) или к OpenGL или к DirectX?

Например: можно вызвать QPainter::drawLine() и др примитивы, можно вызвать QPainter::drawPixmap() или нарисовать QImage. Что ещё? Есть ли какой-то другой способ вывода пикселей, примитивов, буферов на экран?

Какие сущности в Qt занимаются управлением всякими там графическими сценами, без которых можно обойтись, изобретя свой велосипед, более оптимальный для управления твоими специфическими объектами?

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

Например, как может выглядеть алгоритм прокрутки большой карты? Карта разбивается на куски 128x128 пикселей как в google maps, выбираются видимые куски и рисуются через QPainter::drawPixmap. Летящая пуля - постояный update() с вызовом paintEvent() всего виджета? Или можно как-то оптимальнее?

короче, ты не угадал. там opengl es 2.0 внутре.

ckotinko ☆☆☆ ()

Выкини Qt и возьми SDL2 - там и понятнее всё и для игр применимее и нет тонны Qt'шного оверхеда. Есть всего две сущности - Texture и Surface - первое в GPU на сервере, второе в системной памяти клиента (и по очевидным причинам почти не используется).

Если не SDL2 то SFML.

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

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

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

Использовать виджеты Qt для игр будут на два порядка вырвиглазней - см. например, jag. А самописный гуй (начиная с xonotic и teeworlds) всегда выглядит замечательно. Для ленивых есть готовые guichan, mygui и аналоги.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

Ну насчёт «всегда» ты погорячился. Взгляни на вармукс, майнтест - звездец же.

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

Главный «виджет», где танк едет по полю, в любом случае будет кастомный. Остальные красивости гуёв уже от лишних ресурсов.

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

Блин... такое говно этот jag - постоянные сегфолты.

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

Напишите багрепорт. У меня под FreeBSD ни разу не падал.

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