は変更イベント
質問の基本的な前提を省略しないでください間違っています。
機能が変更されると、マップは次のアニメーションフレームで再描画を要求します。しかし、複数の機能が同じ実行スレッド内で変更された場合、ブラウザはスクリプトが終了するまで何も再描画しません。 1回の再描画だけで何百万ものフィーチャーをループして変更することができます。
レンダリングがpostrender
イベントを聞くことによって行われているときは、確認することができます。
map.on('postrender', function(event){
console.log('did render', new Date())
})
your answerで提案されているようにあなたは、任意のイベントをトリガすることなく、ジオメトリを設定することができます。しかし、そのようにすると、ソース内の壊れた空間インデックスなどの問題が発生する可能性があります。誰かがその変更に関心がないことを確実に知っている場合にのみ、変更イベントを省略する必要があります。
そこにどのような遅延がありますか?
それでも、多くの機能を更新するとパフォーマンスは低下します。私は、this demoと書いています。これは、各地図上のすべてのフィーチャのジオメトリを置き換えます。私のラップトップでは、10,000個のジオメトリすべてを交換するのに約600ミリ秒かかる。その間、マップとブラウザは応答しなくなり、次回の再描画まで更新内容は表示されません。再描画の時間はズームレベルによって異なります。
- が前の形状にされたリスナーを削除し、それのプロパティ
- にジオメトリを追加します。設定機能のジオメトリ、それはなります
。
- 変更リスナーを新しいジオメトリに追加します。
- リスナーに変更イベントが発生したことを通知するためにchangeイベントをトリガーします。特徴のリスナーのオン
するソース、次のようになります使用する場合
- は、空間インデックスを更新します。
- リスナーに変更イベントが発生したことを通知するためにchangeイベントをトリガーします。
レイヤーと最終的にマップはこれらの変更を通知し、再描画をキューに入れます。
可能な最適化
あなたはよりパフォーマンスの方法で多くの機能を変更できるようにしたい場合は、私が考えることをお勧めしたい:述べたように、空間インデックス
を無効
docsでは、useSpatialIndex
をfalseに設定すると、状況によってはパフォーマンスが向上することがあります。空間インデックスがないと、ソースは各フィーチャの変更で行う計算が少なくなります。ただし、索引がなければ、ソースの他の用途はパフォーマンスが低下する可能性があります。
ジオメトリを変更する代わりに、幾何学的にsetCoordinates
を使用して
それを置き換えるには、機能上のsetGeometry
を使用するよりも高速です。ジオメトリインスタンスの作成全体をスキップすることができ、リスナを変更する必要はありません。これは、フィーチャがジオメトリの唯一の「所有者」である場合など、ジオメトリを変更できると想定しています。これは、質問の意図に反して小さな塊
に機能の変更を分割しようとすると
。機能を変更するのに多くの時間がかかる場合は、レンダリングをより頻繁に開始することをお勧めします。そうすれば、地図のレスポンスが向上し、ブラウザがイベントやその他の保留中のタスクを処理できるようになります。
これはパフォーマンス上の問題であることを示す実際のデータはありますか? OpenLayersはこれを非常に効率的に処理する必要があり、早すぎる最適化は一般的には悪い考えです。 –
レイヤーとソースのchangeイベントを聞きました。機能が更新されるたびに(それぞれの機能)、リビジョン番号が増えます。変更イベントが発生します。 – psyntium
これは、ol3が各機能の変更に対して新しいレンダリングを行うことを意味するものではありません。プロファイラを使用して実際に問題があるかどうかを確認しようとしましたか、少なくともレンダリング関連のイベントを聞いてみましたか? –