Cyr*_*don 14 .net c# graphics rendering 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我忘记了什么,或者这是图形属性的最佳极值?
我使用较低模式绘制5fps(202ms /图像),使用较高模式绘制3fps(330ms /图像).
我觉得没有太大的区别,但是我把性能问题减少到只画画......
一些数字:
Jas*_*ams 13
GDI +不是一种高性能渲染解决方案.如果您想要更好的原始性能,请调用GDI或直接使用DirectX.但是,通过优化重绘,通常可以实现2倍的加速:
你真的需要画这么多吗?删除了一些元素后,图像是否仍能正常工作?
您是在创建和销毁许多笔和画笔,还是在重复使用一些预定义的画笔?您是否正在进行任何处理来构建或转换您可以在预处理步骤中执行的形状,以便在重绘期间不会不必要地重复这些处理?
你有什么不必要的东西?剔除(丢弃)屏幕外的任何内容.如果发生大量透支(很可能是6000个物体),则可能会检测并丢弃完全被它们前面的东西遮挡的形状.
您可以将多条线组合成一条折线吗?每个函数调用都会增加开销,因此如果您可以使用单个函数调用绘制多个形状或行,则运行速度会更快.
你必须使用省略号吗?如果它们很小,使用8或12边多边形可以获得更好的性能而不会明显降低形状质量 - 值得一试.
优化重复.如果形状是规则的(例如,你用相同的颜色绘制了许多10像素的圆圈),那么将一个绘制到位图然后将副本blit.如果有一个常规图案(例如棋盘格),则将其中的一小部分绘制到位图上,然后将该部分blit以在图像上重复.(只要确保你绘制未缩放的位图并且它们与屏幕匹配(dpi和bpp),这样你就可以获得最快的blit类型,并且最终得到缓慢的双线性滤波模糊混乱)
如果有很多颜色的变化,你也许可以批量在一起,这样你画所有红色的东西,那么所有的蓝色的东西等等 - 这避免了笔之间切换/刷了很多.
有时你可以通过避免剪裁来获得 - 例如,如果你正在绘制文本并且你知道它们都是可见的,你可以通过禁用剪裁来绘制.(这用于提供性能优势 - 它可能无助于硬件加速渲染,但值得一试)
最后,请记住,通过硬件加速,您可能无法通过禁用某些渲染功能获得.如果显卡能够以每秒500帧的速度绘制10,000个椭圆,但你只能看到10 fps,那么禁用抗锯齿可能无法帮助你提高帧速率 - 瓶颈更可能是你的代码和GDI +需要很长时间告诉显卡要渲染什么,而不是图形渲染本身很慢.(因人而异 - 这将取决于你是什么样的渲染,GDI +如何处理它,无论是硬件加速,显卡驱动程序确实有它的东西,你的显卡是多么强大)