最快的GDI+渲染设置是什么?

本文关键字:设置 是什么 GDI+ | 更新日期: 2023-09-27 18:16:17

有很多关于渲染高质量图形的帖子,比如这个

高质量图像缩放库

我需要在GDI+的图形中渲染大约6k+对象(直线和椭圆),帧率约为10fps。所以我需要最低质量的图像属性。

下面是我所做的:

public static class GraphicsExtensions
{
    public static void ToHighQuality(this Graphics graphics)
    {
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    }
    public static void ToLowQuality(this Graphics graphics)
    {
        graphics.InterpolationMode = InterpolationMode.Low;
        graphics.CompositingQuality = CompositingQuality.HighSpeed;
        graphics.SmoothingMode = SmoothingMode.HighSpeed;
        graphics.TextRenderingHint = TextRenderingHint.SystemDefault;
        graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
    }
}

是我忘记了什么,还是这是图形属性的最佳极值?
我在低模式下以5fps (202ms/image)绘制,在高模式下以3fps (330ms/image)绘制。
我不觉得有很大的区别,但我已经减少了我的性能问题,只绘制…

Some Numbers:

  • 1650调用DrawLine
  • 6600调用FillEllipse

最快的GDI+渲染设置是什么?

GDI+不是一个高性能的渲染解决方案。p/调用到GDI或直接使用DirectX如果你想要更好的原始性能。然而,获得2倍的加速通常是可以实现的,只要优化重绘一点:

你真的需要画那么多吗?删除一些元素后,图像还能正常工作吗?

你是在创建和销毁大量的笔和画笔,还是重复使用一些预定义的笔和画笔?您是否正在进行任何处理来构建或转换形状,您可以在预处理步骤中进行这些处理,以便在重绘期间不会不必要地重复?

你画了什么不需要的东西吗?剔除(丢弃)屏幕外的任何东西。如果发生了大量的透支(很可能有6000个对象),就有可能检测并丢弃那些完全被前面的东西遮挡的形状。

可以将多条线合并成一条折线吗?每次函数调用都会增加开销,所以如果你能在一次函数调用中绘制多个形状或线条,它会运行得更快。

一定要用省略号吗?如果它们很小,你可能会在8面或12面多边形上获得更好的性能,而不会明显降低形状的质量——值得一试。

优化重复。如果形状是规则的(例如,你正在绘制许多相同颜色的10像素圆),然后绘制一个到位图,然后对副本进行blit。如果有一个规则的模式(例如一个棋盘),然后绘制它的一小部分到位图和blit部分重复它在你的图像。(只要确保你绘制的位图没有缩放,并且它们与屏幕(dpi和bpp)相匹配,这样你就可以得到最快的位图类型,而不会以缓慢的双线性过滤模糊混乱告终)

如果有很多颜色变化,也许你可以把它们批处理在一起,这样你就可以画所有红色的东西,然后画所有蓝色的东西等等——这避免了在笔/刷之间切换很多。

有时你可以通过避免剪切来获得好处——例如,如果你正在绘制文本,并且你知道它都是可见的,你可以禁用剪切。(这曾经提供了一个性能优势-它可能对硬件加速渲染没有帮助,但值得一试)

最后,请记住,使用硬件加速时,禁用某些呈现特性可能无法获得好处。如果图形卡能够以每秒500帧的速度绘制10,000个椭圆,但你只能看到10帧/秒,那么禁用抗锯齿可能不会帮助你的帧率-瓶颈更可能是你的代码和GDI+花了很长时间告诉图形卡要渲染什么,而不是图形渲染本身很慢。(YMMV -这将取决于你正在渲染的内容,GDI+如何处理它,是否硬件加速,图形驱动程序如何处理它,以及你的图形卡有多强大)

对于绘制图像,请转到低画质:

img = new Bitmap(img, w / 2, h / 2);