【发布时间】:2015-08-23 23:50:57
【问题描述】:
我需要在Image 组件上以 30Hz 的频率绘制图像。
我使用此代码:
public MainWindow()
{
InitializeComponent();
Messenger.Default.Register<Bitmap>(this, (bmp) =>
{
ImageTarget.Dispatcher.BeginInvoke((Action)(() =>
{
var hBitmap = bmp.GetHbitmap();
var drawable = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
DeleteObject(hBitmap);
ImageTarget.Source = drawable;
}));
});
}
问题是,使用这段代码,我的 CPU 使用率大约是 80%,如果没有转换,大约是 6%。
那么为什么转换位图这么长呢?
有没有更快的方法(使用不安全的代码)?
【问题讨论】:
-
没有转换显示什么?不显示任何位图时 CPU 消耗约为 6%?
-
是的,相机发送带有新帧的事件,但没有转换,也没有任何显示。
-
那么你怎么知道不是所有的 80% 的 CPU 消耗都只是用于每秒显示 30 个 BitmapSource,而转换完全不需要时间?
-
你可能是对的,我测试了 whitout 显示(但保持转换),它的使用率约为 40%。 (这很正常,但有点高)。之后,我添加了一个 GC.Collect();在 ImageTarget.Source = drawable 之后;我的 CPU 使用率约为 45%。所以 80% 可能是内存泄漏。
标签: c# wpf bitmap copy bitmapsource