日記(958)

<前 次>

auto_resource実装案

Bomber丸Worldのリソース管理システム(auto_resource)のメモリ管理を考えていました。
メモリ確保のほうはshared_resourceと同じで全く問題ないのですが、メモリ解放が問題なのです。
メモリ確保をしていくうちにメモリが足りなくなったら最近使われていないものからメモリを解放していくのですが、その実装方法がいくつかあって、どれを選ぶべきかというのが難しかったのです。

考えている方法は三つあって、一つ目はその時点で使われていなければ新しかろうと古かろうと片っ端から全て解放してしまうというものです。
解放の際には全てのリソースが入っているコンテナの中身を全て走査して参照カウントが0のものを全て解放します。
この方法は最も実装が簡単で消費メモリも少なくなりますが、一時的に使わなくなったりソースを後のために取っておくというauto_resourceの考え方に反してついさっきまで使っていてまたすぐ使うかもしれないものまでどんどん解放していってしまいます。
マップ切り替えなどで一度に大量のリソースを読み込んで解放する場面ではすごくまずいことになります。

二つ目の方法は、字面通り最後に使われた時間が一番古いものから順番に解放してゆく方法です。
これを現実的な処理時間で実現しようと思えば、リソース参照用のファイル名-リソースを関連付けたマップのほかに、今まで使った順番に並べられたリストが必要になり、必然的にリソース本体とは別の余計なメモリが必要になります。
更にリソース側にも、解放や順番の並び替えの高速化のためにリストやマップへのイテレータが必要になります。
リストの実装によっては更に難しいコーディングが必要になるかもしれません。
そして当然、使用するたびに使用時刻の更新やリストの並び替えが発生するのでパフォーマンスは低下します。
ファイル読み込みによるパフォーマンス低下を嫌ってauto_resouceを作ろうとしたのに全く逆効果の可能性すらあるのです。
解放の際にはリストの末尾から順番に見て行って規定のメモリ以内に収まるか全て走査し終えるまで参照カウントが0のものを解放していきます。

三つ目の方法は、上記二つの中間を取って、ある時間より古ければ数が多かろうと少なかろうと全部解放してしまうという方法です。
これであれば、一つ目の方法ほど無駄は出ませんし、順番を考える必要が無いので二つ目の方法のようにリストを保持しておく必要がありません。
解放の際には適当にしきい時刻を決め、全てのリソースが入っているコンテナの中身を全て走査して参照カウントが0かつ使用時刻がしきい時刻より古い場合には解放します。
これの問題点は、しきい時刻の決め方やリソースの使用状況によって著しく性能が変化するということです。

それぞれ長所と短所がありますが、まず一つ目の方法は通常時には問題外ですが終了時に全てのリソースを解放する必要があるときには効果を発揮します。
二つ目はリソース自体の消費メモリが大きかったり使用するときの実行時間が長いなど、欠点が問題にならないほどスケールの大きいものであれば相対的に長所のみが残って最善の手段となります。
三つ目は二つの中間的なものなので無難としかいえません。
そんなこんなで、三つとも実装してみる価値はありそうです。

GChatの管理画面の改良を行いました。
まず、辞書画面での検索機能です。
これにより辞書への重複登録ということは少なくなったはずです。
そして、なぜか今までずっと実装していなかった全ログ確認機能。
これでもう直接ログファイルを見る必要はなくなったのです。
そんなこんなでアルニックもレベル29になりました。

自分用リンク集ver3

自分用のリンク集ページが出来上がりました。
まあ、早い話がお気に入りのPHPバージョンというわけですが。
あくまでも好みの問題なのですが、やっぱりサイドバーやメニューとしてのお気に入りよりウェブページのほうがよかったので。
そして、以前のバージョンではよく見る1ページ目の中にもほとんど見ないページがあったり、あまり見ないはずの2ページ目に実はよく見るページが紛れ込んでいたりして、手動でやっているとどうにもおかしくなるので、新バージョンではPHP+JavaScriptで自動化されています。
リンク集並べ替え機能は、JavaScriptで新しいウィンドウに目的のページを開いた後、呼び出し側のページで並べ替えスクリプト(PHP)を呼び出し、並べ替えが終わったら元のページへリダイレクトしてリンク集ページを再表示。
また、JavaScriptがOFFになっていたりブラウザの機能でクリックせずにリンクを開いた場合などは、通常のブラウザの機能としてなんら特別な処理をせずに通常の表示を行います。
この機能がまたリンクにマウスを置いた場合のステータスバーの表示の自然さを生み出します(リンクに直接JavaScriptを書いた場合は表面上無効なURLとなる)。
更に、管理ページは別ページではなくリンク集と同じページにした上JavaScriptで簡単にですが管理支援機能も作って、素早く管理できるようにしています。
また、リンク集そのものとは関係ありませんが、リンク集ページの隣にはフレームでよく使うツールを配置しています。

あれ

ついさっきですがゴキブリさんを捕獲しました。
背中の汚れ具合や足の少なさなどから見て幾多の苦難を乗り越えてきた勇者だと思われます。
処分については後で考えます。

粒子が勝手に動く

メモちらしのバージョンアップを行いました。
内容は、まあ、日記や履歴で書いてあることそのまんまなんですが、日記のほうに書いていない、つまり今日変更したのは、バグ修正です。
実を言うと、どことも繋がっていない粒子を動かなくするという新しい仕様がうまく働いていなくて、その修正のときに見つけたものなんです。
新たに追加した粒子が初期状態としてどことも繋がっていない場合は問題なかったんですが、逆に腕を全て切り離してどことも繋がらなくなった場合に腕がなくなったことを感知できずに動いちゃったんですね。
原因は変数名の間違いでした。
このバグがあると他にどんな影響があるのかはまだ調べてませんが、もしかしたら関係ないはずの粒子が変な動きをするかもしれません。

自分専用リンク集の新バージョンを作っています。
どうにも管理しにくくなってきたのでよくアクセスする順に自動で並び替えたり、実際やるかどうかはわかりませんが公開してるほうのリンク集にあるようにタグ付けで分類したりしようと考えてます。

メテオスオンライン

メテオスオンラインとやらが出るらしいですね~。パソコンで。
正直なところ、すごいと思ったところと、げんなりしたところが半々ぐらいで、差し引きなんとも思わないのと同じぐらいでした。
出そうで出なかったアイテムの登場や、滅亡条件の改良などがよかった一方、わざと削られていたはずの横移動の出現や、余計な地球人の登場など、メテオスとしてはあってはいけないと思っていたようなことが次々起こっていたりもしました。
惑星エディットができるんなら悪いところ全部帳消しにして買っちゃうんだけどな。
いや、あっても買わないかもしれないけど。

Bomber丸Worldのshared_resourceの改良版、auto_resourceの仕様を考えています。
shared_resourceの問題点は、参照カウントが0になるとすぐメモリを解放してしまう点で、0になった直後に同じリソースを使おうとすると無駄に解放と再生成の時間がかかってしまうわけです。
また、ファイル名とファイルタイプは基本的に一対一に対応するため、ファイル名でリソースを管理するshared_resouceは、読み込みアルゴリズムさえそれぞれに対して作ってやれば、内容そのものの管理はリソースの種類ごとに作らずとも一つのクラスで充分まかなえるわけです。
そんなわけで、本当に解放が必要になるときまでメモリを解放せず、リソースをその種類によらず一元管理するauto_resourceを作ろうというわけです。

XMLは、プログラム内に直接書くということも考えられるのでテキスト形式にすることに決めました。

XMLパーサ試作型

Bomber丸Worldに使うデータの一般的な書式について考えています。
アニメーション定義ファイルにせよキャラクター定義ファイルにせよ、省略記法により手作業の手間を省くつもりが却って全体の見通しが悪くなって様々な問題を引き起こしてるんですね。
融通の利かない仕様でデータ一つ一つに対して新たなプログラムを作り直す必要があるし、手作業を前提としたファイル構造のためプログラムでの生成が難しくなったりもしました。
そこで、融通が利き、拡張性が高く、なおかつゲーム向き、そういうのがほしくなったわけです。
で、とりあえず一つのアルゴリズムでいろんなデータを読み込めて、わりと自由に要素を作れるXMLというものに着目してみました。
特定用途に使うものであり、なおかつ専用ソフトを使って編集する可能性が高いということで、読み書きに都合の良いように独自のアレンジを加えるというのもありかもしれません。
タグの管理は、同じタグがいくつもあるということもありうるのでmultimapで管理するとよいでしょうか。
もっとも、XMLのような考え方を使うとすると、正確にXMLである必要が無いどころか、実際が全くXMLからかけ離れた内容でも大きな問題はなく、初めから専用エディタでのみ作るという前提にすれば、バイナリ形式で構造的にXMLのような、というのもありかもしれません。

ピキーン!

爆ボンのページを更新しました。
今回はいろんなステージの実際のクリアタイムです。
基本的にカード5狙いのときのクリアタイムを記録しています。
どきどきモードのアイテム集めのついでだったんですが、ブラックシティ1面で少し失敗してしまいまして、変なところでアイテム集めが滞ったりしています。

レゴのお城のページが更新完了です。
前から見たバージョンと後ろから見たバージョン、部屋を閉めたバージョンと開けたバージョンの計4つの画像があります。

メモちらしの改良をしました。
マウスの下にある粒子を光らせたり作成中の腕が粒子に吸い付くようにしたり、見た目部分での改良です。
マウスを動かしてると粒子が明滅したり、腕の先端がどこかの粒子に近付くとピキーン!とくっついたり、実用性を考えてのことだったのに、楽しさのほうをが強く感じられてしまいます。

1160923244.png

<前 次>