リーダーの最適化

新しいリーダーの作成」で説明した折れ線リーダーは、多数の一時オブジェクトを生成するため、最善とはいえません。折れ線を読み込むたびに、一覧、続いてメモリーが割り振られ、ポイントを保存します。このため、ファイルの折れ線の数が非常に多い場合、メモリーが断片的になり、「ガーベッジ・コレクター」処理が頻繁に実行されるため、パフォーマンスを損なう可能性があります。
パフォーマンスを向上させるため、単純な折れ線リーダーを最適化して、 IlvMapFeatureIterator が常に IlvMapFeature. ポイント保存用の一覧は、これらのポイントを初めて読み込んだときに 1 度だけ割り振られます。その後に読み込む場合、一覧は必要な場合のみ再割り当てされます。これを可能にするためには、 getNextFeature メソッドが返した地図機能が揮発性で、メソッドを再呼び出しする前に、ジオメトリーと属性を使用する必要があります。 IlvMapFeatureIterator インターフェースを実装する JViews Maps ライブラリーにあるすべてのリーダーは、このように動作します。
この最適化されたレンダラーのサンプル・ソース・コード一式は、以下のファイルにあります。
クラス OptimizedPolylineReaderreadPolyline メソッドは、 IlvMapLineString ジオメトリーを構成するポイントを 0 にリセットします。ここでは、このジオメトリーはクラスのフィールドとなります。
 geometry.removeAll();
読み込まれた各折れ線は、座標バッファーに保存されます。IlvCoordinate の新しいインスタンスは、読み込み中の折れ線のポイント数が、以前読み込んだ折れ線の数よりも多い場合のみ作成されます。
if (currentPointNum < oldPointNum) {
  // Use an IlvCoordinate that was already allocated.
  c = (IlvCoordinate)points.elementAt(currentPointNum);
} else {
  c = new IlvCoordinate();
  points.addElement(c);
}
折れ線ポイントの x,y 座標が読み込まれると、このポイントはジオメトリーに追加されます。ジオメトリーは、以前読み込んだいずれかのジオメトリーに、少なくとも現在読み込み中のジオメトリーと同じ数のポイントがある場合、addPoint メソッドがメモリーを再割り当てしないように実装されます。
  geometry.addPoint(c);
また、ジオメトリー属性は、OptimizedPolylineReader クラスのフィールドとして保存され、readPolyline メソッドで変更されます。
if (buffer.length() > 0) {
  stringAttribute.setString(buffer.toString());
  attributeProperty.setAttribute(0,stringAttribute);
} else {
  attributeProperty.setAttribute(0,null);
}
feature.setAttributes(attributeProperty);