Почему Microsoft не меняет реализацию SetPixel () на более быструю реализацию? - PullRequest
2 голосов
/ 08 ноября 2010

У меня есть вопрос по поводу класса Bitmap.Если вы хотите установить много пикселей на растровом изображении, то вы можете использовать метод SetPixel, но он очень медленный.Существует много документации о том, как вы можете ускорить его с помощью LockBits методов и т. Д., Поэтому я создал метод: SetFastPixel, чтобы немного ускорить его.

Однако, и я 'Это меня очень смущает: Почему Microsoft не меняет реализацию SetPixel () на более быструю реализацию? Другими словами, есть ли преимущество в использовании SetPixel вместо LockBits метода

Ответы [ 6 ]

6 голосов
/ 08 ноября 2010

Случаи, когда SetFastPixel, вероятно, не работает:

  • Монохромные устройства (восемь пикселей, упакованные в один байт)
  • Планарные устройства (16-цветные VGA-карты имеют странную структуру памяти и требуют аппаратной помощи)
  • Устройства с индексированной палитрой (SetPixel обрабатывает отображение индекса RGB на палитру)
  • Принтеры (я не знаю, как это будет работать через LockBits)
  • Конфигурации с несколькими мониторами, где каждая карта имеет свой формат пикселей

SetPixel предназначен для обработки всего вышеперечисленного за счет медлительности. Если вы готовы пожертвовать некоторыми из вышеперечисленных пунктов или с удовольствием справитесь с ними в своем приложении, у вас есть возможность рисовать изображения с помощью LockBits.

4 голосов
/ 08 ноября 2010

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

Растровое изображение может, например, храниться в памяти правой стороной вверх или вверх, с добавлением или без заполнения между строками, с большим количеством разного числа бит на пиксель.

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

1 голос
/ 08 ноября 2010

Direct3D был создан именно для этой цели. Несмотря на его название, все еще возможно делать необработанные 2D пиксельные манипуляции. Вообще говоря, вы делаете это как:

  • Создание контекста Direct3D и устройства
  • Создание внеэкранной поверхности
  • Блокировка внеэкранной поверхности, рендеринг в буфер отображения, разблокировка
  • Копировать внеэкранный буфер на устройство.

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

1 голос
/ 08 ноября 2010

Вызов метода для установки одного пикселя по сути медленный, независимо от того, как вы его реализуете, потому что для каждого вызова вы должны вычислять и проверять индексы, конвертировать формат пикселей и т. Д.

0 голосов
/ 08 ноября 2010

Классы в System.Drawing представляют собой лишь тонкий слой над классами C ++, используемыми в GDI + .Microsoft не собиралась выставлять общий интерфейс (System.Drawing & GDI +) и иметь два класса, которые должны работать по-разному.

0 голосов
/ 08 ноября 2010

Им все равно, потому что большинство людей так не используют.C # обычно не используется для рендеринга видео - и если вам нужны такие вещи, есть более быстрые альтернативы.

...