2

私は現在MonoGameで遊んでおり、SpriteBatch.Draw()メソッドを調査していました。

1秒間に数万回呼び出すことができるメソッドの内部には、次のように表示されます。

public void Draw (Texture2D texture,
        Rectangle destinationRectangle,
        Rectangle? sourceRectangle,
        Color color,
        float rotation,
        Vector2 origin,
        SpriteEffects effect,
        float depth)
    {
        CheckValid(texture);

        DrawInternal(texture,
              new Vector4(destinationRectangle.X, //<-------------- Oh Noes! :O
                          destinationRectangle.Y,
                          destinationRectangle.Width,
                          destinationRectangle.Height),
              sourceRectangle,
              color,
              rotation,
              new Vector2(origin.X * ((float)destinationRectangle.Width (float)texture.Width), <-- Oh Noes!
                          origin.Y * ((float)destinationRectangle.Height / (float)texture.Height)),
              effect,
              depth);
    }

60分の1秒程度ごとに何千もの新しいベクトルが割り当てられているように見えます。

MonoGameは、(とりわけ)モバイル開発を目的としたプラットフォームです。私はDalvikで実行されるモバイル開発を行いましたが、この方法で割り当てることは決して良い考えではありませんでした。低速のモバイルプロセッサでは、収集が必要なオブジェクトが蓄積すると、最終的にGCが実行され、パフォーマンスが著しく低下します(一部のデバイスでは最大200ミリ秒)。それは私の質問に私を導きます:

CLR / Mono GCの実行方法、またはこのパフォーマンスヒットの発生を防ぐその他の要因について何かありますか、それとも、MonoGameは最も呼び出される関数の1つで実行すべきでないことを実行していますか?

4

1 に答える 1

2

Vector4タイプはクラスではなく、構造体です。その新しいインスタンスを作成すると、ヒープ上にオブジェクトが作成されるのではなく、構造値が作成されます。この場合、値はメソッド呼び出しのためにスタックにプッシュされるため、基本的にはメンバーを個別のパラメーターとしてプッシュするのと同じ作業です。

于 2012-11-19T00:57:18.930 に答える