C# C语言绘图的代码效率?

C# C语言绘图的代码效率?,c#,compact-framework,C#,Compact Framework,为了了解最佳实践或代码效率,我编写了以下代码: 请注意:我使用的是.NETCompactFramework protected override void OnPaint(PaintEventArgs e) { if (BmpScreen == null) { BmpScreen = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); } using (Graphics gBmpScr

为了了解最佳实践或代码效率,我编写了以下代码:


请注意:我使用的是.NETCompactFramework

protected override void OnPaint(PaintEventArgs e)
{
    if (BmpScreen == null)
    {
      BmpScreen = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
    }

    using (Graphics gBmpScreen = Graphics.FromImage(BmpScreen))
    {
         // some drawing using gBmpScreen
    }
    // finally
    e.Graphics.DrawImage(BmpScreen, 0, 0);
}
在绘画方法的这段代码中,我每次都创建一个图形对象


我的问题是这样做更好还是在开始时只创建一次图形对象更好?

我不确定性能差异,但我建议在OnResize中分配和处理后缓冲区位图和图形对象。我发现,对于大多数自定义控件,您可以将更新后缓冲区的实际工作尽可能地与数据更改发生的位置分离,并简化OnPaint,以便仅将后缓冲区位图blit到系统图形中。这对于我编写的自定义图形控件非常有效,因为数据不会随着用户交互而改变。它包含在手势滚动控件中,大大改进了滚动动画。但是,您可以通过调用Update来响应用户交互更改,从而在处理程序的范围内强制OnPaint,从而扩展该模式以处理更多交互控件。

我不确定性能差异,但我建议在OnResize中分配和处理后缓冲区位图和图形对象。我发现,对于大多数自定义控件,您可以将更新后缓冲区的实际工作尽可能地与数据更改发生的位置分离,并简化OnPaint,以便仅将后缓冲区位图blit到系统图形中。这对于我编写的自定义图形控件非常有效,因为数据不会随着用户交互而改变。它包含在手势滚动控件中,大大改进了滚动动画。但是,您可能可以通过调用Update以响应用户交互更改来扩展模式以处理更多交互控件,从而强制在处理程序的作用域中使用OnPaint。

PaintEventArgs已经通过为您提供了一个图形对象。为什么你不能使用已经创建并交给你的位图呢?答案应该很明显,反复绘制同一个位图通常效率不高。如果不重复绘制相同的内容,则不应使用位图,而应使用Double Buffered属性并绘制到e.Graphics。我使用的是.Net Compact Framework…@Praveen据我所知,NETCF支持PaintEventArgs上的Graphics属性。表示它受.NET Compact Framework支持。建议的做法是进行测试和度量。这是否为您提供了可接受的性能?对很好。如果没有,考虑其他的想法,收集度量,看看哪一个更容易接受。为什么你不能使用已经创建并交给你的位图呢?答案应该很明显,反复绘制同一个位图通常效率不高。如果不重复绘制相同的内容,则不应使用位图,而应使用Double Buffered属性并绘制到e.Graphics。我使用的是.Net Compact Framework…@Praveen据我所知,NETCF支持PaintEventArgs上的Graphics属性。表示它受.NET Compact Framework支持。建议的做法是进行测试和度量。这是否为您提供了可接受的性能?对很好。如果没有,考虑其他的想法,收集度量,看看哪个更容易接受。我建议在OnResize中分配和处理你的后缓冲位图和图形是因为当你的控件被调整大小时,你需要不同大小的后台缓冲区对象。在每个OnPaint上分配图形对象会带来一些性能损失,但您可以简单地测试和比较性能差异,方法是在位图的同时一次分配图形对象。通过将绘图代码移出OnPaint并靠近处理模型更改的位置,而不是从后台缓冲区分配中进行更改,您可能会看到更高的性能。我建议在OnResize中分配和处理后台缓冲区位图和图形的原因是,当控件调整大小时,您将需要不同大小的后台缓冲区物体。在每个OnPaint上分配图形对象会带来一些性能损失,但您可以简单地测试和比较性能差异,方法是在位图的同时一次分配图形对象。通过将绘图代码移出OnPaint,并更接近处理模型更改的位置,而不是从后台缓冲区分配中进行更改,您可能会看到更高的性能。