C#高效的图像绘制和移动

时间:2013-02-20 14:47:41

标签: c# graphics

所以我正在使用平铺图像制作侧滚动游戏。在任何给定时间,使用此代码绘制至少约120张图像:

for (int mapX = 0; mapX < mapWidth; mapX++)
{
    for (int mapY = 0; mapY < mapHeight; mapY++)
    {
        try
        {
            Block block = mapList[mapY, mapX];

            if (block == null)
                continue;

            if (block.nullspace)
                continue;

            block.Interact();

            int drawX = sceneX + block.blockX;
            int drawY = sceneY + block.blockY;

            if (drawX + block.blockWidth < 0)
                continue;
            else if (drawX > this.ClientSize.Width + 50)
                break;

            if (drawY + block.blockHeight < 0)
                continue;
            else if (drawY > this.ClientSize.Height)
                break;

            e.Graphics.DrawImage(block.blockImage, drawX, drawY, block.blockWidth, block.blockHeight);

            if (block.overlayImage != null && !block.dontDraw)
                e.Graphics.DrawImage(block.overlayImage, sceneX + block.blockX, sceneY + block.blockY, block.blockWidth, block.blockHeight);
        }
        catch (Exception)
        {
        }
    }
}

但是,每次需要移动图像时都会运行此代码。例如,为了让整个场景移动,我有一个间隔为10的计时器(为了保持运动平滑),这将减少sceneX(因为我将场景向左移动),然后它重新绘制整个场景。基本上,大约每120个图像重新绘制约120个图像。这导致我的程序在我的计算机上达到大约40%的CPU使用率。

基本上我的问题是:“绘制和移动大量图像拼贴的最有效方法是什么”

这是正在绘制的场景的图像: An image of the scene

5 个答案:

答案 0 :(得分:2)

您只是过载CPU,因为图形是以软件模式呈现的。

使用MonoGame,开始时非常简单,它会为您处理绘图https://github.com/mono/MonoGame并在此处学习一些游戏机制:http://xnagpa.net/xna4rpg.php

MonoGame支持Direct3D和OpenGL,图形是硬件加速的,在渲染简单的2D场景时你不会注意到减速。

答案 1 :(得分:1)

您应该做的第一件事是确定您的地图在屏幕上可见的范围。现在,你有:

for (int mapX = 0; mapX < mapWidth; mapX++)
{
    for (int mapY = 0; mapY < mapHeight; mapY++)

因此,您正在为整个世界运行循环,以查看每个单独的正方形是否可见。您可以通过在循环之前确定限制来减少工作量。这样,您将循环限制为:

for (int mapx = startVisibleX; mapX <= endVisibleX; mapX++)
{
    for (int mapY = startVisibleY; mapY <= endVisibleY; mapY++)

如果您的世界比您的屏幕大得多,那么这将为您节省大量不必要的处理。

如果渲染速度成为一个问题,我强烈建议您注意其他答案中的建议并查看DirectX,MonoGame或其他渲染库。

答案 2 :(得分:1)

XNA.如果您处于Windows窗体的这个阶段,您将不会发现使用Microsoft XNA库有很大不同,并且您的结果会更好,因为它们将利用DirectX,硬件加速等等,你不必担心它。 (而且你的代码会更快,更自然的读/写,因为XNA是专为游戏/图形设计的......像这样的东西是XNA的目标之一。)

XNA非常适合学习C#(因为它是由Microsoft创建的),它与Visual Studio非常相称,它是免费的,并且有很多在线教程。

答案 3 :(得分:0)

你绝对应该看看使用DirectX进行渲染。这是在Windows下开发游戏时的最佳实践。

http://msdn.microsoft.com/en-us/library/windows/apps/hh452790.aspx

答案 4 :(得分:-1)

考虑使用 TranslateTransform 在图像上移动图像。这应该可以提高性能。