Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > SVG + OpenGL


Автор: sh0375 31.3.2009, 16:05
Добрый день!

Помогите, кто может, разобраться с такой задачей:

есть огромные SVG файлы, полученные экспортом из Adobe Illustrator, размером в сотни мегабайт. 
Их нужно просматривать в программе на QT.
Я реализовал это без использования OpenGL.
В потоке запускается отрисовка нативными средствами QT.
Но работает медленно.
Стоит задача ускорить работу. Я попробовал перевести на OpenGL. Но столкнулся с рядом неразрешимых для себя проблем:

1. мне показалось OpenGL работает в потоке не совсем стабильно.  программа элементарно подвисала при запуске отрисовки OpenGL в потоке. Причем не сразу. Могла несколько раз и отрисовать.

2. я использовал простое перенаправление вывода QT методов на widget OpenGL. Как мне показалось, скорость все равно недостаточна. 
А при выводе растровых изображений даже меньше.
Насколько я понял, преимущество OpenGL проявляется если заранее создать объекты текстур, фигур на сервере OpenGL. А затем много раз обращаться к ним для отрисовки. Но поскольку размер SVG файла огромен, я не уверен, возможно ли все фигуры и растровые картинки из него заранее отправить в пямять OpenGL. Возможно ли вообще использование OpenGL в такой ситуациции?


Автор: kamre 31.3.2009, 17:28
Цитата(sh0375 @ 31.3.2009,  16:05)
есть огромные SVG файлы, полученные экспортом из Adobe Illustrator, размером в сотни мегабайт. 

Интересно, а в какой-нибудь программе такие SVG файлы нормально показываются? Браузерами Opera/FireFox? Adobe SVG Viewer? Inkscape? Batik?

Автор: sh0375 1.4.2009, 07:44
Сам Adobe Illustrator показывает на порядок быстрее, чем моя программа.
Долго открывает файл, но при скроллинге изображения отрисовка идет быстро.
Мне кажется что он даже не использует OpenGL.

Автор: Alexeis 1.4.2009, 09:36
  Ну svg это векторная графика, тут нужно смотреть скорее в сторону Corel Draw. Открывает он их точно, не знаю насколько быстро.

Автор: kamre 1.4.2009, 16:53
Цитата(sh0375 @ 1.4.2009,  07:44)
Сам Adobe Illustrator показывает на порядок быстрее, чем моя программа.
Долго открывает файл, но при скроллинге изображения отрисовка идет быстро.
Мне кажется что он даже не использует OpenGL.

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

Интересно как раз то, как другие программы этот экспортированный svg умеют показывать. Тот же Adobe SVG Viewer.

Автор: baldina 1.4.2009, 17:46
Цитата

огромные SVG файлы, полученные экспортом из Adobe Illustrator, размером в сотни мегабайт. 


Цитата

Adobe Illustrator показывает на порядок быстрее


идеи:
- при отрисовке кадра не надо отдавать opengl всё. только то, что однозначно видно, и видно достаточно хорошо (не слишком мелкое)
- такой большой файл неплохо бы проиндексировать (K-d деревья), что позволит быстро определять, попадает ли объект в зону видимости
- смысл в использовании opengl только в преобразованиях координат и растеризации полигонов, которые могут производиться аппаратно
- использование дисплейных списков opengl в данном случае думаю не ускорит, а может и замедлит процесс. а вот использование glVertexPointer может сказаться положительно

Добавлено через 6 минут и 15 секунд
кстати если перевести его в двоичный формат (попутно и проиндексировать) сотни мегабайт наверняка превратятся в десятки, а мож и меньше...

Автор: sh0375 2.4.2009, 13:31
А можно каким-либо образом часть изображения (например векторные пути) выводить с использованием OpenGL, а часть (растровые изображения) - стандартными средствами QT?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)