Рисование множества объектов на экране - PullRequest
0 голосов
/ 27 февраля 2011

Я работаю над проектом, в котором нам необходимо обобщить значительный объем данных в виде тепловой карты.Эти данные будут храниться в базе данных как можно дольше.В какой-то момент нам нужно будет сохранить сводку в матрице (возможно?), Прежде чем мы сможем нарисовать блоки для тепловой карты на экране.Мы создаем приложение формы Windows с C #.

Давайте предположим, что тепловая карта объединяет файл журнала для онлайн-картографической программы, такой как Google Maps.Он назначит цвет конкретному адресу или региону в зависимости от того, сколько раз был сделан запрос к этому региону / адресу.Он может суммировать данные на разных уровнях детализации.То есть каждый блок на тепловой карте может суммировать данные для определенного адреса (макс. Детализация, следовательно, миллиарды / миллионы блоков) или он может суммировать запросы к улице, городу или стране (минимальная детализация - несколько блоков, поскольку оникаждый представляет страну).Представьте, что миллионы запросов были сделаны для адресов.Мы рассмотрели обобщение этого с помощью базы данных.Проблема в том, что нам нужно нарисовать на экране столько блоков (до миллиардов, но обычно гораздо меньше).Давайте предположим, что эти данные сведены в таблицу базы данных, в которой хранится количество попаданий в более крупные регионы.Можем ли мы нарисовать блоки в окне, не создавая объект для каждого региона или даже не вводя всю информацию из таблицы БД?Это моя главная задача, потому что если бы мы построили матрицу, для требовательного запроса это могло бы составить около 10 ГБ.

Мне интересно знать, сколько блоков мы можем нарисовать на экране и каков наилучший подходк этому может быть (то есть direct3d, XNA).Сверху вы можете видеть, что диапазон будет существенно различаться, и мы ожидаем, что потенциал будет составлять миллиарды квадратов.У нас будет вертикальная полоса прокрутки для быстрой прокрутки вниз, чтобы увидеть другие блоки.

В общем, мне интересно, как мы могли бы сделать это с C #?Создание матрицы для требовательного запроса может потребовать около 10 гигабайт.Есть ли способ рисования на экране, который не потребует значительного объема памяти (т.е. создание объекта для каждого блока).Если бы мы могли преобразовать результаты запроса SQL непосредственно в визуализированные блоки на экране, это было бы идеально (то есть не создание объектов и т. Д. И т. Д.).Все, что нам нужно, это квадраты, и их единственным свойством является цвет, и нам может потребоваться сохранить число для каждого блока.

Примечание. Мы довольно уверены в том, как будем рисовать тепловую карту (как масштабирование, прокрутка и т. Д.).должен появиться пользователю).Чтобы уточнить, я больше обеспокоен тем, как мы будем реализовывать нашу идею.Есть ли библиотека или какой-то метод, который позволяет нам рисовать столько объектов, не создавая миллиард объектов и не используя гигабайты данных.Каждый блок представляет собой группу пикселей (20х20), которые имеют один и тот же цвет.Я не верю, что для этого нужно построить 1 миллиард объектов.

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Если это действительно графическая тепловая карта, то я согласен с комментариями о том, что изображение с шириной экрана не менее 780 ноутбуков нецелесообразно. Если у вас есть эта информация в базе данных SQL (?), То вы можете выполнить необычный запрос, который разбивает ваши результаты на сегменты определенной ширины. База данных должна иметь возможность эффективно объединять эти записи в 1680 (по ширине пикселей) сегментов.

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

Если вам НУЖНО увидеть изображение 1: 1, вы можете рассмотреть только отрисовку части изображения, на которую вы прокручиваете. Это значительно уменьшит объем памяти, необходимый для хранения текущего представления. Предполагая, что вам на самом деле не нужно просматривать все данные на 780 экранах на 100% (особенно, если вы объедините это со стратегией «просмотра больших изображений» выше), вы сэкономите на обработке.

Агрегатная функция для «просмотра большого изображения» может быть MAX, SUM, AVG. Если эти функции не подходят, пожалуйста, объясните больше о конкретных функциях, которые вы ищете в тепловой карте.

Что касается самого чертежа, вам не нужны "объекты" для каждого блока, вам просто нужно нарисовать пиксели на графическом объекте.

0 голосов
/ 27 февраля 2011

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

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

...