0

私はc#で長方形の配列をいじっていますが、アプリケーション(Silverlight)に数回循環した後、長方形の「レイヤー」間を循環するまで、すべてが正常に機能しています。

私のコードは次のとおりですが、この劣化の原因についてアドバイスを提供することはできますか?

    private int worldHeight = 20;
    private int currentLayerNo = 0;
    private int keypressCounter = 0;
    public MainPage()
    {
        InitializeComponent();
        createGrid();
    }
    private void createGrid()
    {
        blockCanvas.Children.Clear();
        int x = 0, y = 0;
        Layer generateWorld = new Layer();
        generateWorld.z = worldHeight;
        generateWorld.x = 50;
        generateWorld.y = 50;
        generateWorld.Gen();
        Rectangle[,] currentLayer = generateWorld.createLayer(currentLayerNo);
        for (int a = 0; a < currentLayer.GetLength(0); a++)
        {
            for (int b = 0; b < currentLayer.GetLength(1); b++)
            {
                Rectangle currentBlock = new Rectangle();
                currentBlock = currentLayer[a, b];
                blockCanvas.Children.Add(currentBlock);
                Canvas.SetTop(currentBlock, x);
                Canvas.SetLeft(currentBlock, y);
                y = y + 32;
            }
            x = x + 32;
            y = 0;
        }
        currentLayer = null;
        this.KeyDown += new KeyEventHandler(onKeyDown);
    }
    private void onKeyDown(object sender, KeyEventArgs e)
    {
               //Code here cycles between layers, each time calling the createGrid() method after altering currentLayerNo
    }
}
4

2 に答える 2

1

呼び出すたびに、新しいイベントリスナーを追加するcreateGrid()呼び出しも行っています。this.KeyDown += new KeyEventHandler(onKeyDown);

これへの最初の呼び出しでcreateGrid()は、 キーが押されたときcreateGrid()に が 1 回呼び出され、それが に再度登録されKeyDownます。つまり、 が 2 回呼び出されることを意味します。次のKeyDownイベントcreateGrid()で が 2 回呼び出され、そのたびにKeyDownイベントに追加されます。

遅くなるまで繰り返します。

登録を MainPage コンストラクターに入れることができます。

于 2013-01-07T21:27:19.277 に答える
1

Canvas での子のクリアと追加は、パフォーマンスが集中する操作です。パフォーマンスを向上させたい場合は、キャッシュを使用してください。つまり、これらすべての長方形を再作成するのではなく、単純に再利用するということです。

必要なものを再配置し、必要に応じてエクストラを追加するか、前のステップで作成されたが今は必要ないものを非表示にします。

パフォーマンスの問題のもう 1 つの理由は、creategrid を呼び出すたびに同じイベント ハンドラーを何度も追加したことです。これは、キーを 2 回押すと、createGrid が 2 回呼び出されることを意味します。その後キーを押すたびに、createGrid の呼び出し回数が 2 倍になります。

最初にその行を削除して、キャッシュを使用する必要があるかどうかを確認してください。視覚的に重い WPF アプリケーションで必要でしたが、魅力的に機能しました。

于 2013-01-07T21:24:55.773 に答える