私は現在、iPad2 をハードウェア プラットフォームとしてターゲットにしている Adobe AIR アプリケーションに取り組んでおり、画面の 1 つで適切なスクロール パフォーマンスを得ることができません。次のようなカスタム アイテム レンダラーを使用して、スパーク リストを使用しています。
<s:List id="productList" top="116" bottom="0" left="10" right="10"
width="100%"
visible="true" includeInLayout="true"
height="0"
maxHeight="500"
opaqueBackground="#ffffff"
itemRenderer="myRenderer">
</s:List>
もともと、私は .mxml レンダラーを使用していましたが、パフォーマンスの悪さを見てから、UIComponent を拡張して自分で作成することにしました (水平方向のスペースを節約するために、パッケージとブレースを省略しました)。
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;
import mx.events.FlexEvent;
import mx.utils.ColorUtil;
import spark.components.Label;
import spark.components.TextInput;
public final class OrderViewProductLineTestIR extends UIComponent implements IListItemRenderer
{
public function OrderViewProductLineTestIR()
{
super();
}
// Internal variable for the property value.
private var _data:Object;
private var productName:Label;
private var orderQty:TextInput;
private var stockQty:TextInput;
// Make the data property bindable.
[Bindable("dataChange")]
// Define the getter method.
public function get data():Object
{
return _data;
}
// Define the setter method, and dispatch an event when the property
// changes to support data binding.
public function set data(value:Object):void
{
_data = value;
invalidateProperties();
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}
override protected function createChildren():void
{
super.createChildren();
productName = new Label();
// productName.visible = true;
addChild(productName);
orderQty = new TextInput();
addChild(orderQty);
stockQty = new TextInput();
addChild(stockQty);
}
override protected function commitProperties():void
{
super.commitProperties();
productName.text = _data.Name;
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
productName.move(0, 0);
productName.setActualSize(250, 48);
orderQty.move(270, 0);
orderQty.setActualSize(100, 48);
stockQty.move(390, 0);
stockQty.setActualSize(100, 48);
}
override protected function measure():void
{
super.measure();
measuredWidth = 490;
measuredHeight = 48;
}
}
ご覧のとおり、これはかなり軽量ですが、私のデータ プロバイダーには 100 個以上の項目が含まれており、そのうち 11 個を一度に画面に表示できます。スクロールのパフォーマンスの向上について読んだことはすべて、 opaqueBackground
andを使用することを中心に展開してcacheAsBitmap
いますが、何を試してもここでは役に立ちません。リスト レベルで使用cacheAsBitmap
しても、数行以上スクロールするとアイテム レンダラーのリサイクルが開始され、全体を再レンダリングする必要があるため役に立ちません。また、アイテム レンダラー レベルで使用すると、高速スクロール — おそらく、非常に高速なスクロール中に多くが一度にリサイクルされているためです。
iPad が 60 fps でフレーム内の画面いっぱいの情報を問題なくブリッティングすることはわかっていますが、すばやくスクロールすると、10 fps にするのに苦労しています (視覚的に)。質問:明らかなことを見落としていたのでしょうか、それとも AIR を使用する際に関係するレイヤー (およびベクター レンダリング) の数が原因で、これが予想されるのでしょうか? 記録として、アプリケーションのレンダリング モードを変更し、フレーム レートを変更して明らかな問題を排除しようとしました。