图像绘制速度

我正在制作一款游戏,但目前我正在运行基准测试。

如果有人能够帮助我解决这个问题,我将不胜感激。

我正在做的是,当我点击开始按钮时,使用以下代码触发面板上的绘画事件:

    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秒! 有没有一种方法可以改善这一点?

这是最终结果屏幕的示例: 在这里输入图像描述


您需要考虑如何最大限度地减少您制作的绘图调用数量。 目前您可以绘制5000个小方框以生成网格。 每次您绘制一个框时,您都会执行几条指令,然后调用图形方法渲染缩放后的图像。 这是每个网格广场的大量开销。

所以你可以看到的第一件事就是找到更有效的方式来绘制图像 - 例如, DrawImageUnscaled可能比DrawImage工作得更快,并达到你想要的效果。 但是,这是一种低效率算法的优化 - 您需要做什么才能获得真正的性能优势,请参阅您是否可以采用新的更高效的算法。

如果您必须使用位图进行渲染,请查看模式如何重复 - 您可以创建一个更大的位图来提供4x4或16x16的单元格组,并将其渲染? 或者是一个代表整个列或行的位图? 然后你可以用50个电话而不是5000个电话进行渲染。

但是如果你不需要使用位图渲染,你可能会做得更好。 例如,如果你使用gfx.Clear(backgroundColor) ,然后画出约140条黑线,则只需141次调用即可创建相同的显示。 或者,如果绘制大约70个矩形,则每次调用可以有效地执行2行。这大大减少了您必须制作的方法调用次数,并允许图形系统使用高度优化的线条渲染和矩形渲染例程在一次突发中绘制更多像素(事实上​​,由于系统知道线总是垂直和水平的,因此矩形可能比广义线快得多)。

(如果有些位不符合这种模式,那么您是否仍然可以渲染背景网格,然后在顶部绘制变化?)

接下来,如果只有一小部分图像从一帧变为下一帧,那么即使其中4999个图像没有变化(或者1个图像足够时为70个矩形),您的算法也会绘制5,000个盒子。 因此,如果您只需使视图中需要更改的部分无效,并且(b)编写渲染例程以确定哪些网格正方形位于剪辑边界之外并因此无意绘制,则可以大大改善问题。 这可以减少您更新绘制1个矩形而不是每个帧5000个。 (实现同样目的的另一种方法是将图像保存在离屏位图中,然后在其上绘制更改,当您将其渲染到主屏幕显示时,图形卡会为您剪切并获得相同的结果 - 更快的重绘速度)

这是所有关于通过“懒惰”和横向思考实现相同的展示,尽可能少做工作。 (让电脑走得更快总是归结为要求它少做)


除了每个人给我的信息之外,我还是会对结果进行双倍缓冲。 这解决了我的问题 - >

class DoubleBufferedPanel : Panel { public DoubleBufferedPanel() : base() { DoubleBuffered = true; } }

而我只是用这个双缓冲面板来代替。

新的基准没有闪烁! :

链接地址: http://www.djcxy.com/p/8879.html

上一篇: Image draw speed

下一篇: Using drawImage with Canvas is very slow on Chrome