0

Rectで文字を表示するアイテムレンダラーを最適化する過程にあります。テキストを動的に設定するアクションが遅いことに気付きました。現在、テキストがハードコーディングされた既製のオブジェクトをアイテム内に作成することを考えています。レンダラーには、使用する代わりに適切なテキストオブジェクトを選択するためのスイッチがあります.text =。レンダラーを最適化する方法について他のアイデアはありますか。これは、画面に約100個のレンダラーを表示するタイルレイアウトです。

また、レンダラーで使用できる最も安価な(パフォーマンスワイズ)テキストオブジェクトは何ですか?

ありがとう

<!-- DNA Plus -->
<s:Group height="26" width="100%" y="20">
    <s:Rect id="backgroundTop" left="0" right="0" top="0" bottom="0"
            alpha="{(data as MiniBrick).brick.strand == StrandEnum.PLUS.value ? 1 : 0.7}">
        <s:fill>
            <s:SolidColor id="bgFillTop" color="{BrickColors.getColor((data as MiniBrick).brick)}"/>
        </s:fill>
    </s:Rect>

    <s:Rect id="selectedBackgroundTop" left="0" right="0" top="2" bottom="1" includeIn="selected">
        <s:fill>
            <s:SolidColor id="sBgFillTop" color.selected="0xB6E0F2"/>
        </s:fill>
    </s:Rect>

    <!--- @copy spark.components.supportClasses.SkinnableTextBase#textDisplay -->
    <s:Label id="textDisplayTop" width="100%" top="4" fontFamily="Consolas" text="{(data as MiniBrick).origin}"
             fontSize="20" lineBreak="explicit" verticalAlign="middle" textAlign="center"/>
</s:Group>


<!-- DNA Minus -->

<s:Group height="26" width="100%" y="46">
    <s:Rect id="backgroundBottom" left="0" right="0" top="0" bottom="0" 
            alpha="{(data as MiniBrick).brick.strand == StrandEnum.MINUS.value ? 1 : 0.7}">
        <s:fill>
            <s:SolidColor id="bgFillBottom" color="{BrickColors.getColor((data as MiniBrick).brick)}"/>
        </s:fill>
    </s:Rect>

    <s:Rect id="selectedBackgroundBottom" left="0" right="0" top="1" bottom="2" includeIn="selected">
        <s:fill>
            <s:SolidColor id="sBgFillBottom" color.selected="0xB6E0F2"/>
        </s:fill>
    </s:Rect>

    <!--- @copy spark.components.supportClasses.SkinnableTextBase#textDisplay -->
    <s:Label id="textDisplayBottom" width="100%" top="4" fontFamily="Consolas" text="{DnaDictionary.getComplementSequenceOneLetter((data as MiniBrick).origin)}"
             fontSize="20" lineBreak="explicit" verticalAlign="middle" textAlign="center"/>
</s:Group>

<!-- DNA index [tick list] -->
<s:Group width="15" id="dnaTick" y="72">
    <s:Rect horizontalCenter="0" width="2" height="2" radiusX="1">
        <s:fill>
            <s:SolidColor color="#666666"/>
        </s:fill>
    </s:Rect>
    <s:Label id="dnaTickLabel" horizontalCenter="0" y="5" height="9" color="#888888" fontFamily="Arial" fontSize="9"
             textAlign="left" />
</s:Group>

<s:Line id="firstMiniBrickInBrickLine" x="0" y="20" yFrom="72">
    <s:stroke>
        <s:SolidColorStroke caps="none" color="#FFFFFF" weight="1"/>
    </s:stroke>
</s:Line> 
4

1 に答える 1

0

質問に直接答えるには:テキストを表示するための最も最適化された方法は、UITextFieldクラスを使用することです。ただし、UIComponentから継承されないため、ItemRendererに実装するのは困難です。

また、それはあなたのコードで最大のパフォーマンス向上がなされるところではありません。最大の問題は、このレンダラーに6つのデータバインディングがあることです。画面に100個のアイテムがある場合、600人のリスナーがデータの変更を監視します。

したがって、次のように、これらのバインディングをすべて削除し、ItemRendererのdataセッターをオーバーライドしてこれらのプロパティを設定する必要があります。

override public function set data(value:Object):void {
    super.data = value;

    var brick:MiniBrick = value as MiniBrick;
    backgroundTop.alpha = brick.brick.strand == StrandEnum.PLUS.value ? 1 : 0.7;
    bgFillTop.color = BrickColors.getColor(brick.brick);
    ...
}

さらに最適化する場合は、レンダラーの情報をデータに直接配置して、毎回評価する必要がないようにし、次のように記述できるようにすることをお勧めします。

override public function set data(value:Object):void {
    super.data = value;

    var brick:MiniBrick = value as MiniBrick;
    backgroundTop.alpha = brick.alpha;
    bgFillTop.color = brick.color;
    ...
}
于 2012-08-26T15:46:03.383 に答える