我的数据结构有两个字段:
* BackgroundImage (of type Bitmap/Image)
* Points (of type Point2D [])
我的用例如下:用户可以将图像加载到应用程序中。图像出现在用户屏幕上后,他们可能会(通过单击鼠标按钮)为其添加点。这些点应该在图像的顶部可视化,但如果需要,用户应该能够重新定位它们(例如拖动)。
目前,每当用户添加/移动点时,我都会执行以下操作来解决问题:*克隆BackgroundImage*绘制克隆图像上的所有点(使用System.Drawing.Graphics)*返回带有点的克隆图像(将其作为属性公开并绑定到WPF中的image)。
这个解决方案的时间性能还可以,但它消耗了很多内存,因为每次我都会复制整个图像。我想知道是否有更好的方法可以做到这一点(例如,通过使用层——然后我的BackgroundImage一直保持不变,而我只修改顶层)。
我的代码很长,但如果需要,请告诉我,我会发布它。
当谈到内存消耗时,只要您确保映像的旧实例不再是根实例,以便GC可以删除它们,您所描述的方法就没有错。
但是,在修改克隆映像的时间段内,内存占用率当然可能是不进行克隆时可能的最低值的两倍。为了减少这种内存消耗,可以使用UIElements来实现可移动点。这也可以通过对">drag'n'drop"部分使用WPF hittesting来帮助保持实现更简单。由于UIElements比BitmapImage中的点需要更多的内存,因此实际节省的内存取决于BitmapImage的点与可移动点的比例。
要使用UIElements实现点,请将BitmapImage与Canvas一起放置在面板中。然后使用Canvas作为点的容器,并使用附加的属性Canvas.Top
和Canvas.Left
设置它们的位置。若要使点显示在BitmapImage前面,请设置画布的Panel.ZIndex
。
但是,如果您看到不合理的内存消耗,您应该使用内存探查器来仔细查看Process的哪些部分实际占用了空间。