メディアトラッカー
メテオスもどき、効率の良いリソースの読み込みを考え中なのです。
ロード時間を体感的にゼロにしたいんですよね。
なので、最初に画像を必要としない画面を表示して、その裏で別スレッドでMediaTrackerを動かして読み込むことにしました。
あと、メインスレッドの動作をアプレットのクラスに組み込んで全体をすっきりさせたり、後々に響きそうな部分の最適化とかをしていました。
プログラミング関係の話題。プログラミングコーナーを更新したとか、プログラミングの内容に踏み込んだ話とか。
メテオスもどき、効率の良いリソースの読み込みを考え中なのです。
ロード時間を体感的にゼロにしたいんですよね。
なので、最初に画像を必要としない画面を表示して、その裏で別スレッドでMediaTrackerを動かして読み込むことにしました。
あと、メインスレッドの動作をアプレットのクラスに組み込んで全体をすっきりさせたり、後々に響きそうな部分の最適化とかをしていました。
アプレットテスト用のPHPを改良して更新されていないクラスは再コンパイルしないようにしました。
クラスファイルの最終更新日時とソースファイルの最終更新日時を調べてソースのほうが新しければ再コンパイルします。
で、それで作っているメテオスもどきのほうは実はほとんど進んでません。
画像を出すぐらいは作りたかったんですけどね。
どうも~。
とりあえず今日は前から更新しようしようと思い続けていてずっとしてこなかったActiveBasicのコーナーを更新しました。
当たり前のようにキャラ画像にマスク画像をつけていたので、それをつけなかった場合にどうなるか、というのを実際に試しました。
それと、ついでにActiveBasicの公式サイトのURLが変更になっていたのに合わせてリンク先も変更しました。
メテオスもどき作り始めました。
eclipseが重いのとアプレットビューアでは実際的な動作テストができないことから、ブラウザ上で効率よくデバッグできる方法を考えていました。
ブラウザ上でのデバッグの大きな問題点としては、ミディビのときにJavaのクラスローダキャッシュのせいでアプレットが最新版に更新されないという問題に直面していたので、今回はそのことを中心に対策しました。
まず考えたのが、URL単位でキャッシュを保存していることは知っていたので、JARファイルを返すアドレスの後ろに毎回異なる文字列をつけるというものでしたが、後半の文字列を無視して同じファイルと認識したり、ファイルとは別のものと認識してエラーを起こしたりしたため失敗でした。
そして最終的に考えたのが、ミディビを作るときに行っていた、ディレクトリ名を変える方法を自動化するやり方です。
要するに、アプレットをテストするページにアクセスすると、PHPスクリプトによって毎回違う値でディレクトリを作り、その場所にJARファイルのコピーを置くというもので、これは非常にうまく働いてくれました。
そうすると欲が出てくるもので、どうせ常に最新版に保つんだからコンパイルもアクセス時に同時にしてしまおうということになりました。
それはそれで、コンパイルするだけならバッチファイルに入れていたものをPHPに移植するだけで簡単だったのですが、ここで思わぬ問題が出ました。
エラーメッセージが出力されなかったんです。
バッチファイルでコンパイルしていたときも、コマンドプロンプトが瞬時に消えてしまっていたために見えなかったのですが、今回は標準出力をページに表示するなりファイルに出力するなりすれば簡単に見られると思っていました。
ところが、エラーの出力先は標準出力ではなく標準エラー出力であったため、標準出力には何もないという状態になっていたのでした。
最終的に、「2>&1」とすることで、標準エラー出力2に出たエラーを標準出力1にリダイレクトして、その結果をPHPで拾うことで無事表示させることができました。
そうそう、明日から二泊三日で旅行に行きます。
海で泳ぎます。
プログラミングのところの乱数のページを増やしました。
前々からやろうと思ってたんですけどね、ランダムセレクトの話です。
またBomber丸Worldのスクリプトにでも組み込もうかなと思ってまして。
LuaそのものをBomber丸World用にチューニングしてました。
Bomber丸Worldで使われると困る標準関数を削除したり、ゲーム上でうまく動かない関数の仕様を変更したり、紛らわしい名前の関数をリネームしたり。
で、削除しまくってたらライブラリのサイズが400KBから300KBまで大幅に落ちました。
まあ、どっちみち使ってないものはリリースコンパイルで消えるはずだから直接的なサイズ削減効果はないかもしれませんが。
コンパイル済みのデータを保持するクラスを作り始めたのですが、どうにもバイナリ出力するlua_dumpはコードの細切れごとにwriterを呼び出すようで、予め全体の大きさがわからないし断片ごとに何度も書き込まれるのでまとめて書き込んで高速化というのができないし、ということで、バイナリを保持しておいて高速化というのは、最初のコストや後で再利用される割合などを考えるとどうにも割に合わないようです。
そんなわけで、もっと単純でリスクの少ない方法を考えることにします。
ウィンドウシステムの相対座標での描画も出来上がったのでWikiにアップしておきました。
そして、BGMシステムを作ることにしたのですが、その前にもう一度Luaの見直しを行っておこうということで、CBWLuaを改造中です。
BGMスクリプトとか、マップイベントとかで、同じスクリプトを繰り返し何度も読み込むことがありうるので、auto_resourceが使えるかもしれないと思い、auto_resourceで使いまわすためのコンパイル済みチャンクを作るためのクラスをluacを参考に作っているところです。
LuaのBomber丸World用カスタマイズ版ができたのでアップしました。
本当は5.1.2の日本語対応版を作りたかったんですが、やはりというか日本語化パッチは5.1.2には対応していなかったようで。
そんなわけで、ちょっと古いかもしれませんが5.1の日本語対応版を使うことになりました。
変数名には日本語は使えませんよ!
デジカメは見つけたんですが使い方がわからず分子模型の写真は取れませんでした。
有機化学のセットだったので金属結晶はほとんど作れないようでした。
今日はNeoMuplのランダム演奏時のスキップ率を実装しました。
それ以外で実装するかどうかは未定です。
もしかしたらオプションで決めるようにするかもしれません。
Luaのほうはというと、変数への代入も案外あっさりできて、ついでにテーブルの新規作成とかも作ってしまって、ガベージコレクションの様子を確認したりもしました。
基本的にLuaでは細かいプログラムをたくさん同時並列的に動かすのでガベージコレクションは何も設定しなくても事実上分散して行われます。
5.1の意味があまりないです。
またまた突然ですが学習帳を更新しました。
薄膜の成長様式などについてですよ。
尻切れなのはまあつまらない事情からです。
Luaは、ただいまLuaの変数にC++から代入する簡単な方法を模索しているところですが、スタックの操作でどうやったら変数に値を書き込めるのか、まだ未知の部分があります。
http://www.water.sannet.ne.jp/sowwa/
の日本語化パッチを5.1.2に使ってなんとか日本語対応できないかと試みていましたが、結果は失敗に終わりました。
やっぱり5.0系列と5.1系列ではそれなりに違いがあるようでした。
一応 http://hammm.dw.land.to/lua/ の日本語化パッチで文字列リテラルの日本語対応(つまり"ソース"を正しく表示できるなど)は可能だったのでしておきました。
変数名はともかく文字列に使えるかどうかは利便性に大きく関わりますからね。
で、ちょっとそれとは別に、lua_Stateの扱いについて考えていました。
ラッパークラスであるCBWLuaに全て管理を任せてLuaに対する操作は全てCBWLua経由で、と思っていたのですが、CBWLuaから実行したプログラムでもどんどんCBWLuaの管轄外のlua_Stateを作ることができてしまうので、CBWLuaではlua_Stateを管理しきれないのです。
つまり、動き始めたのがCBWLuaによるlua_Stateだったとしても、実行するうちに勝手に新しいlua_Stateが作られて、それが実行されてゆくと、CBWLuaによるlua_Stateが実行されているのにもかかわらず実際に動いているのはそれから派生した別のlua_Stateだったりするのです。
これで何が困るかといえば、グローバル環境は親玉(CBWLuaによるlua_State)も子分(派生したlua_State)も共通なのですが、スタックは別々で、今すぐ必要になるデータとかは大抵スタックに積まれているのです。
だから、CBWLuaにlua_Stateを一括管理させていると、子分のスタックが見られなくて、大事なところで親分が何もわからないということになるのです。
だから、スタックに関する部分はLuaAPIを直接使ってもらうことにして、CBWLuaが扱うのはグローバル環境と子分の作成など、どのlua_Stateがやっても同じになる用事だけにしておきました。
それなので、さっそくグローバル環境に関する関数を、ということで、特定の変数の値を得る関数を作ってみました。
ただ単にグローバル変数を得るだけでなく、可変引数を用いて複雑なテーブルの中身なども得られるようにしてみました。
この関数とほぼ同じものをWikiにも掲載しておきました。
で、そんなこんなで色々やってると突然リンカエラーが。
何があったのかと思って調べていたらVC++が勝手にヘッダファイルのインクルードをextern "C"の外に出していることが判明しました(中に入れておかないとエラーが出る)。
IDEって時々余計なことをして見つかりにくいエラーを混入してしまうのが困り者ですね。
Lua、Bomber丸World上で動かすのに成功しました!
コネコベーダーの動きをコルーチンで制御しています。
実際のプログラムをWiki上にアップしているので是非ご覧ください!
あと、今日はTGBBSの削除機能を実装しました。
ただ、実際に消しているわけではなく削除済みフラグを立てているだけなので後から復活することもできます。
就職の面接の結果が出ました。
内定、だそうです。
で、Lua、とりあえずコルーチンを動かすことには成功しました。
まだまだLuaの変数を見たりすることができないので本当に意図したとおりに動いているのかはわかりませんが、とりあえずエラーは出ていないようです。
昨日描いていたいずみさんの絵ができました。
一応24歳です。
24歳ですってば!
年齢半分ぐらいに見えるかもしれないけど!!
Lua、コルーチンを扱うクラスを作りました。
母体となるLuaクラスから作って、コルーチンが終了したら自分で勝手にdeleteします。
そして、コルーチンが無限ループだった利したら母体のLuaクラスの消滅時に一緒に消滅します。
あと、単純にLuaの関数をラップするだけの関数も大量に作ったりしてました。
そして今日は久しぶりに絵も描いていたり。
いずみさんもうすぐ描けそうなんで明日アップします。
yaneSDKのメモリ管理にあわせるためにアロケート関数をyaneSDKの機能を使う方法で実装したらエラーが出たので標準のアロケート関数に戻しました。
あとはWikiの内容を充実させながらちょこちょことBomber丸World用のLuaクラスを作っていました。
今日はこの日記PHPで既に書いた日記に対して編集操作を行ったときにタグが無条件でエスケープされてしまうバグを修正しました。
この修正はTGdiaryにも反映するので次の更新はTGdiaryのバージョンアップとなります。
う~ん、Luaの、C側での関数リファレンスも見つけたので、うちのWikiの存在意義が半分ぐらいなくなってしまったようです…。
まあ、関連性の深い関数などをすぐに参照できるというのがうちのWikiの強みだったりするし、順を追って発展させていくチュートリアルなどもあればまた存在価値というのは高めていけそうですが。
で、Bomber丸WorldにLuaを組み込むほうもわりとそれなりにでき始めています。
まあ、lua_openしてloadしてcloseするクラスを作ってそれが今のところエラーを起こしていないというところなんですが。
WindowsMediaEncoderをインストールしてみました。
画面の取り込みもできるのでまた再びふにゃさんのプレイ動画を作れそうです。
あれと比べてどの程度よくなるのか、または悪くなるのかはわかりませんが、とりあえず使うだけ使ってみました。
まあ、画質はそれなり、ウィンドウ枠まで録画されるのが鬱陶しいのですが、録画後に長い変換処理がないというのと、音も一応取れているらしいところはよいかもしれません。
Lua組み込みWikiはとりあえずユーザーが使える全ての関数と変数の型と定数のページは作り終えました。
中身はありませんけどね。
組み込みはちょっとてこずってます。
Lua言語の文法やら使い方に関してはまあまあわかりやすいんですが、組み込むC側のリファレンスがないのです。
優れたプログラムをLuaで組んでもCから呼び出せなければ意味がないのです。
網羅的に解説しているサイトが全然見当たらないのです。
もういいです。自分で作ります。
MifuminScriptが完成するかどうかの不安もあるので、とりあえずLuaを一度Bomber丸Worldに組み込んでみることにしました。
はむ氏の空想具現化プログラミング(http://hammm.blog21.fc2.com/)にあったS-JISが使えるものを使ってます。
とりあえずライブラリのコンパイルとヘッダファイルのインクルードまではうまくいったようです。
そういえば、Bomber丸Worldに何かフリーフォントでも組み込んで使ってみようかと思ったのですが、再配布可能なものでよさそうなものがなかったので諦めました。