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 для в один файл включить в проект.
надеюсь, что это поможет!