Upload
gyuque
View
4.525
Download
3
Embed Size (px)
DESCRIPTION
Introducing Gnash, Flash Player implementation from FSF and reading its code.
Citation preview
ビルド
まず、g++ を入れておく
configure
configureに要求されたパッケージを入れる
configure
make
簡単でしょう?
※ gtkの開発キットが入ってないと、Mozillaプラグインのビルドが無視されるので注意
応急処置
仕方ねえな、patchるか。(´・ω ・)y━~~
// push 'wait'
// getVariable
// push 1, 'this'
// getVariable
// push 'gotoAndStop'
// callMethod
// pop
push 'game', 1, 'this'
getVariable
push 'gotoAndPlay'
callMethod
pop
end // of frame 6
強制的にゲーム開始
flasmで書き換える。
YouTube
Gnash Projectは明らかにYouTubeを意識している
Flash8以降の機能を先行実装(YouTubeのため)
ソース中のコメントにもYouTubeがどうこうとか書いてある
Gnashが完成すると、Free SoftwareのスタックだけでYouTubeが見られる
GNU/Linux
Mozilla
Gnash
YouTube
Gnashのソースツリー
< 見どころ >
libbase/GC.h Mark&Sweep GC
server/swf.h ニーモニック表
server/vm/ActionExec.cpp 実行制御
server/vm/ASHandlers.cpp 各アクションの実装
GC.h
server/libbase/GC.h
Mark & Sweep GC
GCResource
virtual void markReachableResources()
as_object
virtual void markReachableResources()
extends
prop
prop
prop
has
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,
・・・
ActionExec.cpp
server/vm/ActionExec.cpp
プログラムカウンタ(PC)の管理
各アクションの呼び出しの起点
while (1) {・・
boost::uint8_t action_id = code[pc];・・
ash.execute((action_type)action_id, *this);・・
pc = next_pc;・・
}
void ActionExec::operator() ()
ASHandlers.cpp
server/vm/ASHandlers.cpp
SWFHandlers::ActionXXX メソッドに XXX アクションの実装
(良くも悪くも)“ひねりのない”実装、「動く仕様書」
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);
}
A
B B<A?
A
B<A?
0
1
呼び出しフロー
ActionExec::operator()
SWFHandlers::execute()
ActionHandler::execute() ActionHandler::execute()
SWFHandlers::ActionLessThan SWFHandlers::ActionLogicalAnd
tinyaction
Available on CodeRepos.org
http://coderepos.org/share/browser/lang/actionscript/tinyaction
命令の解釈・実行
スコープ管理
メモリ管理
型の管理
例外処理
実装
本物のVMに丸投げ
メンドクセ
AS3で実装したgnash-vmもどき(=avm1もどき)
フィボナッチ数列生成(再帰)
class FiboTestScript
{
static function fibo_r(n, arr)
{
if (n == 0)
{
// stop
arr.push(0);
}
else if (n == 1)
{
fibo_r(0, arr);
arr.push(1);
}
else
{
fibo_r(n - 1, arr);
var len = arr.length;
arr.push(arr[len - 1] + arr[len - 2]);
}
}
}
arr = [0]
arr = [0, 1]
arr = [0, 1, 1]
arr = [0, 1, 1, 2]
arr = [0, 1, 1, 2, 3]
・・
FiboTestScript
FiboTestScript _global prototype fibo_r push length ASSetPropFlags
fibo_r
2 params
2 n
3 arr
5 regs
0x0029
lgcABAIHAAAAAEkSnQIAGACWDgAHAAAAAAcBAAAABAMIBFIXmQIAmQCWBwAEAgcBAA
AASRKdAgAxAJYOAAQDBwAAAAAHAgAAAAgAHJYCAAgDUheWDgAHAQAAAAcBAAAABA
MIBFIXmQIAVwCWCQAEAwQCBwEAAAALlgcABwIAAAAIAByWAgAIA1IXlgQABAMIBU6HAQ
AEF5YJAAQDBAQHAQAAAAtOlgkABAMEBAcCAAAAC05HlgkABwEAAAAEAwgEUhc=
mtascでコンパイル
swfファイルからバイトコードだけを抜き出し
ファイルに書き出し
これを読み込んで、tinyactionで走らせます
前のスライドのスクリプトをバイトコードに変換
デモ
幸福を呼ぶ白いオタマジャクシのデモ
ゲームのキャラクター操作
フレームごとの動作を記述
しあわせ
bytecode
tinyaction VM
t=0現在のフレーム t=1次のフレーム
v = (x , y)v’ = (x’ , y’)
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を返すとキャラクターが消える)
http://svn.coderepos.org/share/lang/actionscript/tinyaction/ctest.html
ボタンを押すとバイトコードをロードして実行