c#中使用许多类型转换和明显模式来缩短代码的正确方法
本文关键字:代码 方法 模式 许多 类型转换 | 更新日期: 2023-09-27 18:13:52
我有一个应用程序在屏幕上进行一些绘画。我用双精度操作,但要绘制,我必须使用浮点数或整型数。这样的事情经常发生:
g.DrawEllipse(monsterPen, new Rectangle(
(int)Math.Round(x - (double)sizeVessel * 9.0 / 20.0),
(int)Math.Round(y - (double)sizeVessel * 9.0 / 20.0),
(int)Math.Round(sizeVessel * 18.0 / 20.0),
(int)Math.Round(sizeVessel * 18.0 / 20.0)));
虽然它看起来像这样
g.DrawEllipse(monsterPen, NewRectangleFromD(
x - (double)sizeVessel * 9.0 / 20.0),
y - (double)sizeVessel * 9.0 / 20.0),
sizeVessel * 18.0 / 20.0,
sizeVessel * 18.0 / 20.0)));
甚至像这样
DrawCircle(g, monsterPen, x, y, sizeVessel * 9.0 / 20.0)
然而,我不知道如何做得更好。
在C/c++中,如果我没记错的话,你可以创建一个别名,比如下面的代码:
DrawCircle(g, p, x, y, r)
在任何情况下都应被视为:
g.DrawEllipse(p, new Rectangle(
(int)Math.Round(x - r / 2.0),
(int)Math.Round(y - r / 2.0),
(int)Math.Round(r),
(int)Math.Round(r))
但是我在c#中找不到这样的选项。由于没有能力强制内联(我在。net 4.0中工作),我担心如果我只是声明一个DrawCircle方法来做这件事,我会减慢我的应用程序(那些绘制调用是经常做的)。
那么,正确的方法是什么呢?
一个选择是使用扩展方法:
public static class GraphicsExtentions
{
public static void DrawEllipse(this Graphics g, Pen pen, double x, double y, double width, double height)
{
g.DrawEllipse(pen, (int)x, (int)y, (int)width, (int)height);
}
}
可以这样调用:
double x, y, w, h;
...
g.DrawEllipse(pen, x, y, w, h);
如果你想让它超级快,你可以看看激进的内联属性:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void DrawEllipse(this Graphics g, Pen pen, double x, double y, double width, double height)
{
g.DrawEllipse(pen, (int)x, (int)y, (int)width, (int)height);
}
我将在这里回答,并指出为什么您不应该为此烦恼。
你正在使用GDI+,这是一个软件渲染器。使用这个库进行密集的图形处理将会非常缓慢。
调用一个函数需要多少CPU周期?在软件中画一个圆点需要多少个呢?我没有数据,但我可以肯定一件事:它们会有好几个数量级的差距。
结论:你试图优化错误的东西。如果希望快速显示图形,请使用硬件加速解决方案。