4

カスタムビューでは、Canvas.getClipBounds()を使用してonDrawメソッドを最適化することを検討しています(呼び出されるたびに絶対に必要なものだけを描画するように)。

ただし、オブジェクトの作成は絶対に避けたいです...

したがって、私の質問は、getClipBounds()呼び出されるたびに新しいRectを割り当てますか?それとも、単に1つのRectをリサイクルするだけですか?

また、新しいオブジェクトを割り当てている場合、getClipBounds(Rect bounds)それ自体の代わりに渡されたRectを使用しているように見えるを使用して、この費用を節約できますか?


(時期尚早の最適化を叫ぶ前に、ScrollViewに配置すると、onDrawが毎秒度も呼び出される可能性があることを考慮してください)

4

2 に答える 2

10

Android 4.0.1以降のCanvasのソースコードを調べましたが、次のとおりです。

/**
 * Retrieve the clip bounds, returning true if they are non-empty.
 *
 * @param bounds Return the clip bounds here. If it is null, ignore it but
 *               still return true if the current clip is non-empty.
 * @return true if the current clip is non-empty.
 */
public boolean getClipBounds(Rect bounds) {
    return native_getClipBounds(mNativeCanvas, bounds);
}


/**
 * Retrieve the clip bounds.
 *
 * @return the clip bounds, or [0, 0, 0, 0] if the clip is empty.
 */
public final Rect getClipBounds() {
    Rect r = new Rect();
    getClipBounds(r);
    return r;
}

したがって、質問に答えると、getClipBounds(Rect bounds)は1つのオブジェクトの作成から解放されますが、getClipBounds()は、呼び出されるたびに新しいRect()オブジェクトを実際に作成します。

于 2012-04-05T22:27:52.560 に答える
0

「getClipBounds()」の実際のメソッド宣言はこれです

  1. public boolean getClipBounds(Rect bounds)なので、呼び出すたびに新しいRectが作成されることはありません。この関数の引数として渡すRectオブジェクトを使用します。ここにリンクの説明を入力して ください。
于 2012-04-05T22:16:57.027 に答える