所以,我有一个应用程序在屏幕上做一些绘画。我正在使用双打,但要画画,我必须使用浮子或整体。所以,像这样的事情经常发生:
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方法,那么我将减慢我的应用程序(这些绘制调用经常进行)。
那么,采取什么方法是正确的?
答案 0 :(得分:4)
一种选择是使用extention methods:
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);
如果你希望它超级快,你可以看看激进的inlining attribute:
[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);
}
答案 1 :(得分:1)
我会在这里回答,指出为什么你不应该为此烦恼。
您正在使用GDI +,它是一个软件渲染器。无论如何,使用此库进行密集图形非常慢。
调用函数需要多少个CPU周期?实际在软件中绘制椭圆需要多少?我没有这些数字,但我确信有一件事:它们会相差几个数量级。
结论:你正试图在这里优化错误的东西。如果要显示 fast 图形,请使用硬件加速解决方案。