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方法来做这件事,我会减慢我的应用程序(那些绘制调用是经常做的)。

那么,正确的方法是什么呢?

c#中使用许多类型转换和明显模式来缩短代码的正确方法

一个选择是使用扩展方法:

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周期?在软件中画一个圆点需要多少个呢?我没有数据,但我可以肯定一件事:它们会有好几个数量级的差距。

结论:你试图优化错误的东西。如果希望快速显示图形,请使用硬件加速解决方案。