「新しいリーダーの作成」で説明した折れ線リーダーは、多数の一時オブジェクトを生成するため、最善とはいえません。折れ線を読み込むたびに、一覧、続いてメモリーが割り振られ、ポイントを保存します。このため、ファイルの折れ線の数が非常に多い場合、メモリーが断片的になり、「ガーベッジ・コレクター」処理が頻繁に実行されるため、パフォーマンスを損なう可能性があります。
パフォーマンスを向上させるため、単純な折れ線リーダーを最適化して、 IlvMapFeatureIterator が常に IlvMapFeature. ポイント保存用の一覧は、これらのポイントを初めて読み込んだときに 1 度だけ割り振られます。その後に読み込む場合、一覧は必要な場合のみ再割り当てされます。これを可能にするためには、 getNextFeature メソッドが返した地図機能が揮発性で、メソッドを再呼び出しする前に、ジオメトリーと属性を使用する必要があります。 IlvMapFeatureIterator インターフェースを実装する JViews Maps ライブラリーにあるすべてのリーダーは、このように動作します。
この最適化されたレンダラーのサンプル・ソース・コード一式は、以下のファイルにあります。
クラス
OptimizedPolylineReader
の readPolyline
メソッドは、 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);