Рендеринг графика с использованием 3D-ускорения - PullRequest
8 голосов
/ 21 октября 2008

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

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

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

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

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

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

Ответы [ 12 ]

0 голосов
/ 21 октября 2008

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

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

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

0 голосов
/ 21 октября 2008

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

...