C# быстрый рендеринг пикселей

Я разрабатываю приложения глубинной обработки (Xbox Kinect, Asus Xtion и т. д.) с использованием OpenNI.

Мне нужен очень простой и быстрый способ рисования в форме Windows, когда новые данные глубины доступны с датчика (30 или 60 fps в зависимости от разрешения).

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

3 ответов


Если вы используете растровые изображения, то вы должны использовать LockBits и UnlockBits для доступа к данным непосредственно в памяти. В C# вы можете получить дополнительную производительность, используя небезопасные блоки кода и указатели.

см. эту ссылку для получения дополнительной информации: http://web.archive.org/web/20150227183132/http://bobpowell.net/lockingbits.aspx


image.SetPixel() очень медленно, когда вы заменяете много пикселей за кадр и вам нужно много кадров в секунду.

Это будет намного быстрее, когда вы используете WriteableBitmap и звонок CopyPixels

таким образом, вы можете заполнить массив пиксельными данными с помощью нескольких потоков и просто blit массив к изображению в одном вызове.

редактировать

обратите внимание, что WriteableBitmap является классом WPF. Если вы связаны для WinForms вам может потребоваться создать собственную реализацию. взаимодействие WPF/WinForms/GDI: преобразование WriteableBitmap в систему.Рисунок.Изображение?


вы можете попробовать мой библиотека обработки изображений LINQ для работы с "буфером-рисунки". Он использует очень доступный синтаксис, но очень эффективен для больших растровых изображений. Он доступен на NuGet для в один файл включить в проект.

надеюсь, что это поможет!