我有一个Delphi 6应用程序,它接收并处理来自外部摄像头的图像流。我在后台线程上有代码,因为它很重,我不希望它干扰在主线程上运行的用户界面代码。我想用我从相机的JPEG帧创建的TBitmaps更新表格或框架上的矩形区域,这些JPEG帧以每秒25帧的速度接收。
我想知道哪种方法可以为我提供最佳性能以及Windows API调用或Delphi调用它来执行此操作。我猜我不应该使用TImage或TPicture或类似的VCL组件,因为它们在主线程上运行,我很确定尝试通过Synchronize()调用完成任何事情将会效率低下并且可能会变慢涉及的线程。我还想要一种提供平滑视频显示的技术,如双缓冲控制,没有任何“条纹”效果。此外,任何有关正确的Canvas锁定或设备上下文管理等的提示都将受到赞赏,尤其是避免在释放资源时常见错误的提示。
当然,链接到一个很好的代码示例,可以完成我需要的工作。
答案 0 :(得分:3)
如果您只在画布上工作,AFAIK TBitmap
是线程安全的。如果您发送GDI消息并需要刷新屏幕,则需要Synchronize
,但是从我的实验中,使用TBitmap.Canvas
只是线程安全的Windows API的包装器。如果您使用像素算术处理位图(使用例如Scanline
),每个线程一个唯一的位图,您可以在后台执行。
但我怀疑使用TBitmap
并不是最有效的方法。试试http://graphics32.org或http://aggpas.org,这是处理位图的快捷方式。
如果你能够像imajoosy提出的那样,处理输入流的最佳方法是使用直接的X流处理能力。
对于线程安全的进程,如果每个线程即将消耗其核心的100%(这很可能是图像处理),通常假设您应该更好地为您的处理创建NumberOfCPU-1线程。例如,您可以创建一个线程池,然后让那些线程使用输入流中的位图。