- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在超声机上安装了一个 WPF 应用程序,它以每秒 30 帧以上的速度显示用 C++ 生成的超声图像。
据我了解,在 WPF 中显示图像的正常过程是为您的图像创建一个 BitmapSource 并为您的图像设置 Source,然后使其失效并显示。
由于 BitmapSources 没有实现 IDisposable,使用这种方法迫使我每秒创建 30 个 BitmapSources。对于 32bppArgb 格式的 640x480 图像,每秒分配大约 30MB/秒的内存,然后每 10 秒处理一次垃圾,导致明显的延迟。显然不是可接受的解决方案。
我目前的解决方案是:
在 C++ 中: 我在托管 C++ 中创建一个 System.Drawing.Bitmap(WinForms 位图),从指针执行 memcpy 以填充图片,使用 Graphics 对象做一些额外的绘图我需要,并在 ImageReceived 事件期间将其传递到 C#/WPF。
在 C# 中 Image.Source 设置为由 BitmapBuffer 生成的源,这是一种访问位图源原始数据的 hack 方式:参见 this link.我执行 CopyMemory 的 P/Invoke 以将数据从 Bitmap.Scan0 复制到 BitmapBuffer 中。然后我使 Image 无效以更新屏幕,并 Dispose() Drawing.Bitmap 对象以释放内存。
虽然这种方法已经奏效了一段时间,但它看起来很老套,我很难相信除了通过反射(reflection)之外没有其他“合适”的方法来做到这一点。
问题:有没有更好的办法?
最佳答案
如果您使用的是最新的 WPF 位,请查看 WriteableBitmap ,你将不得不做更多的腿部工作,但你会真正快速更新。
快速谷歌一下,您会得到一些示例。
关于c# - 如何在不分配大量内存的情况下显示快速更新的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812288/
我是一名优秀的程序员,十分优秀!