Небезопасный C # и указатели для 2D-рендеринга, хорошо или плохо? - PullRequest
4 голосов
/ 11 сентября 2008

Я пишу элемент управления C #, который упаковывает DirectX 9 и предоставляет упрощенный интерфейс для выполнения 2D-рисования на уровне пикселей. .NET требует, чтобы я обернул этот код в небезопасный блок кода и скомпилировал с параметром разрешить небезопасный код.

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

Является ли это самым быстрым способом манипулирования отдельными пикселями в приложении C # .NET? Есть ли лучший, более безопасный способ? Если бы был такой же быстрый подход, который не требовал манипулирования указателем, я бы предпочел использовать это.

(я знаю, что это 2008 год, и мы все должны использовать DirectX 3D, OpenGL и т. Д., Однако этот элемент управления должен использоваться исключительно для 2D-рендеринга пикселей и просто не требует 3D-рендеринга.)

Ответы [ 4 ]

4 голосов
/ 14 сентября 2008

Использование небезопасных указателей - это самый быстрый способ прямого манипулирования памятью в C # (определенно быстрее, чем при использовании функций-обёрток Marshal).

Просто из любопытства, какие операции 2D-рисования вы пытаетесь выполнить?

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

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

Оставаясь на земле .NET, одна альтернатива заключается в том, чтобы сохранить объект Bitmap для использования в качестве вашей поверхности, используя LockBits и прямой доступ к пикселям через небезопасный указатель в возвращенном объекте BitmapData.

3 голосов
/ 18 декабря 2008

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

Кроме того, проверьте DirectDraw . Это 2D графический компонент DirectX. Это действительно быстро.

3 голосов
/ 25 сентября 2008

Да, это, вероятно, самый быстрый способ.

Несколько лет назад мне пришлось сравнивать два изображения 1024x1024 на уровне пикселей; методы get-pixel заняли 2 минуты, а небезопасное сканирование - 0,01 секунды.

1 голос
/ 11 сентября 2008

Недавно мне было поручено создать простой элемент управления гистограммой для одного из наших приложений для тонких клиентов (C #). Изображения, которые я анализировал, были размером 1200х1200, и мне пришлось идти по тому же маршруту. Я мог заставить вещь нарисовать себя один раз без проблем, но контроль должен был быть изменен. Я пытался избежать этого, но мне пришлось обращаться к самой необработанной памяти.

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

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