Рендеринг графиков с использованием 3D-ускорения

StackOverflow https://stackoverflow.com/questions/219872

  •  03-07-2019
  •  | 
  •  

Вопрос

Мы создаем графики для огромных наборов данных.Мы говорим о 4096 выборках в секунду и 10 минутах на график.Простой расчет дает 4096 * 60 * 10 = 2457600 выборок на линейный график.Каждый сэмпл представляет собой FP двойной (8 байт) точности.Кроме того, мы визуализируем несколько линейных изображений на одном экране, примерно до сотни.Это позволяет нам отображать около 25 миллионов выборок на одном экране.Используя здравый смысл и простые приемы, мы можем добиться производительности этого кода, используя центральный процессор, рисующий это на 2D-холсте.Производительность, то есть время рендеринга падает ниже одной минуты. Поскольку это научные данные, мы не можем опустить ни одной выборки.Серьезно, это не вариант.Даже не начинай думать об этом.

Естественно, мы хотим улучшить время рендеринга, используя все доступные методы.Многоядерность, предварительный рендеринг, кэширование - все это довольно интересно, но не сокращайте это.Мы хотим, чтобы рендеринг с этими наборами данных был как минимум 30 кадров в секунду, предпочтительнее 60 кадров в секунду.У нас сейчас это амбициозная цель.

Естественным способом разгрузить рендеринг графики является использование графического процессора системы.Графические процессоры созданы для работы с огромными наборами данных и параллельной их обработки.Несколько простых тестов HelloWorld показали нам разницу в скорости рендеринга днем и ночью с использованием графического процессора.

Теперь проблема в том, что:Графические API, такие как OpenGL, DirectX и XNA, созданы специально для 3D-сцен.Таким образом, использование их для рендеринга 2D линейных изображений возможно, но не идеально.В доказательстве разработанных нами концепций мы столкнулись с тем, что нам нужно преобразовать 2D-мир в 3D-мир.Внезапно нам приходится работать с системой координат XYZ с полигонами, вершинами и многим другим.Это далеко от идеала с точки зрения развития.Код становится нечитаемым, обслуживание превращается в кошмар, и возникает все больше проблем.

Каким было бы ваше предложение или идея по поводу этого в 3D?Является ли единственный способ сделать это, чтобы фактически преобразовать две системы (2D координаты в сравнении с 3D координатами и объектами)?Или есть более изящный способ добиться этого?

-Почему полезно отображать несколько выборок на одном пикселе? Поскольку он лучше представляет набор данных.Допустим, для одного пикселя у вас есть значения 2, 5 и 8.Из-за некоторого алгоритма исключения примера рисуется только 5.Строка будет идти только до 5, а не до 8, следовательно, данные будут искажены.Вы могли бы утверждать и обратное, но дело в том, что первый аргумент имеет значение для наборов данных, с которыми мы работаем.Именно по этой причине мы не можем опустить образцы.

Это было полезно?

Решение

Действительно популярным инструментарием для научной визуализации является ВТК, и я думаю, что это соответствует вашим потребностям:

  1. Это высокоуровневый API, поэтому вам не придется использовать OpenGL (VTK построен поверх OpenGL).Существуют интерфейсы для C ++, Python, Java и Tcl.Я думаю, это позволило бы сохранить вашу кодовую базу довольно чистой.

  2. Вы можете импортировать все виды наборов данных в VTK (существует множество примеров - от медицинских изображений до финансовых данных).

  3. VTK работает довольно быстро, и вы можете распределить графические конвейеры VTK по нескольким машинам, если хотите создавать очень большие визуализации.

  4. Относительно:

    Это позволяет нам отображать около 25 миллионов выборок на одном экране.

    [...]

    Поскольку это научные данные, мы не можем опустить ни одной выборки.Серьезно, это не вариант.Даже не начинай думать об этом.

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

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

Другие советы

Я хотел бы прокомментировать ваше утверждение о том, что вы не можете опускать образцы, в конце ответа tgamblin.

Вы должны думать о данных, которые вы выводите на экран, как о проблеме выборки.Вы говорите о 2,4 млн точек данных, и вы пытаетесь отобразить это на экране, который имеет всего несколько тысяч точек в поперечнике (по крайней мере, я предполагаю, что это так, поскольку вы беспокоитесь о частоте обновления 30 кадров в секунду)

Таким образом, это означает, что для каждого пикселя на оси x вы отрисовываете порядка 1000 точек, которые вам не нужны.Даже если вы пойдете по пути использования вашего графического процессора (например.благодаря использованию opengl) это все еще большая работа, которую графическому процессору необходимо выполнить для строк, которые не будут видны.

Метод, который я использовал для представления образцов данных, заключается в создании набора данных, который является подмножеством всего набора, просто для рендеринга.Для данного пикселя по оси x (т.е.заданная координата экрана по оси x) вам необходимо отобразить абсолютный максимум 4 балла - это минимальный y, максимальный y, крайний левый y и крайний правый y.Это позволит отобразить всю информацию, которая может быть с пользой отображена.Вы по-прежнему можете видеть минимумы и максимумы и сохраняете связь с соседними пикселями.

Имея это в виду, вы можете рассчитать количество выборок, которые попадут в один и тот же пиксель по оси x (думайте о них как о "ячейках" данных).Затем в пределах заданной ячейки вы можете определить конкретные выборки для максимумов, минимумов и т.д.

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

Вы можете сделать это, если используете opengl, но поскольку opengl использует нормализованную систему координат (а вас интересуют экранные координаты реального мира), вам придется немного потрудиться, чтобы точно определить ваши ячейки данных.Это будет проще без использования opengl, но тогда вы не получите всех преимуществ вашего графического оборудования.

Вам действительно не нужно беспокоиться об оси Z, если вы этого не хотите.В OpenGL (например) вы можете указать вершины XY (с неявным Z = 0), включить zbuffer, использовать непроективную проекционную матрицу, и вуаля, вы в 2D.

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

OpenGL имеет ортогональный режим который имеет z-координату внутри (0;1).Перспективной проекции нет, полигоны, которые вы рисуете, будут плоскими по отношению к области обрезки экрана.

DirectX будет иметь аналогичное.В OpenGL это называется gluOrtho2D().

OpenGL с радостью выполнит рендеринг 2D, если вы настроите проекцию как ортогональную (без z).Также вам следует уничтожить свои данные.Рендеринг одного и того же пикселя 1000 раз - это пустая трата графического процессора.Заранее потратьте свое время на создание высокопроизводительного многопоточного дециматора.Обязательно загружайте большие массивы на графический процессор, используя вершинные массивы или объекты вершинного буфера (очевидно, что я сторонник OpenGL)

Это позволяет нам отображать около 25 миллионов выборок на одном экране.

Нет, ты этого не сделаешь, если только у тебя нет действительно, очень большой экран.Учитывая, что разрешение экрана, вероятно, больше похоже на 1000-2000 пикселей в поперечнике, вам действительно следует рассмотреть возможность прореживания данных, прежде чем составлять график.Построение графика из ста строк по 1000 точек на строку, вероятно, не составит большой проблемы с точки зрения производительности.

Если ваш код становится нечитаемым из-за того, что вы имеете дело непосредственно с 3D-материалами, вам нужно написать тонкий слой адаптера, который инкапсулирует все 3D-материалы OpenGL и принимает 2D-данные в форме, удобной для вашего приложения.

Простите меня, если я что-то пропустил, и я проповедую хору основы объектно-ориентированного дизайна.Просто говорю...

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

Большое вам спасибо.Это именно то, что я искал.Похоже, VTK также использует аппаратное обеспечение для разгрузки такого рода рендеринга.Кстати, я полагаю, ты имеешь в виду ценный ;).Во-вторых, пользователь действительно получает информацию из приведенного мной примера.Каким бы кратким ни был обзор полученных данных, он действительно может стать чистым золотом для ученого.Речь идет не об обработке всех данных для пользователя, а о получении ценной информации из рендеринга.Пользователи, похоже, делают это даже в очень "уменьшенном" представлении набора данных.

Еще какие-нибудь предложения?

Я хотел бы отметить, что в дополнение к непосредственному использованию VTK есть два других продукта, построенных на VTK, которые могут вас заинтересовать.

1) практические навыки (paraview.org) - это пользовательский интерфейс построен на вершине ВТК что делает научная визуализация продукции намного проще и легче.Вы можете отображать все данные, которые хотите, при условии, что у вас есть оборудование для их обработки, и оно поддерживает MPI для нескольких процессоров / ядер / кластеров.Он расширяем с помощью созданных пользователем плагинов и использует автоматизированные инструменты для создания и компиляции проекта.

2) ParaViewGeo (paraviewgeo.mirarco.org) в области геологии и недропользования на разведку производное практические навыки производства компании я работаю.Он имеет встроенную поддержку чтения форматов файлов, которых нет в ParaView, таких как Gocad, Datamine, Geosoft, SGems и другие.Что еще более важно, мы часто работаем с другими группами, проявляющими научный интерес, а именно с результатами, слабо связанными с майнингом, такими как наша недавняя работа с группой, занимающейся моделированием методом конечных / дискретных элементов.Возможно, это стоит проверить.

В обоих случаях (PV и PVG) ваши данные рассматриваются отдельно от вашего представления этих данных, и поэтому вы никогда не будете "отображать" все свои данные (поскольку у вас, вероятно, недостаточно большой монитор для этого), но будьте уверены, что все это "будет там", обработанное из вашего набора данных, как вы ожидали.Если вы запустите дополнительные фильтры для своих данных, "визуализироваться" будет только то, что можно увидеть, но фильтры будут вычисляться для ВСЕХ ваших данных, которые, хотя и не все могут быть видны сразу, все будут существовать в памяти.

Если вы ищете цифры, то сегодня я вычислил три обычные сетки из 8 миллионов ячеек в PVG.Один содержал векторное свойство из 7 кортежей (7x8 миллионов двойных значений), два других содержали скалярное свойство (1x8 миллионов двойных значений каждое), в общей сложности 72 миллиона двойных значений в памяти.Я полагаю, что объем памяти был близок к 500 МБ, но у меня также был набор из 400 000 точек, где каждая точка имела векторное свойство из 7 кортежей, а также некоторые другие доступные данные.

Не уверен, что это полезно, но не могли бы вы использовать время в качестве измерения?т. е.один кадр - это один z?Возможно, это прояснило бы ситуацию?Тогда, возможно, вы могли бы эффективно применять дельты для создания (т. е. по оси z) изображения?

Нет, вы этого не сделаете, если только у вас нет действительно большого экрана.Учитывая, что разрешение экрана, вероятно, больше похоже на 1000-2000 пикселей в поперечнике, вам действительно следует рассмотреть возможность прореживания данных, прежде чем составлять график.Построение графика из ста строк по 1000 точек на строку, вероятно, не составит большой проблемы с точки зрения производительности.

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

Во-вторых, мы являются рендеринг всех образцов.Возможно, несколько выборок попадают в один и тот же пиксель.Но, тем не менее, мы это визуализируем.Примерные данные преобразуются на экране.Таким образом, это визуализируется.Можно сомневаться в полезности этих визуализированных данных, но ученые (наши заказчики) на самом деле требуют, чтобы мы делали это именно таким образом.И в их словах есть смысл, ИМХО.

Оберните библиотеку в более мягкую 2D-библиотеку с Z и поворотами, равными 0.

-Адам

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top