独り言日記(2007/02)
独り言日記
Flash8のコンポーネント(2007/02/28)
あんまりサイトでは使われないのですが、Flash8にて使うことができるコンポーネント(とFlashでは呼んでいるようです。ようはウィジットですな)として、TextInput/Button/TextArea/CheckBox/ComboBox/ListBoxなどなど一通りそろってます。後、Professional版のみのTreeやDataGridなど。
しかし、コンポーネントを使うとflaファイルが結構でかくなりますね。上記の配置とActionScriptだけで4MBになりました(swfとしては、上のは88KB)。なんとなくですが、もっさりしてるかなぁ、、、というか使えるかなぁ。リッチなブラウザベースのクライアントでは、これで一通りのアプリは組めそうであります。ちなみに、Flex2では上記コンポーネントは内包されているみたいですね。Flash 8 Professionalを買う必要もないのか・・・。
Ajax(Dojo)の挙動がWin環境とOS X(safari)で微妙に異なる、そもそも速度がFlashと比べてどうなのか、というのを検証したくてちょっといじってみたいなと(今は時間を作れないのですけどね)。ただ、数の制限はどこまで耐えれるだろうか。グリッドは最大5000行まで、みたいのはドキュメントに書いてありました。
BitmapDataの制限(2007/02/24)
Flash8以降でセキュリティが強化されたらしく、「外部ドメインへのアクセスの場合にMovieClipへの画像などのロードはできるけど、BitmapDataにdrawできない」、というイタタタな仕様があります。以下、サンプルのswfを貼り付けてみました。
ここの入力フィールドに「ft-lab.ne.jp」に属する画像のURLを貼り付けて[OK]ボタンを押してみてください。
http://ft-lab.ne.jp/photo/images/20040923_02.png
とか。ちなみに、この貼り付けた画像はサーバに蓄えられませんので、怪しい画像を貼ったところで自分でニヤニヤできるだけです(^_^;;。あくまで指定URLの画像をクライアントで表示するだけのものです。
左がMovieClipでMovieClipLoader::loadClipした画像が表示されます。右がそのMovieClipの画像をBitmapDataにキャプチャしたものを、別ムービークリップととしてMovieClip::attachBitmapしたものです。
左はいつも表示されるのですが、右は外部ドメインの画像を指定した場合は表示されません。
上記のFlash8でのソースです(120KB)。
http://ft-lab.ne.jp/files/flash/captureTest_flash8_src_20070224.zip
なぜ描画ができないのだろう、というのはたぶん勝手に画像をあれこれされないようにするためでしょうけど、外部ドメインを指定したURLのビュワーなんかが実現できなかったりしますので厳しいなぁ。MovieClipのみで持たせると、duplicateMovieClipでも同一階層のコピーしか作れないのでいろいろ制限が。ちなみに上記のサンプルでは、存在しない画像URLを指定すると、「開始...」状態で再度URLを指定しても読み込みができないようになりますので、その場合はページ自体をリロードして初期化してください(単に読み込みフラグをoffにしていないだけ)。
shape_class(2007/02/21)
今、仕事場でShadeプラグインSDKの使い方、なんてのを実践も踏まえて教えてたりします(3Dプログラムに慣れてもらうため)。形状を管理するクラスは「shape_class」というので行いますが、私、「しゃーぷくらす」なんて呼んでました。「シェイプっすよ」と突っ込まれたのですが、ずっとシャープと呼んでましたねぇ・・・ここ十年くらい・・・。ついでに電化製品のシャープもずっとshapeかと思ってた・・・・。
このような大いなる勘違いはよくするのですが、昔々アセンブラをアンゼブラと誤解して覚えていた小学生時代〜高校生時代がありました・・・。音で聞かないと、勘違いで染み付いてしまいますね(苦笑)。後、イントネーションもたぶん怪しいのが多い・・・。「ポリゴン」も「エアコン」と同じで「ゴ(コ)」にアクセントを私はつけるのですが、「ポ」にアクセントつける人もいますね。いつも初対面の人と話すと「関西人?」って言われるのでたぶんなまってるんだろう・・・。直す気はないですが(^_^;;。
Flashでのクラス(2007/02/21)
今までMX時代からの互換性のために使ってなかったのですが、Flash8にてめいっぱいクラスを使ってみました。ほとんどJavaと同じですね、extendsで継承もできるじゃないですか。ウィンドウのような操作をしたくてベースクラスから派生して、、とやると、いともあっさりそれっぽいことができました。
ここのサイトにあるFlash情報はかなり古いので(クラスを使ってない)、また新しい知識は書き溜めていくことにします。もう、使い勝手のいい機能を使うと後戻りできませんね(^_^;;。Flex2は、ざっと見る限りさらに分かりやすくなってる予感。
後、画像を蓄えて好きなムービークリップに表示(元画像は使いまわす)、とする仕組みで苦労しました。ムービークリップの複製で使う「duplicateMovieClip」は同一階層でしか複製できないようで、使えそうで使えませんでした。で、一度MovieClipで画像をロードして、BitmapDataで情報を持たせる(ムービークリップは使わないので解放)、これを蓄えておいて、描画時に
// カラのムービークリップを生成 m_ImageMC = _root.createEmptyMovieClip("m_ImageMC", 10); // ムービークリップにBitmapDataを割り当て m_ImageMC.attachBitmap(myBitmapData, 1);
みたいにすると、よりシンプルに扱えました。ほとんどFlashの開発環境使わずに外部テキストエディタでActionScriptを書いてますが、、、そうなるとFlexでも作業量はたいして変わらない、、かな?
Flash8 vs Flex2(2007/02/18)
市販のFlash8開発環境と、次世代のActionScript 3.0対応のFlex2(無償公開中)を速度比較してみました。Flex2でもコンパイルするとswfファイルを出力します。
Flash8からは「BitmapData」というクラスを使うことで1ピクセルごとの色情報の取得・設定が高速にできるようになっています。これで、ゲームなどでアクセラレートできるかと。
Flash8でのActionScriptは以下のようになります(そのまま第一フレームのActionScript部に貼り付ければ動作します)。
// Flash8でのBitmapDataの使用テスト import flash.display.BitmapData; // テキストフィールドの作成 var m_Text:TextField = this.createTextField("m_Text", 5, 0, 0, 200, 24); m_Text._x = 0; m_Text._y = 270; m_Text.autoSize = "left"; m_Text.textColor = 0xff0000; // ムービークリップを生成 var m_imgMC:MovieClip = this.createEmptyMovieClip("m_imgMC", 10); // BitmapDataの作成(引数は幅と高さとアルファ有効フラグ) var m_bmp:BitmapData = new BitmapData(256, 256, true); m_imgMC.attachBitmap(m_bmp, 100, "never", false); var stTim:Number, endTim:Number; var x:Number, y:Number; var rr:Number, gg:Number, bb:Number; stTim = getTimer(); // 256 x 256 ピクセルの色を指定 for(y = 0; y < 256; y++) { for(x = 0; x < 256; x++) { rr = x; gg = y; bb = 80; m_bmp.setPixel(x, y, (rr << 16) | (gg << 8) | bb); } } endTim = getTimer(); m_Text.text = "描画時間 : " + String(endTim - stTim) + " ms";
Flex2では書き換えが必要になりますが、以下の感じ。
// Flex2でのBitmapDataの使用テスト package { import flash.display.*; import flash.text.*; import flash.utils.*; public class BitmapDataTest extends Sprite { private var m_bmp:BitmapData; // BitmapData public function BitmapDataTest() { // テキストフィールドの作成 var m_Text:TextField = new TextField(); m_Text.x = 0; m_Text.y = 270; addChild(m_Text); // シーンに追加 // BitmapDataの作成(引数は幅と高さとアルファ有効フラグ) var m_bmpD:BitmapData = new BitmapData(256, 256, false, 0xffffff); var m_bmp:Bitmap; m_bmp = new Bitmap(m_bmpD); addChild(m_bmp); // シーンに追加 // 256 x 256 ピクセルの色を指定 var stTim:Number, endTim:Number; var x:Number, y:Number; var rr:Number, gg:Number, bb:Number; stTim = getTimer(); for(y = 0; y < 256; y++) { for(x = 0; x < 256; x++) { rr = x; gg = y; bb = 80; m_bmpD.setPixel(x, y, (rr<<16) | (gg<<8) | bb); } } endTim = getTimer(); m_Text.textColor = 0xff0000; m_Text.text = "描画時間 : " + String(endTim - stTim) + " ms"; } } }
それをそれぞれ実行すると、
最適化のケタが違いますね、Flash8の場合は1324 ms、Flex2の場合は30 msです。単純に44倍速!!!
http://journal.mycom.co.jp/articles/2006/10/31/adobeflex/
にActionScript3.0の特徴が書いてます。大きな特徴はこの速度アップ(JITコンパイラ搭載とのこと)と、よりJavaライクな書き方に近づいた、というのがあります(たしかにAS2.0を使ったコードを見ても、あまりきれいな書き方にはできない部分があったりもしますし)。
Flash9の発売が楽しみですねぇ。当分はFlex2で実験してみよう。ActionScript 3.0でのBitmapDataでは、setPixelの1ピクセルずつでなくてsetPixelsでまとめて行う、という機能もありますのでもっと速度アップできそうではあります。
Shade 9 プラグインSDK(2007/02/14)
公開されましたね。
http://shade.e-frontier.co.jp/download/dev_9sdk.html
またもろもろの情報はまとめることができれば。私は最近ソース自身はDoxygen対応のコメントを書くように心がけてはいますが、所詮コメント、ドキュメントとしては物足りないと思ってます。
Shade6のSDKのドキュメント(当時はコツコツ手書き・・・されてたと思います)と今回公開されていたShade9プラグインSDKのドキュメントを見比べてみました。明らかに分かるところはShade9では「たとえば」がないんですよね(過去、詳しかった説明が完全に抜け落ちているところが多々あります。do_exportのところとか)。後、クラス名の昇順でまとめるよりも機能別にまとめたリファレンスの強化、および使用目的別のチュートリアルはやはりほしいところ。サンプルに役に立つコメントがない(ドキュメントがDoxygen生成なんで、サンプルソースもDoxygen形式にあわせたらいいのですが)・・・などなど。また、HTMLヘルプのプロジェクトはあるのにchmがないのはちとどうかと(^_^;;。(普通のHTMLだと、検索してひっかけるのが面倒なので・・・)
後、肝心なSDKでの目玉機能が伝わらないのはもったいないかも。こちらでも、おいおい解説はしていければと思ってます(結構すごいことができるようになってるのですが・・・)。
が、最近は仕事で忙しくなってまいりました(汗)。IPA関連の準備と別件と。仕事場で人手が増えてきたのもあり、また、いろいろやり始めると私の手があかないので、将来に向けて最近は教えるモードになってます。3DCGプログラミングについても教えるようにしてますが、考えてみれば覚えてもらうことは多いですね。ドキュメントを書くことについても大いに突っこみいれてます(苦笑)。ドキュメントもプログラム(ソース)に関しても信念が入るようになったら一人前、と最近思ったりします。仕事場ではもちろん、こだわっていきたいです。
ヘアーサロン(2007/02/08)
話題が飛びまくりですみません。Shade9のヘアーサロンのサンプルを作ろうと、実験してるやつです(会社のホームページに載せるためにいじってました)。
制作途中なので生首なのは置いておいて(^_^;;、私としてはいろいろ表現を引き出してほしいなぁと。ちなみに形状は(私の大好きな(笑))3Dアトリエで作ってます。髪の毛はもちろんヘアーサロンです。で、Shade9でパストレレンダリング(イラディアンスキャッシュ有効で)。地面がざらついているのは、、なんでだろう?イラディアンスキャッシュはこのモヤモヤが気になりますよね。
背景(IBL)は、バーティカルクロスなんですが線形補間はしてほしいなぁと。ブロック状のカクカクが目に見えてしまってます。
気持ち悪い例ではありますが、、で思い出したのですが、SIRENみたいなホラーゲームをPS3で表現すると、思いっきり怖いのではなかろうか・・・。(SIREN1はプレイしてあまりの難しさに放置してるのですが、恐怖度はなかなかすごかったです)
とりあえずここから開始(2007/02/06)
開発メモです。シンプルレイトレースかつUniformGridでのレイトレーシングプログラムは形に(というか、何回も作ってるものなのですが(^_^;;)。
これを開始点として、最適化を進めていくことにします。
縮小しているのですが、512x512ピクセルで4x4サンプリング/ピクセルを行いました。
テストマシン
CPU : Pentium4 2.8GHz Mem : 512MB OS : Windows XP Dev : VC++ .NET 2003
シーン情報
オブジェクト数 : 4 総三角形数 : 108590 光源数 : 2(平行光源と点光源)
レンダリング時間(512x512 pixel, 4x4 sampling/pixel)
DXFからの読み込み : 1734 ms 三角形の格納 : 1214 ms レンダリング時間 : 14853 ms
※「レンダリング時間」に空間分割&トラバース時間も含みます。
アンチエイリアスのサンプリングの違いによる速度比較。
サンプリングの精度 | 時間 |
---|---|
1x1(アンチエイリアスなし) | 3783 ms |
2x2 | 7065 ms |
4x4 | 14853 ms |
やるべきこと。
- 空間分割にてほかのもの(HUG/BSP/KD-Tree などなど)をテスト。
- SSE2対応(HT対応)による最適化。
- 大規模なシーンに対応できるか調整。
- 上記ができてからマテリアル・テクスチャ対応。
- さらに上記ができてからGI対応。
- GIの最適化。
上記の3つにて、速度に関してはある程度確定できるかな。
ということで、ソースをまとめて現時点のものは公開・解説予定です。さぁ、どこまでできるやら。
東方永夜抄(2007/02/04)
秋葉原の「とらのあな」にて、東方シリーズが大量においてありました。前行ったときは、ご本家のものは2つしかなかったのですが、本日は棚一面にありましたねぇ。ということで「東方永夜抄」を購入(シューティングは苦手だけど(^_^;;)。音楽目当てなんですが、オリジナルのゲームのほうもやっておこうと。しかし、弾幕系はよくクリアできる人がいるなぁと関心してしまいます。また夜な夜な遊ぶことにします(笑)。
で、とらのあなにハルヒの逆転がありました。YouTubeで「涼宮ハルヒの憂鬱」のアニメの映像を逆転裁判の法廷シーンみたいにしたMADがあったのですが、あれがまさか同人であるとは(涼宮ハルヒの逆転、で検索すると上のほうに出てますね)。買ってはいないのですが、気にはなりますねぇ。というか、同人は結構面白そうなのがあるので(音楽CDもゲームも)あさりに行くのにはまりそうです(^_^;;。
関係ないですが、逆転裁判のオーケストラアレンジのものがあるみたいです。
http://www.tanomi.com/saiban/
おお、ほしい!!でも、通販しかないのね。このゲームって音楽も結構いいんだよなぁ。法廷シーンでの追い込みのときとか。
ソフトシティ(2007/02/03)
ひさびさに見たのですが、いつのまにか停止していた日本ファルコムのゲーム販売が開始されてますね。
http://www.soft-city.com/
会員になっていて月々料金が取られてたりするのですが、あんまり利用してないかな(汗)。
夜な夜な遊んでいた逆転裁判1/2/3(PC版)をクリアしました、通しで3バージョン。なかなか楽しめました。しかし、1のみなんか描画関連の不都合とBGMが途切れるなど、バグが多いっすね(^_^;;、PC版だからでしょうけど。システムが1と2・3で違うのかな。春頃に、DSにて4が発売されますね。う〜ん、このタイミングでDS買おうかなぁ(さすがにPC版はまだまだ出ないでしょうし)。
続・DXF読み込み(2007/02/02)
最適化して、10万ポリゴンのファイル読み込みで1.2秒くらいに(もちろん、独自のデータに変換してメモリに格納してます。単純読み込みではないです)。これくらいなら十分かな。独自レンダラに食わせるのもあわせると読み込みの合算は2.9秒1.6秒くらいになってます。
メモリを制するものは速度を制す、でしょうか(^_^;;、でかいデータを扱う場合はやはりメモリ確保がネックとなってしまいます(特に可変長)。DXFを扱うのでおわかりのとおり、レンダラを再び掘ってます。勉強として・・・主に社内向けなんですがどうせなんで公にソースごと公開予定です。後、アンビエントオクルージョン実装がしたいところ。
仕事の薄い今のうち、です(^_^;;。(と書くと、たいてい仕事が入って来て計画が先延ばしになったりする、マーフィーの法則発動、なんだよなぁ)
Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.