C# 使用C语言中的许多强制转换和明显模式缩短代码的正确方法#
所以,我有一个在屏幕上画画的应用程序。我用双精度运算,但要画画,我必须使用浮点或整数。所以,像这样的事情经常发生:C# 使用C语言中的许多强制转换和明显模式缩短代码的正确方法#,c#,.net,C#,.net,所以,我有一个在屏幕上画画的应用程序。我用双精度运算,但要画画,我必须使用浮点或整数。所以,像这样的事情经常发生: 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 /
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)
甚至像这样
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#中找不到这样的选项。由于没有强制内联的能力(我在.NET4.0中工作),如果我仅仅声明一个DrawCircle方法来实现这一点,我会减慢我的应用程序的速度(这些draw调用非常频繁)
那么,这里采取的正确方法是什么呢?一个选项是使用:
你这样称呼它:
double x, y, w, h;
...
g.DrawEllipse(pen, x, y, w, h);
如果你想让它超快,你可以看看它的侵略性:
一种选择是使用:
你这样称呼它:
double x, y, w, h;
...
g.DrawEllipse(pen, x, y, w, h);
如果你想让它超快,你可以看看它的侵略性:
我将在这里回答,指出你为什么不应该为此烦恼 您正在使用GDI+,它是一种软件渲染器。无论如何,使用此库进行密集图形处理的速度都会非常缓慢 调用一个函数需要多少CPU周期?在软件中真正画一个ellpise需要多少人?我没有这些数字,但我确信有一件事:它们将相隔几个数量级
结论:您试图优化的东西是错误的。如果您想快速显示图形,请使用硬件加速解决方案。我将在这里回答您的问题,指出您不必为此烦恼的原因 您正在使用GDI+,它是一种软件渲染器。无论如何,使用此库进行密集图形处理的速度都会非常缓慢 调用一个函数需要多少CPU周期?在软件中真正画一个ellpise需要多少人?我没有这些数字,但我确信有一件事:它们将相隔几个数量级
结论:您试图优化的东西是错误的。如果您想快速显示图形,请使用硬件加速解决方案。使用扩展方法?@DavidG但它没有额外成本吗?如果我使用扩展方法,调用堆栈是这样的:(main->call DrawCircle->call drawerlipse)还是这样的(main->call drawerlipse)?每件事都会有代价,但我怀疑这会引起任何明显的后果。好吧,对于别名或内联,没有代价-短符号等同于长符号(唯一的成本是编译代码所需的时间)。因此,我需要一个无成本(在运行时)解决方案,因为显然可以achieve@KeithPayne不正确。C#是一种JITted语言,但GC可能确实是一个问题。创建一个扩展方法?@DavidG但它没有额外的成本吗?如果我使用扩展方法,调用堆栈会是这样的:(main->call DrawCircle->call drawerlipse)还是这样(main->call drawerlipse)?每件事都有代价,但我怀疑这会引起任何明显的后果。好吧,对于alias或inline,没有代价-短符号相当于长符号(只有编译代码所需的时间才有代价)。因此,我需要一个无代价(在运行时)解决方案,因为显然可以achieve@KeithPayne不正确。C#是一种JITted语言,但GC可能确实是一个问题。谢谢你。正如我上面回答的,我正在寻找一种无成本的解决方案,因为在这种情况下,它显然是可以实现的……为什么你认为它“显然是可以实现的”考虑一下这个问题:我制作了一个定制的文本编辑器,它编辑了.c++文件。这个编辑器将新的语法引入到C++中的别名中,它有一个“导出”选项。cs++文件到cs文件,在这个过程中,别名被替换为它们的别名。没有实现任何成本解决方案。当然,这将是笨拙的,因为我必须编辑我的cs文件超过Visual Studio,显然我不会这么做,但这证明了这是可能的。现在的问题是,这是否已经在C中实现了#或者没有……对不起,但这对我来说没有什么意义。也许我解释得不好。我想说的是,你可以创建一个脚本(算法?程序?),它将引入一种方法,通过用C代码替换文件中的模式来做我想做的事情(比如,如上所述,将所有的“DrawCircle”更改为“DrawEllipse”)。这意味着您必须在另一个应用程序中编辑代码,然后在编译之前应用脚本生成一个c代码文件。因此,当我编辑代码时,我看到“DrawCircle”和压缩代码,但在c文件中,“DrawEllipse”和扩展代码存在(并发送给编译器)谢谢。我在上面回答的时候,我在寻找一个无成本的解决方案,因为在这种情况下它是显然可行的…为什么你认为它是“明显的可实现的”?考虑一下:我制作了一个定制的文本编辑器,它编辑了C+++文件。这个编辑器将C++中的新语法引入到C++中的别名中。cs++文件到cs文件,在这个过程中,别名被替换为它们的别名。没有实现任何成本解决方案。当然,这将是笨拙的,因为我必须编辑我的cs文件超过Visual Studio,显然我不会这么做,但这证明了这是可能的。现在的问题是,这是否已经在C中实现了#或者没有……对不起,但这对我来说没有什么意义。也许我解释得不好。我想说的是,你可以创建一个脚本(算法?程序?),它将引入一种方法,通过用C代码替换文件中的模式来做我想做的事情(比如,如上所述,将所有的“DrawCircle”更改为“DrawEllipse”)。这意味着您必须在另一个应用程序中编辑代码,然后在编译之前应用脚本生成一个c#代码文件。因此,当我编辑代码时,我会看到“DrawCircle”和compact