3

所以我正在使用平铺图像制作横向滚动游戏。在任何给定时间,至少有大约 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(因为我将场景向左移动),然后重新绘制整个场景。所以本质上,每 10 个滴答声就会重新绘制约 120 个图像。这导致我的程序在我的计算机上达到大约 40% 的 CPU 使用率。

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

这是正在绘制的场景的图像: 现场图片

4

5 回答 5

2

You're simply overloading your CPU, because the graphics are rendered in software mode.

Use MonoGame, it is really simple to get started with, it handles the drawing for you https://github.com/mono/MonoGame and learn a bit about game mechanics here: http://xnagpa.net/xna4rpg.php

MonoGame supports both Direct3D and OpenGL, the graphics are hardware accelerated, and you won't notice a slowdown when rendering a simple 2D scene.

于 2013-02-20T14:55:11.337 回答
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 或其他渲染库。

于 2013-02-20T15:00:42.070 回答
1

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

XNA 非常适合学习 C#(因为它是由 Microsoft 创建的),它与 Visual Studio 配合得非常好,它是免费的,并且有大量的在线教程。

于 2013-02-20T15:02:18.567 回答
0

You definitely should have a look at using DirectX for rendering purposes. This is best practice when developing game under Windows.

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

于 2013-02-20T14:55:22.510 回答
-1

考虑使用TranslateTransform在表面上移动图像。这应该会提高性能。

于 2013-02-20T15:00:03.057 回答