2

游戏画面背景包含大量图片框,启动、最小化、移动后需要2-3秒才能完全显示背景。这段代码对我的目的有害吗?还有另一种方法可以做到这一点吗?谢谢你。这是代码:

public class gameArea
{
    private Panel gameArea;
    private MemoryStream ms;

    public gameArea(Panel gameArea)
    {
        this.gameArea = gameArea;
    }

    public void setBackground()
    {
        byte[] b_grass = File.ReadAllBytes(ImageFile.grassBG);
        byte[] b_tree = File.ReadAllBytes(ImageFile.tree);
        byte[] b_sea = File.ReadAllBytes(ImageFile.sea);

        // [650/50=13, 550/50=11]
        int[,] tile_id = { 
                         { 1, 2, 0, 0, 0, 1, 1, 0, 1, 2, 1, 2, 0 },
                         { 2, 1, 0, 1, 0, 1, 1, 2, 2, 2, 1, 2, 0 },
                         { 1, 2, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1 },
                         { 1, 2, 0, 0, 1, 0, 1, 0, 1, 2, 0, 0, 0 },
                         { 1, 0, 2, 0, 0, 1, 1, 2, 1, 2, 1, 2, 0 },
                         { 2, 2, 0, 1, 0, 1, 2, 1, 0, 2, 0, 1, 1 },
                         { 1, 1, 2, 0, 0, 0, 1, 2, 1, 1, 2, 0, 0 },
                         { 0, 2, 0, 2, 1, 2, 1, 0, 1, 2, 1, 2, 2 },
                         { 1, 2, 0, 0, 0, 1, 0, 2, 0, 0, 1, 2, 0 },
                         { 0, 2, 0, 1, 0, 1, 1, 2, 1, 2, 0, 0, 2 },
                         { 1, 1, 1, 0, 0, 0, 1, 2, 1, 2, 1, 2, 0 }
                         };
        // tree id = 1
        // sea id = 2

        this.ms = new MemoryStream(b_grass);
        this.gameArea.BackgroundImage = Image.FromStream(ms);
        this.gameArea.BackColor = System.Drawing.Color.Transparent;

        for (int yIndex = 0, y = 0; y < this.gameArea.Height; y += 50, yIndex++)
        {
            for (int xIndex = 0, x = 0; x < this.gameArea.Width; x += 50, xIndex++)
            {
                switch (tile_id[yIndex, xIndex])
                {
                    case 1:
                        {
                            setTile(b_tree, x, y);
                            break;
                        }
                    case 2:
                        {
                            setTile(b_sea, x, y);
                            break;
                        }
                    default:
                        {
                            break;
                        }
                }
            }
        }
    }

    private void setTile(byte[] b_img, int x, int y)
    {
        this.ms = new MemoryStream(b_img);
        PictureBox pic = new PictureBox();
        pic.Image = Image.FromStream(ms);
        pic.Size = new Size(50, 50);
        pic.Location = new Point(x, y);
        this.gameArea.Controls.Add(pic);
    }
 }
4

3 回答 3

1

对于这样的项目,恐怕你能做的不多。Visual C# 并不是真正为游戏设计的,但有几种方法可以加快速度。

1.)如果您的游戏不需要更改背景,请先加载它并仅重置您需要的图片(可能在标记值中使用布尔值来确定是否应该重绘。)

2.) 使用线程。如果您启动 5 个线程,您的渲染可能会加快 3 倍左右。

3.) 在您的构造函数中将您的三个图像转换为 Image 对象,这样您就不需要为每个图块转换它们。

于 2012-09-29T04:03:02.707 回答
1

为什么不创建一个大位图并将您的小图像复制到其中,而不是许多图片框。

于 2012-09-29T04:05:52.390 回答
1

我发现(重新)绘制许多图片框的最快方法是将它们全部设置在面板上并为面板设置 visible = false 。完成后,面板的图片框设置为 true。当在我的应用程序中使用大约 400 个用于围棋游戏的图片框调整窗口大小时,重绘期间这大约是 50 次。

我在它下面有一个 pabel,它变得可见,就像一个快速闪光灯设置为相同的一般颜色,所以你看不到从图片框的一般颜色到白色背景的闪烁。

于 2012-09-29T07:36:44.263 回答