2

winform でマウスの座標を取得しようとしています。

  myMousePosition = myForm.PointToClient(Control.MousePosition)

これは機能しますが、ガベージ (ヒープ割り当て) が生成されます。私はこのメソッドを頻繁に呼び出すので、それは問題です。

  myMousePosition.X = Control.MousePosition.X - myForm.Location.X;
  myMousePosition.Y = Control.MousePosition.Y - myForm.Location.Y;

考慮すべきタイトルバーもあるため、これは機能しません。助言がありますか?

編集:もう少し情報。VS2010 プロファイリング ウィザードによると、PointToClient メソッドを使用すると、drawing.point タイプのインスタンスが何千も生成されます。問題は、私は Update メソッドで新しい変数を作成していないので、これらのインスタンスはどこから来ているのでしょうか?

public sealed class InputManager
{
  private System.Drawing.Point  mPos;

  public InputManager() 
  {
    mPos = new System.Drawing.Point(0, 0);
  }
  //////////////////////////////////////////////////////////////////////////

  public void Update()
  {
    mPos = myForm.PointToClient(Control.MousePosition);
  }
}
4

2 に答える 2

1

ここにコードがありますPointToClient()

public Point PointToClient(Point p) { 
    return PointToClientInternal(p);
} 

internal Point PointToClientInternal(Point p) { 
    NativeMethods.POINT point = new NativeMethods.POINT(p.X, p.Y); 
    UnsafeNativeMethods.MapWindowPoints(NativeMethods.NullHandleRef, new HandleRef(this, Handle), point, 1);
    return new Point(point.x, point.y); 
}

PointToClient()を呼び出しPointToClientInternal()、 の新しいインスタンスを作成しますNativeMethods.POINT

ここにありNativeMethods.POINTます:

[StructLayout(LayoutKind.Sequential)] 
public class POINT {
    public int x; 
    public int y; 

    public POINT() { 
    }

    public POINT(int x, int y) {
        this.x = x; 
        this.y = y;
    } 
}

したがって、これがヒープ割り当ての由来だと思います。呼び出しPointToClient()により、新しいNativeMethods.POINTオブジェクトがインスタンス化されます (これは構造体ではなくクラスであることに注意してください)。

これがアプリケーションの問題である場合は、PointToClient()実際に値が必要な場合にのみ呼び出すことをお勧めします。直接使用MapWindowPoints()することも考えられますが、それはお勧めできる場合とそうでない場合があります。

于 2012-12-07T14:22:50.450 に答える
1

struct値型である which を使用しているため、ガベージは生成されません。回収圧力はありませんし、それが問題になるとしても?ゲームのボトルネックには見えません。

于 2012-12-06T18:52:48.627 に答える