shibuya.abc - gnashで遊ぼう

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

Upload: gyuque

Post on 09-Jun-2015

4.523 views

Category:

Business


3 download

DESCRIPTION

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

TRANSCRIPT

「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!