我正在开发一款游戏,但目前我正在运行基准测试。
如果有人能在这件事上帮助我,我将不胜感激。
我正在做的是,当我单击开始按钮时,使用以下代码在面板上触发绘制事件:
private void startToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
pnlArea.Invalidate();
}
catch (Exception)
{
throw;
}
}
然后我在绘画事件中执行此操作:
private void pnlArea_Paint(object sender, PaintEventArgs e)
{
try
{
stopwatch = new Stopwatch();
// Begin timing
stopwatch.Start();
if (gameStatus == GameStatus.PlaceHead)
{
e.Graphics.DrawImage(dictHead["HeadRight"], 100, 100, 15, 15);
}
//e.Graphics.Clear(Color.White);
if (gameStatus == GameStatus.GameTest)
{
int x = 0;
int y = 0;
for (int i = 0; i < 5000; i++)
{
x += 15;
if (x > 1000)
{
x = 0;
y += 15;
}
e.Graphics.DrawImage(body.Value, x, y, 15, 15);
}
}
toolTimer.Text = Math.Round((stopwatch.Elapsed.TotalMilliseconds / 1000), 2).ToString() + "s";
// Stop timing
stopwatch.Stop();
}
catch (Exception)
{
throw;
}
}
这是我在上面的代码中绘制的身体部分:
这是确切的尺寸 --> 15px x 15px
但这有时需要长达 1.2 秒!
有什么办法可以改善这个吗?
this is a sample of the end result screen:
您需要考虑如何最大程度地减少绘图调用的次数。目前,您绘制 5000 个小方框以生成网格。每次绘制一个框时,您都会执行几条指令,然后调用图形方法来渲染缩放图像。对于每个网格方来说,这都是很大的开销。
因此,您可以考虑的第一件事是找到更有效的方法来绘制图像 - 例如,DrawImageUnscaled
可能比DrawImage
并达到你想要的结果。但这是优化低效算法的问题 - 要获得真正的性能优势,您需要做的是看看是否可以采用新的、更高效的算法。
如果您必须使用位图进行渲染,那么请查看图案如何重复 - 您可以制作一个更大的位图来提供 4x4 或 16x16 单元组,然后进行渲染吗?或者代表整列或整行的位图?那么您可能会使用 50 次调用而不是 5000 次进行渲染。
但如果您不需要使用位图渲染,您也许可以做得更好。例如,如果您gfx.Clear(backgroundColor)
然后向下和横向绘制约 140 条黑线,只需 141 次调用即可创建相同的显示。或者,如果您绘制大约 70 个矩形,则每次调用可以有效地执行 2 行,这大大减少了必须进行的方法调用数量,并允许图形系统使用高度优化的线条渲染和矩形渲染例程一次性绘制更多像素(事实上,由于系统知道线始终是垂直和水平的,因此矩形的计算速度可能比广义线快得多)。
(如果有些位不遵循此模式,那么您仍然可以渲染背景网格,然后在顶部绘制更改吗?)
接下来,如果图像中只有一小部分区域从一帧到下一帧发生变化,那么您的算法将绘制 5,000 个框,即使其中 4999 个框没有变化(或者 70 个矩形,当 1 个就足够时)。因此,如果您(a)仅使需要更改的视图部分无效,并且(b)编写渲染例程来计算出哪些网格方块位于剪辑边界之外,因此绘制毫无意义,则可以大大改善问题。这可以减少每帧绘制 1 个矩形的更新,而不是 5000 个。 (实现相同效果的另一种方法是将图像保留在屏幕外位图中,然后在其上绘制更改。当您将其渲染到主屏幕显示时,显卡将为您剪辑它并实现相同的结果 -重绘速度更快)
这一切都是为了通过“懒惰”和横向思考以尽可能少地完成工作来实现相同的显示。 (让计算机运行得更快总是归结为要求它做得更少)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)