例の赤帽Linux機のカーネルをアップデートしておきました。aptって便利ですねえ。楽ちん楽ちん。
さて、こいつに何をさせようか。
五月雨を買ってきました。
あと、AGP接続のビデオカードが欲しかったのですが、手頃なのが見つかりませんでした。背が低い(コネクタエッジからの丈が短い)、ってのが絶対条件で、性能的にはVGAが映れば十分なんですが。千円くらいで転がってないかなー。
Ultimate(Reminisce)で1300万(リプレイ ver.1.02用)。道中での稼ぎはダメダメですが、ステージ8とボス6でフォローしてます。
道中でちゃんと稼げば、1400万くらいいけそうですね。
プラグイン。メモリリークや、ほか、細かいバグを修正。TJSCreateArrayObject、TJSCreateDictionaryObjectで取得したものはちゃんと解放しましょう、ということ。あと、微妙に仕様変更とか。
そろそろ晒してもいいかな。
プラグイン。ver. 0.6β1として(弱気に)リリース。2.24RC3用です。
吉里吉里本体が2.24になったらリリースし直します。多分。
なんだそれは。
書籍版が出版された頃、本屋でぱらぱらと3秒ほど眺めましたが、買ってまで読むほどの価値はないと思いました。
そういえば、逆境ナインも映画化されるんですよね、実写で。
アキバでビデオカードを買ってきました。背の低いやつです。チップはATI Rage XLで、VRAMが4MBも搭載されています。しかもAGPx2対応です。ややオーバースペック気味ですが、まあいいでしょう。安かったし。
サーバ機用なんて、VGAが映りゃいいんですよ。
吉里吉里Ver.2.25からは、プラグインからネイティブ実装されたクラスを提供
できるようになりました。2.24まではできなかったわけです、公式には。
私の環境では、当社【何】のインチキ・テクノロジ【謎】により、2.24でも似非ネイティブクラスを提供できるようにしてあります。new SQLite3()
とかnew Socket()
とか、OKです。もちろん、本体改造はしていません。無修正です。でもちょっとインチキくさいです。完全なネイティブになっていなかったり、クラス定義部が「なんじゃそりゃー」だったり、「テクノロジ」でも何でもない辺りが、インチキ・クォリティ。
インチキはさておき、Ver.2.25ではβ版とはいえ公式に(?)サポートされたのですから、使わない手はありません。サンプルである nativeclasstest を読みながら、一つクラスを書いてみました。
…うーん、これはやりにくそうですね。というのは、自動生成のことです。当社【だから何】では、インチキ・テクノロジにより、コーディングが面倒な部分は自分で書かずに済むようにしています。V2Link()、V2Unlink()、TJSメンバのクラス定義などは、Perlによるソースコード自動生成です。C++クラス名とTJS関数名の対応表を書いておくだけで、記述量の多いあのV2Link()、V2Unlink()諸々がさくっとできあがります。楽ちんです。しかし、今回の公式の手法では、これが通用しないように思えます。
通常の関数は今までのやり方を踏襲する予定ですが、クラスに関してはどうしたものでしょう。できれば公式の手法を採用したいところですが。どうやって自動生成させようかなあ…
プラグインでネイティブクラス。
nativeclasstest の通りに書くと、同じ記述(クラス名とかメンバ名)が何度も出てくることになります。プリプロセッサマクロでかなり簡素化されてはいますが、それでも記述量はそれなりです。これでは書くのが面倒なのはもちろん、記述ミスも多くなりそうですし、メンテも大変そうです。そこで、楽に記述できるような仕組みを作ってみました。nativeclasstest の Main.cpp は、おおよそ以下のようになります。
@comment このソースは、そのままではコンパイルできません。 /* C++ source code ... class TJSNI_Test { ... }; */ // TJS Native Class @begin Test // 空の finalize メソッド TJS_DECL_EMPTY_FINALIZE_METHOD // (TJSの) コンストラクタ @constructor // ここでは何もしない return TJS_S_OK; @; // print メソッド @method print _this->Print(); return TJS_S_OK; @; // add メソッド @method add if(numparams < 1) return TJS_E_BADPARAMCOUNT; _this->Add((tjs_int)*param[0]); return TJS_S_OK; @; // value プロパティ @property value @getter *result = (tTVInteger)_this->GetValue(); return TJS_S_OK; @; @setter _this->SetValue((tjs_int)*param); return TJS_S_OK; @; @; // square プロパティ (read only) @property square @getter *result = (tTVInteger)_this->GetSquare(); return TJS_S_OK; @; TJS_DENY_NATIVE_PROP_SETTER @; @end
これを通常のC++ソースファイルに埋め込んでおきます。中途半端にコンパイルされると困るので、C++言語レベルでは、コンパイルエラーになるような仕様にしてあります。こいつをスクリプトで処理すると、
のコードが吐き出されます。これはC++コンパイル可能です。TJSネイティブインスタンスの実装用クラス(ややこしいな)である TJSNI_Test は、自分で書くしかありません(当たり前)。
V2Link()とV2Unlink()は、今までの仕組みで自動生成できます。必要なのはこのファイル一つだけです。
# Native class 'Test' tTestClass Test@class:()
奇妙奇天烈な書式ですが、ほかの文法との兼ね合いでこんなふうになってしまいました。こいつをスクリプトで処理すると、V2Link()やV2Unlink()諸々を含んだ Main.cpp と、ヘッダファイルが作成されます。
なんだ、スクリプトで処理するのが面倒じゃないか、と思われがちですが、Makefile に依存関係と生成規則を書いてあるので、実際には make 一発で済んでしまいます。楽ちんです。make ばんざーい。
ドロネー三角形分割と三角形自由変形を組み合わせて、モーフィングをやってみました。
制御点をうまく取らないと、ただのクロスフェードになってしまいますね。
発表されたのは日曜でしたっけ。めでたく新声優陣が決まったドラえもんです。スネ夫役が関智一ってのはちょっとびっくりでした。関智一というと真っ先に「石破!ラーブラブ!!天驚拳ー!」が頭をよぎります。ていうか、このキャラしか思い出せません、師匠(誰)。
モーフィング・トランジションを作成するため、先日のプログラムをちょっと改造。拡張トランジション作成の練習台にはいいかもしれません。
Layer.beginTransition('extrans_morph', withchildren, transsrc, %[ 'thisPoints' => [ x1,y1, x2,y2, ... ], 'transsrcPoints' => [ x1,y1, x2,y2, ... ], 'time' => 3000 ]);
みたいに呼び出せるようにしたいなあ。
ドメイン名についてはノーコメント(笑)
Moonlight Walksをちょっと流してみました。英文を読むのは苦痛なので、ほとんど読んでませんが。
ゲームエンジン(Ren'Py?)のスクリプトは、Pythonそのまんまですね。
なんだか今週は忙しくてあまり吉里吉里に触れなかった。
モーフィング・トランジション、とりあえず動きました。なめらかに変形します。呼び出し方法は、ほぼ予定通り以下のようになりました。
dest.beginTransition('extrans_morph', true, src2, %[ 'srcpoints' => [ x1,y1, x2,y2, ... ], 'transpoints' => [ x1,y1, x2,y2, ... ], 'time' => 3000 ]);
TJSから呼び出すのはいいのですが、KAG3のtransタグでの呼び出しがうまくいきません。配列変数が文字列としてプラグインに渡ってしまっているようです。エンティティでは渡せないのかな。
全然幕には見えない、カーテントランジションを作りました。吉里吉里に標準搭載されているスクロールトランジションに毛が生えた程度のものです。iTVPDivisibleTransHandler::Process() を流用せず、一から実装したので、結構面倒でした。
fromは四方向、動作はnone(動かない)、scroll(スクロール)、stretch(拡大縮小)から選択可能です。stayfore, stayback, nostay 互換のオプションもつけとくかな。
今日はコミケに行きませんでした。それは全然がっかりじゃない。
アキバで京ぽんを買ってきました。あと、エルフェンリート(10)とアクメツ(12)。京ぽんを買ったときに、今までの機種と端子の形が違うからうちではデータ移行ができない、WILLCOMショップでやってもらってくれ、と店員に言われてがっかり。WILLCOMショップまでてくてく歩いて行って、データ移行してもらいました。夕暮れ時だったからかもしれませんが、京ぽんを買った店のPHSコーナーも、WILLCOMショップも、やけに空いてました。なんだか先行き暗いなあ。DoCoMo、撤退しちゃったしなあ。大丈夫かな、PHS。先行き暗いけど、もう4年くらい使い続けているので、WILLCOMが撤退するまではPHSを使っていこうと思います。
帰りにデ○ーズへようこそー。この店、禁煙席なのにタバコ臭いよ、近くのニコチン席から悪臭が漂ってくるよ。何のための分煙だよ、風向き考えて配置してくれよ。これじゃ分煙してる意味ないじゃん。料理店の経営者は、「禁煙席」なんてものが必要とされる理由をよく考えるべきだと思う。おまけに料理は温かくないし、高いし。この店、ファミレスの中では店員の態度が割とまともな方なので、それだけが救いかなー。
帰宅後、家でアクメツ12巻を読もうとして、実は11巻を買っていなかったことに気づいてがっかりしました。今度買ってこよう。
花粉症キター! せっかく治ったと思ってたのに。がっかり。
だいたい、杉の木植えすぎなんだよ。全部切り倒せば、日本全国二千万人くらいの花粉症患者は幸せになれるんだよ。多分。なれるといいな。
「AIR-EDGE高速化サービスV専用クライアント」のインストーラ、起動中のソフト全部を強制終了させてくれました。最低だ。
頭に来てアンインストールしようとしたら、アンインストーラも起動中のソフト全部を強制終了させてくれました。最悪だ。
まだそんなに酷くはないですが、目はかゆいし、鼻水は出るし。やっぱり花粉症のようです。
任意方向グラデーション矩形塗りつぶしのアルゴリズムを考えていたところ、TVPStretchCopy()を使う方法を思いつきました。256バイトの仮想スキャンラインバッファ上にグラデーションパターンを作成しておき、TVPStretchCopy()でデスティネーションに拡大縮小コピーすればいいかな、って意味わからん。
プラグインの斜線描画部分を、DDAではなく、固定小数点数を使うように変更したところ、約一割程度速くなりました。元のDDAのコードがショボかったのもありますが、DDAをなくしたことで、ループ中の予測困難な条件分岐が一つ減ったことの方が、大きく影響しているような気がします。パイプラインアーキテクチャのCPUにとっては、予測困難な条件分岐は天敵ですからね。
実は、もう一つ条件分岐が残っているのですが、こいつを外すのはちょっと面倒です。外してもあまり高速化できなそうな気がしますし。
プラグイン。エクスポート関数であるTVPConstColorAlphaBlendやTVPFillMask等のバリエーションとして、1ピクセル描画オンリーの関数を作りました。斜線や円を描くときには1ピクセルずつプロットしていくので、余計なループを外せば多少速くなるだろう、という目論見です。逆に、塗りつぶし系の関数内では、エクスポートされた関数を使うことにします。しかし悲しいかな、私はMMXどころかx86系アセンブラを全く知りません。よってCで書くことになりますが、面倒なので吉里吉里のソース(gengl.pl)から流用することにしました。パクってばっかりだな、俺。
さて、ループなしのCコードで1ピクセル描画するのと、ループありのMMXコードで1ピクセル描画するのとでは、どっちが速いでしょうか。ベンチマークは後日。
Firefoxのロゴ、正式にこれにすればいいんだよ。そうすればユーザはもっと増えるんだよ。ユーザ層は知らんけど(無責任)。
「問題のファイルには、FTPサーバからIDとパスワードを入力してアクセスするのが通常。CGI経由のアクセスは、FTP上のアクセス制御を回避した不正アクセス行為にあたる」
なんだそーです。というわけで、Webサイトの管理者はまずFTPサーバを導入し、適当なアカウントを作成しましょう。このアカウントはパスワードを用いた認証設定にします。これだけで、不正アクセス対策はばっちりです。HTTP、特にCGI経由でアクセスされて、それが気に入らなかったら即「不正アクセスですよ!」。大丈夫。判例がありますから(笑)。
真面目な話、こういう判決こそがサイバーノーガード戦法を認め、高度情報通信社会の発展を妨げる
のですが、法曹界の人にはそれがわからないんでしょうね。
ループなしのCコードで1ピクセル描画するのと、ループありのMMXコードで1ピクセル描画するのとでは、どっちが速いか、ということで、簡単にベンチマークを取ってみました。Athlon XP 1900+で、300ピクセル分の斜線を10万本描画して、1本当りの描画時間を計測したところ、
Export (x86/MMX Assembler) | Plugin 1px (C) | |
---|---|---|
Alpha Blend | 0.0375 | 0.02922 |
Additive Alpha Blend | 0.03218 | 0.0325 |
Fill ARGB | 0.02219 | 0.02187 |
という結果になりました。単位はミリ秒/本です。TJSで10万回ループさせていますが、その分のオーバーヘッドは無視しています。通常のアルファブレンドは二割以上速くなっていますが、加算アルファは逆に遅くなってしまいました。まあ、遅くなったと言ってもごく僅かですし、大勢に影響はないでしょう。
特に問題はなさそうだったので、垂直線、円、楕円、角丸矩形にも適用しておきました。大して速くなってませんが、自己満足なのでノープロブレム。
注文していたレジェンド オブ ゲームミュージック 〜プレミアムBOX〜が届きました。グラディウスとR-TYPEのすごいプレイを拝見。素晴らしいです。R-TYPEの最速状態の自機で敵を撃ちもらさず進む様
はまさに圧巻
ですね。
税金使って何作ってんだか。Keyのサイトにも情報があります。
プラグイン。任意方向グラデーションなんて余裕っち、と高をくくっていたら、見事にはまりました。描画クリップ領域をはみ出した場合の処理で、二時間以上費やしてしまいました。まあ、とりあえず出来ましたが。
あと、グラデーション関数の呼び出し仕様を変えます。もし使ってる人がいたらごめんなさい。
プラグイン。どうもマッハバンドが目立つなあ、と思っていたら、単にスクリーンがHigh Color(16bit)になっていただけでした(ォTrue Colorにしたら、それなりにきれいなグラデーションができているのが確認できました。
あと、多階調グラデーションに対応しました。赤→黄→白→緑→黒→青みたいな。
プラグイン。使い所がサッパリわかりませんが、円グラデーションと楕円グラデーションを追加しました。処理がそれなりに重くて、半径100ピクセル程度の円・楕円を一つ描くのに、うちのマシンで1ミリ秒以上かかります。
やきそば900円、ポップコーン1000円って、すごいですねー。ちなみに、私が先日食べたポップコーン(焼き醤油味)は、袋入りで68円でした。
みずほ伝説(謎)に新たな1ページが?最近ではあまり聞かなくなった単語「みずほる」にも、新たな意味が加わるのでしょうか。でもYahoo!のときは「ヤフる」とは言わなかったなー。
ドキュメント整備。今の一プラグイン一HTMLファイル形式だと、一ファイルが肥大化する傾向にあるので、一関数一ファイル形式に変更しました。読みやすくなったのか、読みにくくなったのか。