| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Интересно, а в какой-нибудь программе такие 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 | ||
Ну так не зря же за него просят столько денег, там уж наверняка постарались, чтобы все работало как можно быстрее. Наверняка он все переводит в свой внутренний формат данных, а не работает с чистым svg. Вот этот внутренний формат у него и оптимизирован для быстрой отрисовки частей и скролинга. Интересно как раз то, как другие программы этот экспортированный svg умеют показывать. Тот же Adobe SVG Viewer. |
| Автор: baldina 1.4.2009, 17:46 | ||||
идеи: - при отрисовке кадра не надо отдавать opengl всё. только то, что однозначно видно, и видно достаточно хорошо (не слишком мелкое) - такой большой файл неплохо бы проиндексировать (K-d деревья), что позволит быстро определять, попадает ли объект в зону видимости - смысл в использовании opengl только в преобразованиях координат и растеризации полигонов, которые могут производиться аппаратно - использование дисплейных списков opengl в данном случае думаю не ускорит, а может и замедлит процесс. а вот использование glVertexPointer может сказаться положительно Добавлено через 6 минут и 15 секунд кстати если перевести его в двоичный формат (попутно и проиндексировать) сотни мегабайт наверняка превратятся в десятки, а мож и меньше... |
| Автор: sh0375 2.4.2009, 13:31 |
| А можно каким-либо образом часть изображения (например векторные пути) выводить с использованием OpenGL, а часть (растровые изображения) - стандартными средствами QT? |