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


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

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2010/04/11 00:49:19
  • 終了:2010/04/13 13:02:27

回答(1件)

id:heke2mee No.1

heke2mee回答回数162ベストアンサー獲得回数432010/04/13 07:33:54

ポイント60pt

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


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オブジェクト 管理対象外

id:mijusawa

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

2010/04/13 13:02:15
  • id:Km1967
    42MBの巨大ファイルを落として、なおかつC++でコードを書けとな?
    一応落としてみたが、パワポのランタイムまで強要しよるわ、しゃべるわ、ページは多いわで面倒じゃ。

    あまりにウザイ資料じゃから目的部分を探すのはやめたが、ざっくり見てもシンプルなコードで難しくはなさそうじゃ。あれで理解できんならC++で書いても理解できるとは思えん。
    下手な回答を拒否する目論見だろうが、あまりにも酷すぎやしないか?

    ・・・とワシは思うぞ。
  • id:mijusawa
    コメントありがとうございます。
    目的部分は簡単な絵しか書いてないんですよ。。。
    それに言語問わず良く使われるテクニックなのかなと思いまして。
  • id:Km1967
    どの絵かも判らぬが、ゲームであれば大量の要素を一気に入れ替えるなどもあるからして、そういう事だけの話ではないかのぉ。 まぁ、見てはおらぬからあてずっぽうじゃがな。 ワシはここまでじゃ。多分もう寝る。またキャンセルにならねば良いな。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません