日記/2007-02-08 のバックアップ(No.3)

お名前:

Glenelgで攻撃速度改善を渋っているのは、時間が取れていないという点もさることながら、 その対応が大量のMove()を吐き出してしまう、という点への懸念もあります。
もし将来その対応をGlenelgにいれたとしても、それはあくまでオプションレベルにするつもりです。

つーか・・・みんな結局利己主義ってことなんだよね。
いや、利己主義は友瀬もそうだから否定しないけどさ。

昔AI開発がはじまった当初、
「標準AIは追従移動が遅い」
→「標準AIは追従セルに到達してから、再度移動するから遅い。
  移動中にも随時Move()をすればだいじょぶだよ」
→「それすると大量の移動パケットを出すのがお行儀悪い」
・・・って議論があって、各AI、それを出さないように改善したはず。

より負荷が高いはずの戦闘中に、そして本来はしなくていい移動をしてまで、 上記を覆すってのはどういうことかね、って。
多重Attackもそうだけどさ。


正確にいうと、結果として遅く見えているのが require 全体での処理。
どの部分が遅いのかは、現状判っていない。
つーかさすがに朝30分の調査だけじゃ、無理ですってば(^^;;

可能性はいろいろある:
ファイル検索に時間がかかるようになったのかもしれない。
requireの際、読み取っているファイル内容そのものをチェックしているのかもしれない。
読み込んだソースにあるGrobal変数の初期化:RO内のメモリ管理の方法が変わったのかもしれない。

とにかくいろんな意味で、調査は必要。

とりあえずやらなきゃならんと思っているのは、以下のことかな。

  1. コメント量による依存度確認。
    現状のソースに大量の無駄コメントを追加して、ロード性能が落ちるかどうか見てみる。
  2. AIフォルダでのファイル数。
    各種*.iniファイルは別フォルダに移動。検索に時間がかかっているなら、多少なりとも速くなるはず。
    逆に大量の無駄ファイル作成。検索に時間がかかっているなら、多少なりとも遅くなるはず。

どちらのケースにしても、iniファイルや地図情報に関しても同じ話があるはず。
可能な部分は多少なりとも速いrequireに差し替えないとならなんかな。

・・・メモリの話だったら、結構きついなぁ。
AIの作りではいかんともしがたい。


とりあえず明確に判ったこと。
AIの初期ロードの重さは、やはりソースをROに読み込む速度自体に問題がありそうだということがわかった。
iniファイルとか地図情報とか、ロードとAI動作が同時におきるとか、そういう点ももちろん影響はすると思うが、それ以前の根本的なrequireの総合的な速度の低下が起きていると見るのが妥当そう。

何を試したかというと・・・2つ。

  • 前提:Glenelgはいくつかのソースリストを持っており、従来はその全てのソースリストを「AImain() がロードされたとき」に連鎖的・一気にrequireしていた。この場合、ホム召喚直後は敵描画すら滞ってしまう。起動直後はホムとケミしか見えないが、一拍おいて敵が表示されるような感じ。
    そこで以下のようなことを試してみた。
  1. 最初、ホム召喚後の数AIサイクルは、本当になにもせずにAI離脱するようなソースを導入した。
    →それでも初期起動時に固まる。
    →AI()部分はほとんど何もしていないのだから、GlenelgのAIの作り的・アルゴリズム的な初期化プロセスの複雑さ・重さ以前に、なにか重いことが起きている。
    →考えられるのはrequireしかない。
  2. 初期ロード方法変更:「AIサイクルがくるたびに、少しずつrequire」するようにしてみたところ、ロード時は多少ラグっぽくはなるが十分ケミが活動できるような感じに なった。
    requireタイミング以外なにも変更がないのに重さが変わるという時点で、AI挙動の複雑さ以前にrequireが重くなっている、ということ。

つまり、単純にAIソースの総合的大きさが大きいだけで、初期動作が重くなるということ。

分割requireをすることで、現状よりは多少ましになる、ということは事実だが、もちろん、上記はあくまでテスト。
現状のGlenelgにただ単にこのような初期化方法を適用するだけでは、ホム召喚後数瞬はホムは一切駆動しないため実用品ではない。
故に、現状そのままそれを正式版としてリリースはしない。
だが、現状は結構深刻だと思うので、一応ここにテストパッチは置いておく。
興味がある方は上書きしてみてほしい。
(テスト用パッチfor0.46:AImain.lua ソースそのものなので、上書きすること。)

ともあれ、そういう意味での改善の道は見えた:初期ロードではとりあえず追従動作とゼロ距離反撃程度の最低限の仕組み部分だけをrequireして動作させ、他のモジュールのrequireが完了したら完全動作するように切り替えればいい。
これによって、初期活動はそれなりに軽量で、完全にrequireできたら高機能、というような動きが可能なはず。

逆にいうと、上記のような考えで行くならば、「機能を削ってでもシンプル・小型ソース」ではなく、「全体としては複雑でも、段階ロード・動作できる高機能」というような道もありそう。
まあここまでくると、かなり夢物語っぽいですが。