C# 基于平铺的地图编辑器:滚动:生成新图像时会将应用程序锁定一段时间

C# 基于平铺的地图编辑器:滚动:生成新图像时会将应用程序锁定一段时间,c#,wpf,performance,image,C#,Wpf,Performance,Image,我目前正在开发一个基于平铺的地图编辑器,专注于让滚动按我想要的方式工作。这就是我遇到麻烦的地方。滚动时,会生成图像,以便在滚动时显示新内容。在新的一方生成大约200个图像System.Windows.Controls.Image之前,这一切都很正常。简单的映射,并不复杂 如果你滚动得更快,大约1000张图片或更多。。如果生成,应用程序将挂起一段时间,这取决于您滚动的速度等 临时挂起的原因总是由这条线引起的。删除这一行完全消除了滞后,但显然不会得到想要的结果: img.Source = it.Ge

我目前正在开发一个基于平铺的地图编辑器,专注于让滚动按我想要的方式工作。这就是我遇到麻烦的地方。滚动时,会生成图像,以便在滚动时显示新内容。在新的一方生成大约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

调用线程无法访问该对象,因为不同的线程拥有它

我可以试试什么

请记住,我在最近开始的WPF方面并不先进,而且我对ImageSource几乎一无所知

谢谢


~Tgys

而不是使用System.Drawing.Bitmap创建图像源。如果必须在位图中绘制复杂的图形,则必须在a中绘制,并将该图形渲染为


在单独的线程中创建ImageSource对象时,必须先调用它们的方法,然后才能在UI中使用它们。

我正在使用大量System.Windows.Controls.Image实例绘制整个场景,而不是绘制到单个位图中。使用的位图是静态的。我不确定是我误解了你还是你误解了我..我是说你根本不应该像在ToImgSource中那样使用System.Drawing.Bitmap,因为这不是WPF,需要一些GDI互操作。我明白了,但这会导致延迟吗?因为ToImgSource只调用一次以生成ImageSource,而不是每次添加新图像时都再次调用。无论如何,我将首先尝试WriteableBitmap….:]啊,我明白了。您可能会遵循冻结图像的多线程方法;