Показывать большие изображения с помощью DirectX быстрее? - PullRequest
3 голосов
/ 02 апреля 2009

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

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

Выполнение этого на процессоре (GDI и т. Д.) Значительно снижает производительность. Например, у нас уходит 0,2 секунды на анализ изображения, но на 0,8 секунды, чтобы показать его с одним зумом (с измененным размером, чтобы соответствовать некоторому элементу управления), не говоря уже о том, чтобы пользователь мог двигаться дальше и погрузиться в него.

Поскольку Photoshop позволяет отображать и масштабировать с помощью очень быстрой памяти и обработки графической карты, я подумал, может ли кто-нибудь дать мне представление о том, могу ли я и как можно поэкспериментировать с этим в своем собственном коде: перенесите данные на графическую карту (сколько времени это может занять для моих 76 МБ rgb-данных?), и пусть они будут отображаться в каком-либо элементе управления без особых усилий, чтобы увеличить и переместить их пользователем на элемент управления / карту для взаимодействия с пользователем.

Нет необходимости в 3D-взглядах, просто перемещайте и изменяйте размеры в 2D-rgb-изображении. Цель состоит в том, чтобы обеспечить быстрый и удобный просмотр с низкой загрузкой процессора.

==> Возможно ли это (как текстура или что-то подобное)? ==> Существуют ли ограничения для современных бюджетных 3D-карт размером> = 256 МБ? ==> Может ли кто-нибудь подсказать, какую длительность ожидать (копирование данных, масштабирование)?

Ответы [ 4 ]

2 голосов
/ 02 апреля 2009

Вы будете ограничены максимальным размером текстуры (который зависит от карты к карте), поэтому вам придется разделить ваше большое изображение на несколько текстур меньшего размера. Получение фактических данных текстуры в видеопамять должно быть достаточно быстрым, если карта AGP или PCI-E.

1 голос
/ 02 апреля 2009

Что такое формат пикселей? Кажется, что ваш размер размера работает с этим 8-битным RGB, для одного изображения с разрешением 6000x4000 пикселей потребуется примерно 69 МБ свободного места. Поэтому он должен умещаться в текстурной памяти видеокарты более низкого уровня, если учесть, что Windows и другие приложения не слишком загружены Конечно, загрузка видео в память видеокарты займет некоторое время; хотя трудно дать оценку, поскольку она, скорее всего, будет зависеть от загрузки системы и, конечно, от конфигурации оборудования / шины.

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

Настройка DirectX для проверки этого не должна быть слишком сложной, существует множество учебных пособий. Здесь - быстрая ссылка, показывающая, как выполнять рендеринг с текстурой; Изучите предыдущие части этой же серии руководств, чтобы узнать, как инициализировать материал.

0 голосов
/ 20 июля 2009

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

Из-за размера ваших изображений и размера экрана (у вас нет дисплея 6Kx4K, не так ли?), Вы захотите создать систему для разбиения большого изображения на текстуры по требованию. Учитывая размер ваших входных данных, я думаю, вы обнаружите, что доминирующим фактором в том, как быстро вы можете загружать данные на карту, является пропускная способность ввода-вывода между диском и картой. Вы можете обнаружить, что стоит создать способ хранения изображений на диске, который использует пространственную когерентность в двух измерениях (то есть компоновку хранилища с мозаичной структурой, а не схему хранения со сканирующей линией), а также вычисление версий с более низким разрешением с точечной выборкой. Вы можете сделать все это самостоятельно с несжатым RGB, для этого вам не нужен JPEG2000. Вы можете сделать это хранение данных как фоновый процесс с низким приоритетом, как только они выберут изображение. Сначала получите то, что будет видно на экране, как можно скорее, а затем начните реорганизацию на диске для более быстрой потоковой передачи / масштабирования.

0 голосов
/ 02 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...