什么是最快的GDI +渲染设置?
有很多关于渲染高质量图形的文章,比如这个
高质量图像缩放库
我需要在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;
}
}
我忘了一些东西,还是这是Graphics的财产的最佳极值?
我使用较低模式以5fps(202ms /图像)和较高模式以3fps(330ms /图像)绘制。
我不觉得有什么大的差别,但是我的性能问题只是减少绘制...
一些数字:
GDI +不是高性能渲染解决方案。 p /调用到GDI或直接使用DirectX,如果你想要更好的原始性能。 但是,通过稍微优化重绘,通常可以实现2倍加速:
你真的需要画这么多吗? 图像仍然可以正常工作,删除一些元素?
你正在创造和销毁很多笔和画笔,还是你在重复使用一些预定义的画笔? 您是否正在做任何处理来构建或转换您在预处理步骤中可以执行的形状,以便在重绘期间不会不必要地重复该形状?
你是否画了不必要的东西? 剔除(丢弃)任何不在屏幕上的东西。 如果发生大量透支(非常可能有6000个物体),则可能检测并丢弃完全被它们前方的物体遮挡的形状。
你可以将多条线组合成一条折线吗? 每个函数调用都会增加开销,所以如果您可以使用单个函数调用绘制多个图形或线条,则运行速度会更快。
你必须使用椭圆吗? 如果它们很小,则可以通过8或12边多边形获得更好的性能,而不会明显降低形状的质量 - 值得尝试查看。
优化重复。 如果形状是规则的(例如,您使用相同颜色绘制大量10像素圆圈),则将其中一个绘制到位图,然后对副本进行blit处理。 如果存在常规模式(例如棋盘格),则将其中的一小部分绘制到位图上,然后对该部分进行blit处理,以在整个图像上重复该部分。 (只要确保绘制的位图未缩放,并且它们与屏幕匹配(dpi和bpp),以便获得最快的blit类型,并且不会以缓慢的双线性过滤模糊混乱结束)
如果颜色变化很多,你可以将它们批量打包,以便绘制所有红色的东西,然后绘制所有蓝色的东西等 - 这可以避免笔/刷子之间的切换。
有时候,你可以通过避免裁剪获得 - 例如,如果你正在绘制文本,并且你知道它会全部可见,那么可以禁用裁剪来绘制。 (这用于提供性能优势 - 它可能无助于硬件加速渲染,但值得一试)
最后,请记住,通过硬件加速,禁用某些渲染功能可能无法实现。 如果图形卡能够以每秒500帧的速度绘制10,000个椭圆,但您只能看到10 fps,那么禁用抗锯齿可能无助于帧率 - 瓶颈更可能是您的代码和GDI +花费很长时间告诉显卡渲染什么,而不是图形渲染本身很慢。 (YMMV--这取决于你渲染的是什么,GDI +如何处理它,它是硬件加速的,图形驱动程序用它做什么以及你的图形卡有多强大)
为了绘制图像,请转向低质量:
img = new Bitmap(img, w / 2, h / 2);
链接地址: http://www.djcxy.com/p/50343.html