LINUX.ORG.RU

Графика на встроенной видеокарте


0

1

Добрый день! Пишу gtk-шное приложение под Ubuntu 10.10, в котором необходима визуализация данных. Процессор - Intel Core(TM)2 Duo L9400 1,86 GHz Видеокарта - Intel® GMA X4500 integrated in Intel® GS45 ОЗУ - 1.85 ГБ Размеры области вывода 1024x1024 пикселей. Использую OpenGL. Пробовал разные способы отрисовки (треугольники, точки, массивы точек, VBO, текстуры) и остановился на glDrawPixel(). Приемлемая скорость отрисовки... Но хотелось бы лучше) Подскажите, есть ли какие-либо другие, более быстрые методы? Может быть и не OpenGL-ые... Заранее спасибо!

точнее - как в опенгл так и в sdl ты могеш сделать типа текстуры - 1,3,4 байта на пиксель как удобно
которая просто лежит в памяти - и рисовать в ней простым обрашением к памяти
и когда нужно - пересылать ее на рисование в видеокарту

для оптимизации можно ее разбить на несколько областей - и после рисование пересылать на видеокарту только измененные области ...
типа 16x16 квадратов

ae1234 ★★
()

лучше бы ты показал какие данные и как визуализируешь

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

просто точки рисовать ? man sdl ?

Да, точки. Пробовал SDL давно, но тогда не получилось откомпилить старый пример интеграции SDL в GTK. Попробую еще..

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

пересылать на видеокарту только измененные области

Т.е. видеокарта может постоянно отображать однажды отправленные ей на отрисовку объекты(те области, которые не меняются) при постоянном очищении цветового буфера? Как это делается?

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

что такое цветовой буфер слабо се представляю
в опенгл есть glMapBuffer glUnmapBuffer - они маппируют содиржимое бкффера в память твоего процесса - а в буффере текстура
правдо сомневаюсь что - у простеньких 3д карт их драйвера реально делают mmap из памяти видеокарты в память юзерского процесса - но все может быть ...

ну если на gtk - то есть какиенить элементы - которые позволяют отображать рисунки
так то и заюзай - сделай рисунок в памяти и рисуй в нем

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

если цветовой буффер ты имееш в виду экран сам - то зачем его очищать когда там и так отображена только одна текстура ? или 16 на 16 текстуток

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

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

Vitaly1988
() автор топика

> визуализация данных

OpenGL


не слишком ли жирно для точечек гонять GL?
ради чего такие навороты?

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

вывод радиолокационного изображения. 3D необязательно, но необходима возможность рисовать в нескольких слоях с прозрачностью. Что посоветуете?

Vitaly1988
() автор топика

Какие примитивы надо выводить - какие данные поступаеют? Точки, линии и т.д.? Отрисовка пикселей - отчасти ресурсоёмкое занятие. Однако если все-же нужны именно пиксели - то ОпенЖЛ - наилучший вариант, имхо, т.к. наибыстрейший. Какая скорость поступления данных, сколько кадров в секунду надо. Какие площади надо перерисовывать каждый кадр?

rip86oz
()
Ответ на: комментарий от pseudo-cat

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

а еще лучше квадраты

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

В основном точки + несколько линий и окружностей. Изображение в виде круга, обновляется последовательно по секторам. Полный оборот - примерно за 1 секунду. Понятно, что скорость отрисовки можно регулировать тупо изменяя размер сектора, но, может быть, есть способы получше?..

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

1) неужели так много чего рисовать нужно что возникает вопрос о скорости ?
2) просто рисовать каждый кадр примитивами X-ов непробовал ?
3) рисовать в обычной памяти а потом каждый кадр копировать эту память в видеокарту ?

если обновляеться по мекторам - то можно сделать колво текстур равное колву секторов - и уже рисовать только по одной
без очистки экрана

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

та не, просто если автору надо рисовать какие-то объекты, а не просто точки, то треугольниками ведь эффективней

pseudo-cat ★★★
()
Ответ на: комментарий от ae1234

>1) неужели так много чего рисовать нужно что возникает вопрос о скорости ? За раз нужно закрасить около миллиона пикселей. За секунду таких разов нужно как минимум 40. Обычная видеокарта справляется, а вот интегрированная Интел - тормозит.

2) просто рисовать каждый кадр примитивами X-ов непробовал ?

Не пробовал. Это с помощью обыкновенной gdk-рисовалки?

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

1024x1024 область - и рисовать надо миллион точек ?

тоесть в переводе на человеческий язык это означает что нужно каждый кадр перерисовывать каждую точку ?

так и задавай int m[1024*1024];
каждый кадр меняй в нем цвета точек - а потом через любой механизм отправляй весь массив на видяху

если же производительности и тут недостаточно будет - то делай треугольную тектуру на каждый сектор - и каждый кадр упдейти на видяху тольько текущий сектор

траффика будет в 40 раз меньше между видяхой и картой - только при условии что стирать ВСЕ небудеш

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

>каждый кадр меняй в нем цвета точек - а потом через любой механизм отправляй весь массив на видяху

Так и делаю в опенГЛ через glDrawPixel, Производительности недостаточно. Стирать приходится из-за других объектов(измерительных линий), которые перемещаются по изображению по произвольному желанию пользователя.

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

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

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

ну и двойной буффер и swap их

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

а если и это неполучиться - то останеться только только разбивание на сектора

а линии - чтобы нестирать все - можно затирать темиже тектурами

(и кстати - если ты полностью рисуеш картинку то стирать старое - ненужно - это только трата времени)

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

Swap уже включен. А насчет распараллеливания потоков - интересно - пока правда не представляю как) Спасибо!

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

а очень просто
2 массиво точек - 2 потока
первый поток рисует в 1 буффере - как нарисовал - посылает сообшение 2ому рисуй первый буффер

2ой поток рисует 1вый буффер - как нарисовал ждет комманды от певого

и так далее
если обработка данных занимет приличное время - то таким образом можно ускорить fps максимум до 2 раз

я такой патчик делал для wine чтоб в world of warcraft распаралелить - и делал он точно это самое
но там сложнее немного
http://bugs.winehq.org/show_bug.cgi?id=11674#c52

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

Сейчас к рабочему компу нет доступа. Вот что выдало на моем ноуте со встроенной gma x3100:

Sync time adjustment is 0.0623 msecs.

 1600 reps @ 3.8969 msec ( 257.0/sec): PutImage 500x500 square
 1600 reps @ 3.9556 msec ( 253.0/sec): PutImage 500x500 square
 1600 reps @ 4.0604 msec ( 246.0/sec): PutImage 500x500 square
 1600 reps @ 3.9586 msec ( 253.0/sec): PutImage 500x500 square
 1600 reps @ 3.8809 msec ( 258.0/sec): PutImage 500x500 square
 8000 trep @ 3.9505 msec ( 253.0/sec): PutImage 500x500 square 

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

Я не знаю качество Intel-драйверов, на форумах жалуются. Поэтому и предполагаю, что на Windows может быть на 2% быстрее.

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