auto_resourceメモリ解放
auto_resourceのリソースのメモリ解放もとりあえずできました。
あとは動作チェックと更なる改良だけですね。
auto_resourceのリソースのメモリ解放もとりあえずできました。
あとは動作チェックと更なる改良だけですね。
auto_resourceのリソースのメモリ確保のほうは大方できました。
あとはメモリ解放のほうですね。
Bomber丸Worldのリソース管理システム(auto_resource)のメモリ管理を考えていました。
メモリ確保のほうはshared_resourceと同じで全く問題ないのですが、メモリ解放が問題なのです。
メモリ確保をしていくうちにメモリが足りなくなったら最近使われていないものからメモリを解放していくのですが、その実装方法がいくつかあって、どれを選ぶべきかというのが難しかったのです。
考えている方法は三つあって、一つ目はその時点で使われていなければ新しかろうと古かろうと片っ端から全て解放してしまうというものです。
解放の際には全てのリソースが入っているコンテナの中身を全て走査して参照カウントが0のものを全て解放します。
この方法は最も実装が簡単で消費メモリも少なくなりますが、一時的に使わなくなったりソースを後のために取っておくというauto_resourceの考え方に反してついさっきまで使っていてまたすぐ使うかもしれないものまでどんどん解放していってしまいます。
マップ切り替えなどで一度に大量のリソースを読み込んで解放する場面ではすごくまずいことになります。
二つ目の方法は、字面通り最後に使われた時間が一番古いものから順番に解放してゆく方法です。
これを現実的な処理時間で実現しようと思えば、リソース参照用のファイル名-リソースを関連付けたマップのほかに、今まで使った順番に並べられたリストが必要になり、必然的にリソース本体とは別の余計なメモリが必要になります。
更にリソース側にも、解放や順番の並び替えの高速化のためにリストやマップへのイテレータが必要になります。
リストの実装によっては更に難しいコーディングが必要になるかもしれません。
そして当然、使用するたびに使用時刻の更新やリストの並び替えが発生するのでパフォーマンスは低下します。
ファイル読み込みによるパフォーマンス低下を嫌ってauto_resouceを作ろうとしたのに全く逆効果の可能性すらあるのです。
解放の際にはリストの末尾から順番に見て行って規定のメモリ以内に収まるか全て走査し終えるまで参照カウントが0のものを解放していきます。
三つ目の方法は、上記二つの中間を取って、ある時間より古ければ数が多かろうと少なかろうと全部解放してしまうという方法です。
これであれば、一つ目の方法ほど無駄は出ませんし、順番を考える必要が無いので二つ目の方法のようにリストを保持しておく必要がありません。
解放の際には適当にしきい時刻を決め、全てのリソースが入っているコンテナの中身を全て走査して参照カウントが0かつ使用時刻がしきい時刻より古い場合には解放します。
これの問題点は、しきい時刻の決め方やリソースの使用状況によって著しく性能が変化するということです。
それぞれ長所と短所がありますが、まず一つ目の方法は通常時には問題外ですが終了時に全てのリソースを解放する必要があるときには効果を発揮します。
二つ目はリソース自体の消費メモリが大きかったり使用するときの実行時間が長いなど、欠点が問題にならないほどスケールの大きいものであれば相対的に長所のみが残って最善の手段となります。
三つ目は二つの中間的なものなので無難としかいえません。
そんなこんなで、三つとも実装してみる価値はありそうです。
GChatの管理画面の改良を行いました。
まず、辞書画面での検索機能です。
これにより辞書への重複登録ということは少なくなったはずです。
そして、なぜか今までずっと実装していなかった全ログ確認機能。
これでもう直接ログファイルを見る必要はなくなったのです。
そんなこんなでアルニックもレベル29になりました。
メテオスオンラインとやらが出るらしいですね~。パソコンで。
正直なところ、すごいと思ったところと、げんなりしたところが半々ぐらいで、差し引きなんとも思わないのと同じぐらいでした。
出そうで出なかったアイテムの登場や、滅亡条件の改良などがよかった一方、わざと削られていたはずの横移動の出現や、余計な地球人の登場など、メテオスとしてはあってはいけないと思っていたようなことが次々起こっていたりもしました。
惑星エディットができるんなら悪いところ全部帳消しにして買っちゃうんだけどな。
いや、あっても買わないかもしれないけど。
Bomber丸Worldのshared_resourceの改良版、auto_resourceの仕様を考えています。
shared_resourceの問題点は、参照カウントが0になるとすぐメモリを解放してしまう点で、0になった直後に同じリソースを使おうとすると無駄に解放と再生成の時間がかかってしまうわけです。
また、ファイル名とファイルタイプは基本的に一対一に対応するため、ファイル名でリソースを管理するshared_resouceは、読み込みアルゴリズムさえそれぞれに対して作ってやれば、内容そのものの管理はリソースの種類ごとに作らずとも一つのクラスで充分まかなえるわけです。
そんなわけで、本当に解放が必要になるときまでメモリを解放せず、リソースをその種類によらず一元管理するauto_resourceを作ろうというわけです。
XMLは、プログラム内に直接書くということも考えられるのでテキスト形式にすることに決めました。
Bomber丸Worldに使うデータの一般的な書式について考えています。
アニメーション定義ファイルにせよキャラクター定義ファイルにせよ、省略記法により手作業の手間を省くつもりが却って全体の見通しが悪くなって様々な問題を引き起こしてるんですね。
融通の利かない仕様でデータ一つ一つに対して新たなプログラムを作り直す必要があるし、手作業を前提としたファイル構造のためプログラムでの生成が難しくなったりもしました。
そこで、融通が利き、拡張性が高く、なおかつゲーム向き、そういうのがほしくなったわけです。
で、とりあえず一つのアルゴリズムでいろんなデータを読み込めて、わりと自由に要素を作れるXMLというものに着目してみました。
特定用途に使うものであり、なおかつ専用ソフトを使って編集する可能性が高いということで、読み書きに都合の良いように独自のアレンジを加えるというのもありかもしれません。
タグの管理は、同じタグがいくつもあるということもありうるのでmultimapで管理するとよいでしょうか。
もっとも、XMLのような考え方を使うとすると、正確にXMLである必要が無いどころか、実際が全くXMLからかけ離れた内容でも大きな問題はなく、初めから専用エディタでのみ作るという前提にすれば、バイナリ形式で構造的にXMLのような、というのもありかもしれません。
昨日に引き続いてふにゃさんの標準ステージ16面の攻略を書きました。
最難関の13・14面は後回しです。
今日レーザーの実験をやっていたらレーザー装置が壊れました。
どう考えても予想とはかけ離れた結果だなと思っていたら、レーザーのクセに切れかけの豆電球にも劣る弱々しい光しか出していなかったのです。
しかもなぜか替えのレーザーまで不発。
他の種類では成功していたので、結局問題のレーザーはデータとして使わないことになりました。
そうそう、Bomber丸WorldのためのHTML表示クラスを作り始めました。
なんせギャルゲーに特化したyaneSDKのHTML表示だと、RPGに使った場合、どうでもいいところばかりがパワフルで、ちょっとしたことに使おうとすると酷く不便なのです。
NeoMuplの最新版をアップしました。
今回の改善点は演奏準備中の表示をすることにしたことです。
機能追加というほどのことでもありませんが、今演奏しようとしている曲とタイトルバーに表示されている曲が一致しないという気持ち悪さは避けられます。
ただ、同時に色々未実装な物も乗せてアップしてしまったので使い勝手はむしろ全体として悪くなっているかもしれません。
Bomber丸WorldのライブラリのページのCBWTextDIB32とshared_resourceのページができました。
あまり説明らしい説明にはなっていないのですが。
あと、キャラの行動アルゴリズムのFollowとGotoの改良を考えています。
経路を考えるのが、経路を考える必要ができた瞬間1Fだけであり、たくさんのキャラクターが同時に動こうとしたとき処理落ちが起こる可能性が高いのです。
また、負担軽減のため探索深さを少なめに設定していたせいで探索範囲が狭くなり、遠くから追いかけるということができなくなっていました。
これは、探索する側が最短経路を探すから遅いのであって、追跡される側のほうが最短経路を求める手がかりを残しながら歩いていればよかったのです。
そして、手がかりは、一度に全部用意するのではなく小出しにしていくことで処理の負担を和らげます。
メモちらしのページに暴走について記述しましたよ。
ちょっと数値設定に対してデリケートすぎるんですね。
こちらのほうでは時間を掛けてやっと傷跡が戻ったところです。
とにかく極端なパラメータ変化は危ないようなのです。
Bomber丸Worldの属性攻撃について考えてます。
私は敵の属性がわからず力押しで戦ってしまうことがたびたびあり、自分のゲームでも同じようなことがみんなに起こったら嫌だなぁと思うのです。
属性を色分けしてみるとか、いっそのこと誰かが教えてくれるとか、ちゃんと考えてプレイできるような方法を考えているところです。
スクリプト作成講座の記事を書いています。
結構自分でも理解してなくてしどろもどろですが、書いているうちになんとなくわかってきたような気がするので明日ぐらいにはアップできそうな気がします。
Bomber丸Worldのトップページのランダムメッセージを実はこの前こっそりJavaScriptからPHPに入れ替えていたんですが、そのせいでindex.htmlを解析してダウンロードページを自動生成するプログラムに通らなくなってしまっていたので、自動生成プログラムのほうをPHPに対応させておきました。
そして、昨日のバトル2の更なるアレンジ曲を今日作っていました。
テンポを一定にすると結構変わるものですね。
一応このアレンジは大ボス用のアレンジであり、バトル2はザコ・中ボス用です。
メモちらしの長さ自動調整アルゴリズムを考えるため計算してたんですが、計算を進めるうちに却ってややこしくなってきて、手が付けられなくなってきました。
いや、式そのものは短いんですが、どうしても勝手に決めた係数が消えてくれないんですよ。
その係数が正しければそのままでも別にかまわないんですが、消えることを前提にして考えていたため当てが外れました。
Bomber丸Worldのバトル2の曲がほぼ完成しました。
なんか、マザー3の影響を色濃く受けている部分があったりなかったりします。
ループ部分の一番最後は、ふにゃふにゃで使うつもりだったボス曲のボツ曲と同じメロディを、その前の部分はふにゃさんのこれまたボツ曲を使っています。
Bomber丸Worldではこうやっていろんな形で昔のボツ曲が姿を表すと思われるのでご覚悟を。じゃなくて、お楽しみに。
開発室のほうにもアップしてますがこっちにもアップしておきました。
爆ボンのページを少しリニューアル中です。
大規模に変えるのではなくて、トップページを少し整理しようと思ったのです。
それに伴い、バトルモードのページも設けて、その他諸々の情報にも専用のページをつけようと思っています。
Bomber丸Worldのバトル2の曲を作っています。
これはザコ戦用の曲なのですが、割と真面目なタイプの敵に使われるので、結構真剣な感じの曲になっています。
今日アップしたのは前半部分ですが、後半部分はテンポを変えて少し雰囲気を変えようと思っています。
とりあえずフリーゲーム全般もPCソフトの範疇に入れるとして…。
http://www.eyezmaze.com/index_jp.html
ここのFlashゲームやってました。
結構前にGROW RPGというのを勧められてやってみたことがあったのですがどうしてもうまくいかなくてしばらくやってませんでした。
最近またやってみる機会に恵まれたので今度はしっかり推理を働かせながらやってみたらなんとかクリアすることができました。
組み合わせのパターンは40720通りにも及ぶのででたらめにやってたらまずクリアはありません。
各パーツの性質を見極めながら推理していくとどのパーツもある特定のタイミングでしか置けないことがわかります(以下ネタバレ)。
森、レベル2まで育てた後海で分断して4ターンで完成。
階段、お城が完成していた場合8ターン目に自動的に完成。
店、8ターン全部かけて完成。ただしレベル4以降になるためにはレベル2以上の森が必要。
岩、階段が完成すると自動的に完成?
宝箱、岩があると自動的に完成。
お城、設置後4ターンで完成。7ターン目終了までに完成させる必要がある。
海、2ターン目以降に設置するとそれだけで完成。
塔、設置後3ターンで完成。
やられそうになったとき助けてくれる兄さんが結構かっこよかったです。
Bomber丸WorldのCBWWindowにOnResizeイベントを追加しました。
これでサイズ変更を検知して正しいレイアウトを保つのです。
それに伴いSetSizeもResizeに名称変更しました。
1.HPメーターの形式を考えてみた
今日の画像の分です。
以前考えた形式があまりにも場所をとりすぎていたためサイズを半分にして、更に二人分を同じ行に入れたため事実上4分の1まで省スペース化できて、HPメーターの下にメッセージを表示する十分なスペースをとることができました。
2.基本フォントサイズを決めた
大きくしすぎると全画面や拡大表示のときに不細工だし、小さくしすぎると原寸表示のときに痔がつぶれるし……案外難しいんです。
本当はフォントサイズは2の累乗、特に8または16がプログラム的に都合が良かったのですが、いずれも不適格だったので中間の12にしました。
これで原寸でもそれなりに漢字が表示できるし拡大表示でも大きくなりすぎません。
3.ピアノ曲のBGM作成中
相変わらず出だしに手間取ってます。
ここさえ何とかできれば後は勢いで作ってしまえそうなのですが。
4.CBWWindowを改良
ウィンドウの登録・解除処理がどうにも不細工で手間のかかって少し何が起こるか解らない代物だったので表示ならShow、非表示ならHideで一発でできるようにしました。
更に、ウィンドウが表示されているか、最前面にあってメッセージを受け取れるかなども、簡単にわかるようになりました。
5.文字列メニューウィンドウを作りたい
つまり、いくつかの選択肢の中から選ぶというクラスを簡単に作れるように、ただのCBWWindowだったら自由度の代わりに作るのが少し大変だから、用途を絞ってより簡単に気軽に、ということで作ってみたいのです。
6.ギャラリーに日記にあった画像を追加
日記から検索するのも悪くなかったのですが画像は画像でまとめておくのが良いのかなと思いまして。
DirectMusicで現在のボリュームなどを得るためにはボリュームチェンジのMIDIメッセージを横取りしてその値を漏らさず見ておけば現在のボリュームは把握できるというわけです。
IDirectMusicToolを使えばそれができるらしいので現在調査中です。
他にも通知イベントを使えばやりたいことが色々できそうな気がしてます。
Bomber丸WorldのページのCBWWindowのページを更新しました。
今日BGMシステムを作ろうと思ってBGM用のウィンドウ作ろうと思ったらCBWWindowの仕様を忘れてしまっていて、取り急ぎ作ったものです。
結局これに時間とられてBGMシステムできなかったんですがね。
で、実際やってみました。
とりあえずループの設定だけ。
これは特別難しいことではなかったので、変数名を逆にして全然動かなくなったこと以外はスムーズに進みました。
Bomber丸Worldへの応用も結構すんなりいけるかな…?
2006/06/18(Sun)の日記で書いたことですが、白紙撤回したことをまた白紙撤回しようと思います。
つまり、今日の日記の内容は、その日の日記の、「しかし、です。」より前と同文です。
そうそう、プログラミングコーナーのDirectX7のコーナーも更新しようと考えてます。
いちいちヘルプ立ち上げるのが面倒なんで自分のサイトに必要なことが書いてあればやりやすいんですな。
いっそのことプログラミングコーナー全体をそういうものに変更しちゃおうかしらと考えている今日この頃。
Bomber丸WorldのBGMシステムを開発中です。
さすがにデータばかり作っていてプログラムができていないのではMEなどの確認ができないので。
実装はDirectMusicを使って色々やろうと考えてます。
パフォーマンス的な問題やMIDIメッセージを送る手順がややこしそうですがなんとかやってみたいです。
とりあえず現状はまだ何もできていません。
まずBGMシステムの中枢となる部分を作って、プログラミングコーナーでやっているスクリプト講座ができたら、それを使ってエフェクト定義ファイルやなんかを作るようにしてみたいと思っています。
CharaBox3アップできました。
結局画像ディレクトリの変更には対応しませんでした。
一日で作ってしまおうと考えていた簡易的な方法よりももっとよい方法があったので次はそれを実装してみようかと思うんですよ。
Bomber丸Worldのバトル系BGMの一つを作り始めました。
ピアノがメインになる曲です。
あと、バトル1を長調から短調にしてみたのですが、なかなか面白い変化がありました。
むしろバトル曲としては単調版のほうがバトルらしいんですよ。
そろそろBGMのデータだけでなくプログラムも作り始めたいです。
そういえば、今日はハードディスク内蔵マウスなんて夢を見ました。
やっぱり信頼性や振動の問題などで実用化は難しいでしょうね…。
そもそも内蔵する理由がないし。
最近うちのGBBSにも迷惑書き込みが来るようです。
どういう方法なんでしょうね。
人がやっているにしてはURL表記を改善してこないところが怪しいです。
しかしフォームデータの名前を変更しているアップロード掲示板にも同様の書き込みがあるところから、人がやってるんじゃないかという疑いもあるわけで。
GBBSの根本的な問題も含めて、色々考えて変えていかなければならない場所が多そうです。
Bomber丸Worldの通常戦闘のテーマを少し改変しました。
ふにゃパートを少し。
キャラボックスの改良は進んでいます。
今は検索ダイアログボックスを作って、これから中身を実装するところです。
それと、すごく久々に爆ボンのMIDIを打ち込んでみました。
ブルーリゾートのベースをとりあえずですが最後まで打ち込みました。
昨日に続いてライブラリのCBWInputのページをアップしました。
ついでにCBWInputの終了処理に問題があったので修正しました。
爆ボンのブルーリゾートとレッドマウンテンとホワイトアイスの3面のどきどきモードのデータを書き終えました。