もどる
fire1.gif オブジェクト生成回りの高速化 00/03/25
今作ってる「火の玉デモ」は一秒間に50回、2個のオブジェクトを作ります、 つまり、秒間100個のオブジェクトを作っているわけです。なんか、これって結構 重そうなので、高速化してみない?って話になりました。

高速化の方法はいたってシンプルです。
オブジェクトの生成に時間がかかる、っていう仮定を立てているので、 先にオブジェクトを作っておいて、それを使いまわそう、っていう方法です。 こうすると、オブジェクト生成の際のメモリ確保がいらなくなり、 高速化が見込める、というわけです。

流れとしては、次のようになります。

1.オブジェクトを作っておく
2.リストに、作っておいたオブジェクトのポインタをいれる

オブジェクトを使いたいときは次のようになります。

1.リストの中に使いたいオブジェクトが存在するかを検索
2t.見つかった場合、そのポインタを返す
2f.見つからなかった場合、コンストラクタを呼び出してメモリを確保する

今回やってみたやつのクラス構成は以下のとおりです。
fig.1
目的の型のオブジェクトの探し方ですが、DELPHIで使うことのできるオブジェクトは 「TObject」というクラスから派生しています。この「TObject」というクラスには 「ClassName」というメソッドがあり、これでクラスの型の名前を知ることができるので、 これを利用します。
オブジェクト探しを関数にするとき、どうやって「オブジェクトの型」を渡すかですが、 オブジェクトの型は「TClass」として定義されているみたいなのでこれを使います。 実際に擬似的なコードにすると・・・


function FindObject(AClassName:TClass):TObject;
var i:Integer;
    object:TObject;
begin

  result:=nil; //とりあえず見つからなかったことにしておく

  //リストに入っているオブジェクトを調べる
  for i:= 0 to List.Count-1 do begin
      object:=List[i];
      if object.ClassName = AClassName.ClassName then begin
         //発見!!
         result:=object;
      end;
  end;

end;
こんな感じですかね。なぜ、文字列で調べてるかっていうと、 「is 演算子」で調べると、目的にクラスの子クラスも判定してしまうからです。 このへんはヘルプに詳しく載ってますんで(逃げ)。

と、早足でひとりでくっちゃべってしまいましたが、参考になれば幸いです。 注意としては、検索にも時間がかかるということ。もし検索にメモリの確保よりも 時間がかかりそうなら、素直にメモリ確保するべきです。でないとかえって遅くなります。 とはいえ、メモリの確保が頻繁に起こらなくなるので動作は安定します。 結局、どう使うかはプログラマ次第なので、使うならうまく使うようにしましょう。

次へ進む





もどる