Shibuya.abc - Gnashで遊ぼう

47
Gnash であそぼう」 by gyuque Shibuya.abc

description

Introducing Gnash, Flash Player implementation from FSF and reading its code.

Transcript of Shibuya.abc - Gnashで遊ぼう

「Gnashであそぼう」

by gyuqueShibuya.abc

自己紹介

検索

Gnashの紹介

Flash Playerの free な実装

GNUの“High Priority”プロジェクト(らしい)

“supports many SWF v7 features”(自称)

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

実験環境

Ubuntu Linux 7.10 Gutsy Gibbon

理由:

普段はドザーだけど…

Windowsはなんかいろいろ面倒なことが起きそうだ!

インストール

一番楽な方法: パッケージで入れる

インストール

一番楽しい方法: 手元でビルドする

ビルド

まず、g++ を入れておく

configure

configureに要求されたパッケージを入れる

configure

make

簡単でしょう?

※ gtkの開発キットが入ってないと、Mozillaプラグインのビルドが無視されるので注意

さらに必要なもの

gstreamer ffmpegプラグイン flvの再生に必要

gstreamer fluendo mp3プラグイン音声の再生に必要

準備完了

実験台 1

「2ちゃんねる大王」2003年 SWFバージョン: 6

* http://512kb.net/

再生結果

アニメーションは完璧ボタンのアクションも正常

BGMの速度がおかしい[ 問題点 ]

50点ぐらい

実験台 2

「NANACA†CRASH!!」2005年 SWFバージョン: 7

* http://www.geocities.jp/lledoece/nanaca-crash.html

とりあえず起動

タイトル画面までは到達。 しかし・・・

とりあえず起動

ボタンが押せない (´・ω・)

応急処置

仕方ねえな、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で書き換える。

(無理矢理)ゲームスタート

画面がグチャグチャに

(無理矢理)ゲームスタート

「NANACA†CRASH!!」

10点ぐらい

実験台 3

YouTube

YouTube

Gnash Projectは明らかにYouTubeを意識している

Flash8以降の機能を先行実装(YouTubeのため)

ソース中のコメントにもYouTubeがどうこうとか書いてある

Gnashが完成すると、Free SoftwareのスタックだけでYouTubeが見られる

GNU/Linux

Mozilla

Gnash

YouTube

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

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

シークできない!(かなり不便)

バッファリングがちょっと変

[ 問題点 ]

50点ぐらい

まとめ

Gnashの往く道は険しい。ゆ

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

Gnashのソースツリー

gnash-0.8.2server vm

swf

parser

libbase

libgeometory

gui

・・・

・・・

Player本体

GC実装

VM実装

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

Gnashを真似てみる

tinyaction

Available on CodeRepos.org

http://coderepos.org/share/browser/lang/actionscript/tinyaction

命令の解釈・実行

スコープ管理

メモリ管理

型の管理

例外処理

実装

本物のVMに丸投げ

メンドクセ

AS3で実装したgnash-vmもどき(=avm1もどき)

デモ

フィボナッチ数列生成

再帰で記述

コール/リターン がちゃんとできてるかどうか

f(3)

f(2)

f(1)

f(0) 0

0 1

0 1 1

0 1 1 2

フィボナッチ数列生成(再帰)

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で走らせます

前のスライドのスクリプトをバイトコードに変換

実行結果

引数として渡したArrayがレジスタに格納されている

デモ

幸福を呼ぶ白いオタマジャクシのデモ

ゲームのキャラクター操作

フレームごとの動作を記述

しあわせ

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

ボタンを押すとバイトコードをロードして実行

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

まとめ

Gnashはまだまだ発展途上

開発は活発

VMの教科書としても良質

オリジナルの機能(デバッガとか?)に期待

Thanks!