Slideshare.net (beta)

 
Post to TwitterPost to Twitter
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 0 (more)

Shibuya.abc - Gnashで遊ぼう

From gyuque, 7 months ago

Introducing Gnash, Flash Player implementation from FSF and readin more

1370 views  |  0 comments  |  0 favorites  |  5 downloads  |  2 embeds (Stats)
 

Categories

Add Category
 
 

Groups / Events

 

 
Embed
options

More Info

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License
This slideshow is Public
Total Views: 1370
on Slideshare: 1227
from embeds: 143

Slideshow transcript

Slide 1: 「Gnashであそぼう」 by gyuque Shibuya.abc

Slide 2: 自己紹介 検索

Slide 3: Gnashの紹介 Flash Playerの free な実装 GNUの“High Priority”プロジェクト(らしい) “supports many SWF v7 features” (自称)

Slide 4: 御託はいいから、使ってみる

Slide 5: 実験環境 Ubuntu Linux 7.10 Gutsy Gibbon 理由: 普段はドザーだけど… Windowsはなんかいろいろ面倒なことが起きそうだ!

Slide 6: インストール 一番楽な方法: パッケージで入れる

Slide 7: インストール 一番楽しい方法: 手元でビルドする

Slide 8: ビルド まず、g++ を入れておく configure configureに要求されたパッケージを入れる configure make 簡単でしょう? ※ gtkの開発キットが入ってないと、Mozillaプラグインのビルドが無視されるので注意

Slide 9: さらに必要なもの gstreamer ffmpegプラグイン  flvの再生に必要 gstreamer fluendo mp3プラグイン  音声の再生に必要

Slide 10: 準備完了

Slide 11: 実験台 1

Slide 12: 「2ちゃんねる大王」 2003年 SWFバージョン: 6 * http://512kb.net/

Slide 13: 再生結果 アニメーションは完璧 ボタンのアクションも正常 [ 問題点 ] BGMの速度がおかしい 50点ぐらい

Slide 14: 実験台 2

Slide 15: 「NANACA†CRASH!!」 2005年 SWFバージョン: 7 * http://www.geocities.jp/lledoece/nanaca-crash.html

Slide 16: とりあえず起動 タイトル画面までは到達。 しかし・・・

Slide 17: とりあえず起動 ボタンが押せない (´・ω・)

Slide 18: 応急処置 仕方ねえな、patchるか。(´・ω ・)y━~~ // push 'wait' // getVariable // push 1, 'this' // getVariable // push 'gotoAndStop' // callMethod // pop push 'game', 1, 'this' getVariable flasmで書き換える。 push 'gotoAndPlay' 強制的にゲーム開始 callMethod pop end // of frame 6

Slide 19: (無理矢理)ゲームスタート 画面がグチャグチャに

Slide 20: (無理矢理)ゲームスタート 「NANACA†CRASH!!」 10点ぐらい

Slide 21: 実験台 3

Slide 22: YouTube

Slide 23: YouTube Gnash Projectは明らかにYouTubeを意識している Flash8以降の機能を先行実装(YouTubeのため) ソース中のコメントにもYouTubeがどうこうとか書いてある YouTube Gnash Mozilla GNU/Linux Gnashが完成すると、Free SoftwareのスタックだけでYouTubeが見られる

Slide 24: 再生は問題なし 4 音もちゃんと同期する

Slide 25: 再生は問題なし 4 音もちゃんと同期する [ 問題点 ] シークできない!(かなり不便) バッファリングがちょっと変 50点ぐらい

Slide 26: まとめ ゆ Gnashの往く道は険しい。

Slide 27: コードを覗いてみよう Inside Gnash

Slide 28: Gnashのソースツリー gnash-0.8.2 server vm Player本体 VM実装 swf parser libbase ・ ・ GC実装 ・ libgeometory gui ・ ・ ・

Slide 29: Gnashのソースツリー < 見どころ > libbase/GC.h Mark&Sweep GC server/swf.h ニーモニック表 server/vm/ActionExec.cpp 実行制御 server/vm/ASHandlers.cpp 各アクションの実装

Slide 30: GC.h server/libbase/GC.h Mark & Sweep GC GCResource virtual void markReachableResources() prop extends has as_object prop virtual void markReachableResources() prop

Slide 31: swf.h server/swf.h タグ番号 (avm1) アクションID (avm2) オペコード typedef enum { ACTION_END = 0x00, ACTION_NEXTFRAME = 0x04, ACTION_PREVFRAME = 0x05, ACTION_PLAY = 0x06, ACTION_STOP = 0x07, ACTION_TOGGLEQUALITY = 0x08, ・ ・

Slide 32: ActionExec.cpp server/vm/ActionExec.cpp プログラムカウンタ(PC)の管理 各アクションの呼び出しの起点 void ActionExec::operator() () while (1) { ・ ・ boost::uint8_t action_id = code[pc]; ・ ・ ash.execute((action_type)action_id, *this); ・ ・ pc = next_pc; ・ ・ }

Slide 33: ASHandlers.cpp server/vm/ASHandlers.cpp SWFHandlers::ActionXXX メソッドに XXX アクションの実装 (良くも悪くも)“ひねりのない”実装、「動く仕様書」

Slide 34: ASHandlers.cpp void SWFHandlers::ActionLessThan(ActionExec& thread) { as_environment& env = thread.env; thread.ensureStack(2); env.top(1).set_bool(env.top(1).to_number() < env.top(0).to_number()); if ( env.get_version() < 5 ) env.top(1).convert_to_number(); env.drop(1); } 0 A A 1 B B<A? B<A?

Slide 35: 呼び出しフロー ActionExec::operator() SWFHandlers::execute() ActionHandler::execute() ActionHandler::execute() SWFHandlers::ActionLessThan SWFHandlers::ActionLogicalAnd

Slide 36: Gnashを真似てみる

Slide 37: tinyaction AS3で実装したgnash-vmもどき(=avm1もどき) 命令の解釈・実行 実装 スコープ管理 メモリ管理 本物のVMに丸投げ 型の管理 例外処理 メンドクセ Available on CodeRepos.org http://coderepos.org/share/browser/lang/actionscript/tinyaction

Slide 38: デモ フィボナッチ数列生成 再帰で記述 コール/リターン がちゃんとできてるかどうか f(3) 0 1 1 2 f(2) 0 1 1 f(1) 0 1 f(0) 0

Slide 39: フィボナッチ数列生成(再帰) class FiboTestScript { static function fibo_r(n, arr) { if (n == 0) { // stop arr = [0] arr.push(0); } else if (n == 1) { fibo_r(0, arr); arr = [0, 1] arr.push(1); } else { fibo_r(n - 1, arr); arr = [0, 1, 1] arr = [0, 1, 1, 2] var len = arr.length; arr.push(arr[len - 1] + arr[len - 2]); arr = [0, 1, 1, 2, 3] } ・ } } ・

Slide 40: 前のスライドのスクリプトをバイトコードに変換 mtascでコンパイル swfファイルからバイト コードだけを抜き出し ファイルに書き出し FiboTestScript FiboTestScript _global prototype fibo_r push length ASSetPropFlags fibo_r 2 params 2n 3 arr 5 regs 0x0029 lgcABAIHAAAAAEkSnQIAGACWDgAHAAAAAAcBAAAABAMIBFIXmQIAmQCWBwAEAgcBAA AASRKdAgAxAJYOAAQDBwAAAAAHAgAAAAgAHJYCAAgDUheWDgAHAQAAAAcBAAAABA MIBFIXmQIAVwCWCQAEAwQCBwEAAAALlgcABwIAAAAIAByWAgAIA1IXlgQABAMIBU6HAQ これを読み込んで、 AEF5YJAAQDBAQHAQAAAAtOlgkABAMEBAcCAAAAC05HlgkABwEAAAAEAwgEUhc= tinyactionで走らせ ます

Slide 41: 実行結果 引数として渡したArrayがレジスタ に格納されている

Slide 42: デモ しあわせ 幸福を呼ぶ白いオタマジャクシのデモ ゲームのキャラクター操作 フレームごとの動作を記述 t=0 現在のフレーム t=1 次のフレーム v = (x , y) v’ = (x’ , y’) bytecode tinyaction VM

Slide 43: キャラクタ操作スクリプト (例) class CharCtrl { static function initChar(data) { data.vx = -1; data.vy = 1; 初期化 data.count = 0; data.bounded = false; } static function tickChar(data) { 下方向に加速 → data.vy += 0.1; data.x += data.vx; data.y += data.vy; 各フレームの動作 一定の速さに if (int(data.vy) == 7) なったら減速 → data.vy = 2; return (data.y <= 680) && (data.x >= -80) && (data.x < 880); } ↑ 画面外に出ていたらfalseを返す(falseを返すと } キャラクターが消える)

Slide 44: ボタンを押すとバイトコードを ロードして実行 http://svn.coderepos.org/share/lang/actionscript/tinyaction/ctest.html

Slide 45: 白いオタマジャクシ (日経エコロミー より)

Slide 46: まとめ Gnashはまだまだ発展途上 開発は活発 VMの教科書としても良質 オリジナルの機能(デバッガとか?)に期待

Slide 47: Thanks!