人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

要素交換(Swapped Array)ってどのようなコンテナですか?C++でコードを示して具体的に教えてください。

以下に書かれている内容です。C#みたいですが読んでも理解できません。
http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx
XNA Framework のパフォーマンス

●質問者: mijuswa
●カテゴリ:コンピュータ
✍キーワード:C# C++ Framework XNA コンテナ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● heke2mee
●60ポイント

わたしが理解した範囲での説明ですので間違っているかもしれません。


Swapped Arrayは単純に固定長の配列とアクティブなオブジェクトをカウント変数を使ってと管理すると言ってるだけです。


管理配列[100]で定義していてオブジェクトが5つセットされている場合は

次のようになっています。


カウント 5

管理配列[0]・・・Aオブジェクト

管理配列[1]・・・Bオブジェクト

管理配列[2]・・・Cオブジェクト

管理配列[3]・・・Dオブジェクト

管理配列[4]・・・Eオブジェクト

管理配列[5]

管理配列[99]


この状態から管理配列[2]を消す場合に5個目の配列(管理配列[4])と管理配列[2]の要素を

入れ替えてカウント数を4に減らします。そうすることで配列の4番目までが有効な

オブジェクトだと分かります。


【なぜ入れ替えなのか?】

GCを回避するためです。GCが発生すると処理が重くなるのでゲームなどスピードを重視

するものはステージの切り替えなどのタイミング以外では発生させたくないからです。


ArrayListやList<T>などで管理していた場合、リストからオブジェクトを外すと

そのオブジェクトが誰からも参照されなくなりGCの対象になります。

.NETはGCによってメモリの回収を行います。GCはアプリケーションから到達不可能な

メモリを回収対象とします。


そこでSwapped Array(一般的な呼び方かは知りません)ではカウントの外側の

配列と交換することで、参照状態を保ちながら管理対象外と分かるようにしています。

ただSwapped Array方式は配列を交換するためオブジェクトの順番に意味があるようなものには

使えません。


また次のような状態の時にオブジェクトを1つ追加した場合、管理配列[2]の位置に

追加しますが、初めに入っているCオブジェクトをどこかに移動しないと参照が

途切れてしまうのでCオブジェクトがGCの対象になってしまいます。


カウント 2

管理配列[0]・・・Aオブジェクト

管理配列[1]・・・Bオブジェクト

管理配列[2]・・・Cオブジェクト 管理対象外

管理配列[3]・・・Dオブジェクト 管理対象外

◎質問者からの返答

回答ありがとうございます。おかげでスッキリしました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ