「Gnashであそぼう」
               by gyuque
                Shibuya.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の開発キット...
さらに必要なもの


 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 ...
(無理矢理)ゲームスタート




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


          「NANACA†CRASH!!」


           10点ぐらい
実験台 3
YouTube
YouTube
Gnash Projectは明らかにYouTubeを意識している
  Flash8以降の機能を先行実装(YouTubeのため)
  ソース中のコメントにもYouTubeがどうこうとか書いてある

      YouTube


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

 50点ぐらい
まとめ


      ゆ

Gnashの往く道は険しい。
コードを覗いてみよう
 Inside Gnash
Gnashのソースツリー
 gnash-0.8.2
                  server       vm
               Player本体       VM実装

                          ...
Gnashのソースツリー

< 見どころ >

libbase/GC.h               Mark&Sweep GC
server/swf.h               ニーモニック表
server/vm/ActionExec.c...
GC.h

server/libbase/GC.h

    Mark & Sweep GC


           GCResource
virtual void markReachableResources()
             ...
swf.h

server/swf.h
   タグ番号
   (avm1) アクションID
   (avm2) オペコード
      typedef enum
      {
          ACTION_END             ...
ActionExec.cpp

server/vm/ActionExec.cpp

   プログラムカウンタ(PC)の管理
   各アクションの呼び出しの起点
  void ActionExec::operator() ()
   while ...
ASHandlers.cpp

server/vm/ASHandlers.cpp

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

  void SWFHandlers::ActionLessThan(ActionExec& thread)
  {
    as_environment& env = thread.env;
    threa...
呼び出しフロー



                       ActionExec::operator()



                      SWFHandlers::execute()




ActionHandler...
Gnashを真似てみる
tinyaction

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

  命令の解釈・実行
                             実装
  スコープ管理
  メモリ管理
                   ...
デモ
フィボナッチ数列生成

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

                 f(3)                     0 1 1 2


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


 class FiboTestScript
 {
            static function fibo_r(n, arr)
            {
                       ...
前のスライドのスクリプトをバイトコードに変換


                                                                          mtascでコンパイル




       ...
実行結果




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

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

       ゲームのキャラクター操作
       フレームごとの動作を記述


t=0 現在のフレーム                     t=1 次のフレーム

        ...
キャラクタ操作スクリプト (例)
 class CharCtrl
 {
          static function initChar(data)
          {
                   data.vx    = -...
ボタンを押すとバイトコードを
            ロードして実行




http://svn.coderepos.org/share/lang/actionscript/tinyaction/ctest.html
白いオタマジャクシ (日経エコロミー より)
まとめ

 Gnashはまだまだ発展途上
 開発は活発
 VMの教科書としても良質
 オリジナルの機能(デバッガとか?)に期待
Thanks!
Upcoming SlideShare
Loading in …5
×

Shibuya.abc - Gnashで遊ぼう

4,799 views

Published on

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

Published in: Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,799
On SlideShare
0
From Embeds
0
Number of Embeds
210
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Shibuya.abc - Gnashで遊ぼう

  1. 1. 「Gnashであそぼう」 by gyuque Shibuya.abc
  2. 2. 自己紹介 検索
  3. 3. Gnashの紹介 Flash Playerの free な実装 GNUの“High Priority”プロジェクト(らしい) “supports many SWF v7 features” (自称)
  4. 4. 御託はいいから、使ってみる
  5. 5. 実験環境 Ubuntu Linux 7.10 Gutsy Gibbon 理由: 普段はドザーだけど… Windowsはなんかいろいろ面倒なことが起きそうだ!
  6. 6. インストール 一番楽な方法: パッケージで入れる
  7. 7. インストール 一番楽しい方法: 手元でビルドする
  8. 8. ビルド まず、g++ を入れておく configure configureに要求されたパッケージを入れる configure make 簡単でしょう? ※ gtkの開発キットが入ってないと、Mozillaプラグインのビルドが無視されるので注意
  9. 9. さらに必要なもの gstreamer ffmpegプラグイン  flvの再生に必要 gstreamer fluendo mp3プラグイン  音声の再生に必要
  10. 10. 準備完了
  11. 11. 実験台 1
  12. 12. 「2ちゃんねる大王」 2003年 SWFバージョン: 6 * http://512kb.net/
  13. 13. 再生結果 アニメーションは完璧 ボタンのアクションも正常 [ 問題点 ] BGMの速度がおかしい 50点ぐらい
  14. 14. 実験台 2
  15. 15. 「NANACA†CRASH!!」 2005年 SWFバージョン: 7 * http://www.geocities.jp/lledoece/nanaca-crash.html
  16. 16. とりあえず起動 タイトル画面までは到達。 しかし・・・
  17. 17. とりあえず起動 ボタンが押せない (´・ω・)
  18. 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
  19. 19. (無理矢理)ゲームスタート 画面がグチャグチャに
  20. 20. (無理矢理)ゲームスタート 「NANACA†CRASH!!」 10点ぐらい
  21. 21. 実験台 3
  22. 22. YouTube
  23. 23. YouTube Gnash Projectは明らかにYouTubeを意識している Flash8以降の機能を先行実装(YouTubeのため) ソース中のコメントにもYouTubeがどうこうとか書いてある YouTube Gnash Mozilla GNU/Linux Gnashが完成すると、Free SoftwareのスタックだけでYouTubeが見られる
  24. 24. 再生は問題なし 4 音もちゃんと同期する
  25. 25. 再生は問題なし 4 音もちゃんと同期する [ 問題点 ] シークできない!(かなり不便) バッファリングがちょっと変 50点ぐらい
  26. 26. まとめ ゆ Gnashの往く道は険しい。
  27. 27. コードを覗いてみよう Inside Gnash
  28. 28. Gnashのソースツリー gnash-0.8.2 server vm Player本体 VM実装 swf parser libbase ・ ・ GC実装 ・ libgeometory gui ・ ・ ・
  29. 29. Gnashのソースツリー < 見どころ > libbase/GC.h Mark&Sweep GC server/swf.h ニーモニック表 server/vm/ActionExec.cpp 実行制御 server/vm/ASHandlers.cpp 各アクションの実装
  30. 30. GC.h server/libbase/GC.h Mark & Sweep GC GCResource virtual void markReachableResources() prop extends has as_object prop virtual void markReachableResources() prop
  31. 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, ・ ・
  32. 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; ・ ・ }
  33. 33. ASHandlers.cpp server/vm/ASHandlers.cpp SWFHandlers::ActionXXX メソッドに XXX アクションの実装 (良くも悪くも)“ひねりのない”実装、「動く仕様書」
  34. 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?
  35. 35. 呼び出しフロー ActionExec::operator() SWFHandlers::execute() ActionHandler::execute() ActionHandler::execute() SWFHandlers::ActionLessThan SWFHandlers::ActionLogicalAnd
  36. 36. Gnashを真似てみる
  37. 37. tinyaction AS3で実装したgnash-vmもどき(=avm1もどき) 命令の解釈・実行 実装 スコープ管理 メモリ管理 本物のVMに丸投げ 型の管理 例外処理 メンドクセ Available on CodeRepos.org http://coderepos.org/share/browser/lang/actionscript/tinyaction
  38. 38. デモ フィボナッチ数列生成 再帰で記述 コール/リターン がちゃんとできてるかどうか f(3) 0 1 1 2 f(2) 0 1 1 f(1) 0 1 f(0) 0
  39. 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] } ・ } } ・
  40. 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で走らせ ます
  41. 41. 実行結果 引数として渡したArrayがレジスタ に格納されている
  42. 42. デモ しあわせ 幸福を呼ぶ白いオタマジャクシのデモ ゲームのキャラクター操作 フレームごとの動作を記述 t=0 現在のフレーム t=1 次のフレーム v = (x , y) v’ = (x’ , y’) bytecode tinyaction VM
  43. 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を返すと } キャラクターが消える)
  44. 44. ボタンを押すとバイトコードを ロードして実行 http://svn.coderepos.org/share/lang/actionscript/tinyaction/ctest.html
  45. 45. 白いオタマジャクシ (日経エコロミー より)
  46. 46. まとめ Gnashはまだまだ発展途上 開発は活発 VMの教科書としても良質 オリジナルの機能(デバッガとか?)に期待
  47. 47. Thanks!

×