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.) コンストラクターで 3 つの画像を Image オブジェクトに変換します。これにより、タイルごとに変換する必要がなくなります。

于 2012-09-29T04:03:02.707 に答える
1

多くの画像ボックスの代わりに、1 つの大きなビットマップを作成し、小さな画像をそこにコピーしてみませんか。

于 2012-09-29T04:05:52.390 に答える
1

多くのピクチャボックスを (再) 描画するために私が見つけた最速の方法は、それらをすべてパネルに設定し、パネルに visible = false を設定することです。パネルに対して、pictureboxes を true に設定した後。これは、囲碁のゲーム用に約 400 のピクチャ ボックスを使用して、アプリでウィンドウのサイズを変更したときの再描画中に約 50 回です。

下に、同じ一般的な色に設定されたクイックフラッシュのように見えるようになるパベルがあるので、ピクチャボックスの一般的な色から白い背景へのちらつきは見られません。

于 2012-09-29T07:36:44.263 に答える