2013-04-10 5 views
0

У меня есть процесс, который накапливает в основном статические данные с течением времени - и многие из них - миллионы элементов данных. Возможно, что небольшие части данных могут время от времени меняться, но в основном они не меняются.Оптимизация визуализации данных на графическом процессоре?

Однако я хочу разрешить пользователю изменять способ просмотра этих данных как по форме, так и по цвету.

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

Так, например, может быть, есть следующие данные:

[1000, 602, 1, 1] [1003, 602,5, 2, 2]

Примечание: данные не Вершины , а скорее может потребовать, чтобы некоторые вычисления или поиск были преобразованы в вершины.

Пользователь может выбирать между алгоритмами визуализации. Предположим, каждый из них будет отображать по 2 куба в каждом (0, 602, 0) и (3, 602,5, 100). Пользователь выбирает этот цветный идентификатор 1 = синий и 2 = зеленый. Таким образом, куб начала показан как синий, а другой - зеленый.

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

Еще одна визуализация может показать линии между всеми элементами данных или прямоугольника для каждого набора 4 и т.д.

ли приведенное выше описание кое-что может быть сделано прямым путем? Как это лучше всего сделать?

Обратите внимание, что мы будем добавлять новые данные, добавляя к концу, много. Вероятно, разрывы тысяч в секунду. Модификации существующих данных будут более редкими, и приемлемый удар по этим случаям будет приемлемым. Алгоритм смены пользователей и цветовое сопоставление будут относительно редкими.

Я бы предпочел сделать это, используя API кросс-платформы (через OS и GPU), поэтому я предполагаю OpenGL.

ответ

1

Вы можете хранить свои данные в VBO (в памяти GPU) и обновлять его при его изменении.

На стороне графического процессора вы можете использовать геометрический шейдер для генерации большей геометрии. Не знаете, как переключиться с линии на куб на сферу, но если вы рисуете треугольник в каждом месте, ваш GS может выводить «лишние» треугольники (то же самое для линий и точек).

Что касается функции изменения цвета, вы можете испечь эту логику в вершинном шейдере. Икс (1, 2, ...) должен быть атрибутом вершины; попросите VS просмотреть таблицу, дающую idx -> сопоставления цветов (это может быть сохранено как небольшая текстура). Вы можете обновить текстуру, чтобы изменить цветное отображение на лету.

+0

Спасибо! Есть ли способ оптимизировать добавление к VBO? Так как я могу добавлять данные очень быстро к ним время от времени. Кроме того, в геометрическом шейдере у него есть доступ к более чем одной точке за раз, чтобы он мог создать одну форму для каждой точки в одном случае, но в других случаях она создавала бы одну форму на несколько точек? – mentics

+0

'glBindBuffer' принимает параметр * target * (который подсказывает, будет ли этот VBO содержать вершинные или индексные данные). 'glBufferData' принимает параметр * use * (который указывает, являются ли данные статическими, динамическими или потоковыми, и будет ли приложение читать, копировать или рисовать). –

+0

Кроме того, какая точная комбинация подсказок даст ** вам ** наилучшая производительность может быть обнаружена только путем профилирования. Это действительно сводится к версии вашего оборудования + OpenGL. –

0

Для приложений, подобных вашим, существуют специальные инфраструктуры программирования GPGPU: CUDA и OpenCL. OpenCL - это перекрестная система поставщиков. CUDA является кроссплатформенным, но поддерживает только графические процессоры NVidia. Кроме того, OpenGL представил универсальные вычислительные функции в OpenGL-4.2 (вычислительные шейдеры).

и много, миллионы элементов данных

Миллионы не очень много, даже если один элемент потреблял 100 байт, которые будут затем только 100 MiB до трансферта. Современные графические процессоры могут передавать около 10 гигабайт/с из/в системную память хоста.

Является ли приведенное выше описание чем-то, что можно сделать простым способом? Как это лучше всего сделать?

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

Смежные вопросы