基于切片的地图编辑器:滚动:在这样做的同时生成新图像会将应用程序锁定一段时间



我目前正在开发一个基于瓦片的地图编辑器,专注于让滚动按我想要的方式工作。这就是我遇到一些麻烦的地方。滚动时,会生成图像,以便在滚动时显示新内容。这可以很好地工作,直到在新的一侧生成大约200个图像(System.Windows.Controls.Image)(简单的映射,不复杂)。

每当侧面生成大约1000个图像(或者如果你滚动得更快,会有更多)时,应用程序就会挂起一段时间,这取决于你滚动的速度等。

这个暂时挂断的原因总是由这条线路引起的。删除这一行完全消除了"滞后"(但显然没有给出想要的结果):

img.Source = it.GetFullSpriteSource(0);

该方法生成一个ImageSource,或者如果已经生成,则返回存储在变量中的ImageSource。问题不在于这种方法,因为下面的场景给出了相同的问题。

public static ImageSource yellowimg;
[...]
System.Drawing.Bitmap derp = new System.Drawing.Bitmap(32, 32);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(derp))
    g.FillRectangle(System.Drawing.Brushes.Yellow, 0, 0, 32, 32);
yellowimg = Utilities.ToImgSource(derp);
[...]
img.Source = yellowimg;

因此的问题可能在于我分配了ImageSource。

我正在从这样的位图生成一个ImageSource,可能是相关的:

public static ImageSource ToImgSource(Bitmap bitmap)
{
    return Imaging.CreateBitmapSourceFromHBitmap(
      bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
      BitmapSizeOptions.FromEmptyOptions());
}

我也尝试过在单独的线程中生成(后台生成),但这导致了以下错误,试图从另一个线程读取ImageSource。

The calling thread cannot access the object because different thread owns it


我可以尝试什么?

请记住,我对WPF(最近开始)并不了解,而且我对ImageSource几乎一无所知。

谢谢,

~ Tgys

与其从System.Drawing.Bitmap创建ImageSource,不如使用WriteableBitmap。如果必须将复杂的绘图绘制到位图中,则必须绘制到DrawingVisual的DrawingContext中,并将该DrawingVisual渲染到RenderTargetBitmap,中

在单独的线程中创建ImageSource对象时,在UI中使用它们之前,必须调用它们的Freeze方法。

最新更新