概念
コンテンツ・オンデマンド機能は、SDM モデル・オブジェクトの細分度で作動します。
コンテンツ・オンデマンドは、以下の概念を使用しています。
コンテンツ・コントローラー
コンテンツ・コントローラーは、各モデル・オブジェクト状態を維持します。
モデル・オブジェクトは、次の 3 つの状態のいずれかになります。
- ロック - オブジェクト・コンテンツがロードされて使用中です。
- ロード - オブジェクト・コンテンツがロードされているが、ロックはされていません。 キャッシュされていると見なされ、キャッシュがフルになるとアンロードされます。
- アンロード - オブジェクト・コンテンツはロードされていません。
ユーザー要求、ズーム、パンの変更 (実際には表示可能領域の変更) などのイベントの発生後に状態が変更されます。
そこでコントローラーは、オブジェクト・セットのロードあるいはアンロードを明示的に指示する通知を送信します。
通常、オブジェクト・コンテンツのライフサイクルは、アンロード、次にロック、その次に ロード、その後、場合によってはアンロードに戻るという順序になります。
キャッシュは、仮想です。オブジェクト・コンテンツは、SDM モデルに保持されます。
状態がロードに変更されると、これは単にコンテンツがモデルに残るという意味です。
実際に、SDM モデルはオブジェクト・コンテンツ用にキャッシュを実装し、コントローラーがこのキャッシュを管理します。
コントローラーには、オブジェクト状態が、ロードおよびアンロードのコマンドを処理するハンドラーと共に含まれます。
キャッシュ・サイズの調整
キャッシュ・サイズに極端な値を指定すると、コンテンツ・オンデマンドの動作に根本的な影響を与えます。
- ヌル (0) のキャッシュ・サイズ: オブジェクトは、使用中 (ロック) またはアンロード済みのいずれかになります。 この値は、メモリー消費を最小限にする場合に使用します。
- 無限のキャッシュ・サイズ: オブジェクトは必要時にロードされますが、アンロードされることがありません。 これは、純粋な遅延ロードの動作です。
他のキャッシュ・サイズ値の場合、オブジェクトはロックされたときにロードされて、フラッシュ (FIFO 方式) されるまでキャッシュに残り、平均的なメモリー・サイズをほぼ一定に保ちます。
オブジェクトがロック要求を受けると、再度ロックされるオブジェクトをアンロードしないように、先にオブジェクトがロードされてからキャッシュがパージされます。
これは、キャッシュを一時的に予想サイズより大きくできることを意味しています。
ロック要求
ロック要求とは、オブジェクトをロック、ロード、またはアンロードさせるためにコントローラーに送信されるイベントです。
2 つのタイプのイベントがあります。
- 領域イベント - コントローラーに、特定の領域に含まれるすべてのオブジェクトをロックするよう要求します。 モードは、既にロックされているオブジェクトをロック状態のままにしておくか、それともアンロックすなわちロードするかを示します (後者がデフォルトです)。 通常、この領域は、表示されるすべてのオブジェクトをロードするために、メイン・ビューの表示部分から計算されます。
- セット・イベント - ユーザーが、コントローラーに、特定のオブジェクト・セットをロック、ロード、またはアンロードする要求を送信します。 例えば、ドリルダウン機能では、選択したオブジェクトのコンテンツをロードします。
どちらのタイプのイベントも、非排他的です。領域イベントのあとにセット・イベントが続く場合も、その逆の場合もあります。
通知
コントローラー自身は、SDM モデル・オブジェクトのコンテンツのロード方法はわかりません。
要求に応じて、ハンドラー、IlvContentHandler を呼び出します。これが、SDM モデルをアップグレードすることでロード操作とアンロード操作を実行します。
その後、通常の SDM モデル通知が、グラフィック表示のカスタマイズおよび更新のために引き継ぎます。
オブジェクト状態がアンロードからロックまたはロードに変更されると、ロード・イベントが送信されます。
オブジェクト状態がロックまたはロードからアンロードに変更されると、アンロード・イベントが送信されます。
ロードとロックの間の状態変更のときは通知は送信されません。
![アンロード状態を上部に、ロック状態およびロード状態を下部に示すダイアグラム。
ロック状態およびロード状態からアンロード状態に引かれた矢印に、アンロード・イベントを示す文字「U」のラベルが付けられています。
アンロード状態からロック状態またはロード状態に引かれた矢印に、ロード・イベントを示す文字「L」のラベルが付けられています。](../../JViews_Diagrammer/usrextdiag/_media/CoD5_default.png)
マルチスレッド化
ハンドラーは、非同期で動作できます。すなわち、コントローラーがオブジェクトのロードを要求すると、ハンドラーは、そのオブジェクトに「ロック」のマークを付けますが、その間にオブジェクトが別のスレッドでロードされている可能性があります。
いずれにしても、ハンドラーは、アクションの完了時に SDM モデルに通知する必要があります。
ロック要求は同期化されて、ハンドラーは、イベントの完了までコントローラーの同期ロックを保持します。
SDM モデルの変更
コントローラーは、以下の場合に SDM モデルの構造上の変更を認識します。
IlvSDMEngine.setModel()
が新規モデルを設定する場合。すべてのオブジェクトは、ハンドラーへの通知なしにアンロードされます。- SDM モデルがオブジェクトを削除する場合。そのオブジェクトは、ハンドラーへの通知なしにコントローラーでアンロードされます。
要約すると、コントローラーは、モデルの使用されなくなったオブジェクトについては無視します。