IronPython R2 ~Hello World は任せろ~ 全日本学生ゲーム開発者連合 第6回交流会 筑波大学 AmusementCreators 澤田 進平 自己紹介 名前 澤田 進平 筑波大学 AmusementCreators 元代表 全ゲ連設立者 主要言語 C/C++ C# Squirrel Python 対象者 組み込み言語自体を知らない人 IronPythonを知らない人 C/C++、C#で開発している人 講演内容 組み込み言語について IronPythonについて デモ 実用における注意点 書籍紹介 質疑応答 組み込み言語とは? アプリケーションが必要な時,読み込まれ実行される言語 ● Lua ● Squirrel ● Python ● 独自言語 アプリケーションの動作を拡張 ● プラグイン ● MOD 組み込み言語を使用する利点 動作を外部に分離できる 全てC/C++、C#等で記述すると? ● ● ● 値を変更するだけでも再コンパイルが必要 コンパイル時間が数秒の時なら問題はない 数十秒から数十分のときは? 動作をアプリケーションから分離 ● 分離することにより再コンパイルが必要なくなる 動的リロードが実装可能 アプリケーションを停止せずに動作を変更 ● ● 組み込み言語を使用することにより実装可能 Xtalを除いて言語の機能ではない ● ソースコードを書き換え起動中に再コンパイル プレイしながら調節できるため開発効率の大幅な上昇 動的リロードを可能にするには綿密な設計が必要 後でデモします 安全性 基本的にC/C++より安全 例 配列外への書き込み ● C/C++だと、エラーでアプリケーションが落ちる ● 組み込み言語だと、問題のある場所が明示される 例 メモリリーク ● C/C++だと、解放しない限り、メモリは確保されたまま ● 組み込み言語だと、自動で解放 文法 C/C++ではできないことができる 組み込み言語ごとにロマン溢れる機能が存在 ● ● ● ● 動的型付け クロージャ ラムダ式 コルーチン *C++のテンプレート並にロマン溢れる機能はなし *C#4.0でも可能、というツッコミ禁止 主要な組み込み言語 Lua Squirrel xtal Python AngelScript Pawn 全てC/C++向け 国内のゲームでは上2つが主 組み込み言語の例 Lua 他の言語より高速に動作する組み込み言語 採用例 ● ソニックワールドアドベンチャー ● RagnarokOnline ● CRYSIS ● LETHAL CRISIS ● ● 東方幻想麻雀 不思議の幻想郷 不思議の幻想郷(AQUASTYLE) 組み込み言語の例 Squirrel Luaの影響を受けたオブジェクト指向の組み込み言語 採用例 ● 小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル ● 東方紅舞闘 東方紅舞闘(CUBETYPE) 組み込み言語の例 xtal 国産組み込み言語 最近バージョン1.0になったばかりなので、公開さ れた情報では商業で採用例なし 採用例 ● とあるぱんつの超電磁砲 ● 現在信者募集中(問い合わせはすかいきゅんまで) 組み込み言語の例~番外編~ 組み込み言語を自分で実装 目的に対して最適な言語を使用可能 ロマン溢れる! 例 ● クロノ・トリガー ● サクラ大戦V ● 東方Project 今まで述べた組み込み言語はC/C++用 それではC#の場合は? そこでIronPython IronPython C#で使用可能な組み込み言語 PythonのC#実装 ● 現在、Python2.6の文法相当 ● Java実装のPython、Jythonも存在 VisualC#2010から機能を全て使用可能 導入するメリット・・・の前に そもそも選択の余地が殆ど存在しない C#上で動作する組み込み言語が非常に少ない ● IronPython ● IronRuby ● IronLisp ● IronScheme *C#でC#をコンパイルして、という事も工夫すれば可能 メリット~連携のしやすさ~ C/C++で組み込み言語を使用するより楽 以下の内容を実際に比較 ● C/C++の関数をLuaで使用 ● C#の関数をIronPythonで使用 ● Luaの関数をC/C++で使用 ● IronPythonの関数をC#で使用 関数は全てx,yを引数にとり、x+yを返す関数 ● int Add( int x, int y ) { return x + y; } C/C++の関数をLuaで使用 仕様に沿って用意された専用の関数が必要 関数をLuaに登録することにより使用可能 // 専用のLuaで使うための関数 int Add(lua_State *L) { int x = (int)lua_tonumber( L, -1 ); int y = (int)lua_tonumber( L, -2 ); lua_pushnumber( L, x + y ); return 2; } // C/C++の関数AddをLuaで使用できるよう登録 lua_register( L, “Add”, Add ); ● C#の関数をIronPythonで使用 C#で記述した関数をそのまま使用可能 関数をIronPythonに登録することにより使用可能 ● scope.SetVariable("Add", new Func<int,int,int>(Add)); // C#の関数 public static int Add(int x, int y) { return x + y; } Luaの関数をC/C++で使用 Luaで記述された関数Addを実行 最低でも6回、Luaの関数を実行する必要 複雑で非直感的 // 関数Addを実行 int x = 1, y = 2, result; lua_getglobal(L, "Add"); lua_pushnumber(L, x); lua_pushnumber(L, y); lua_pcall(L, 2, 1, 0); result = lua_tointeger(L, -1); lua_pop(L,1); ● C#の関数をIronPythonで使用 IronPythonで記述された関数Addを実行 非常にシンプルで直感的 // 関数Addを実行 int result = py.Add(1, 2); 前ページと実行内容は一緒!! メリット~文法~ Python系の言語を導入するメリット 読みやすく書かざるえない文法 素人にコードを書かすことも可能 //わかりにくいC int func(int x) { if(x==0){return 1;} else if (x==1){return 1;} else {return func(x-2)+func(x-1)} # Python int func( x ): If x == 0: return 1 elif x == 0: return 1 else: return func(x-2)+func(x-1) 実際に簡単なSTGもどきを開発してみた 問題点 実行速度 Squirrelより遅い実行速度 Pythonと同じ程度 ● つまりC言語の1/100の速度 全てをIronPythonで記述するとSFCレベル 例:メインループをC#、弾幕の動作をIronPython ● Core2Duo E6400で20~30%使用 ● エフェクトを実装すると恐らくコア1つ使用 対策 基本的にC#で記述 拡張したい部分をIronPythonで記述 複雑な計算はC#の関数でまとめる バインドが楽なので積極的に両言語の利点を使用 そもそも重いゲームをC#で開発しない ● C/C++と比較するとC#もかなり低速 ● 2/3~1/50倍の速度 速度検証 ループのみ ● 四則演算 ● 高速 Xtal > Lua > Python > Squirrel > IronPython 低速 高速 Lua > Xtal > Squirrel > IronPython > Python 低速 ハッシュテーブル ● 高速 Squirrel = Python > Xtal > Lua > IronPython 低速 – IronPythonだけ圧倒的に遅い。 import IronPython標準の機能 import ソースコードからソースコードを読み込む機能 これの性能が微妙 ● ● ディレクトリを指定できない カレントディレクトリからのみ読み込み可能 対策 独自のimportを実装する ● 後日配布のサンプル参照 ソースコードからソースコードを読み込まない ● C#で文字列としてソースコードを読み込む ● IronPythonで文字列からコンパイル 採用例 Age of Ethanols 実行速度の問題 オブジェクト数が最低数千 ● IronPythonを使用する部分は限定 ● ● ● キャラクター固有の特殊な動作 能力 AI 実は30fps ● 2Dゲームではトップクラスの負荷 RTSに60fpsは必要ない その結果、シングルコアでも遊べる速度に importの問題 1動作、1キャラそれぞれに1ファイル よく使用する機能はC#側で実装 文法によるメリット IronPython部分を記述してるのは非プログラマ 簡単な言語なので非プログラマでも使用可能 非プログラマが書いても読みやすい 書籍紹介 そんなものはほとんどない ● IronPythonの世界(日本語) – ● IronPython in Action(洋書,英語) – 資料が古く、組み込みに関するコードは8割くらい通らない 資料が古く、組み込みに関するコードは9割くらい通る 半年前に動いたコードが通らなくなる程度 発展途上の言語なんで仕方が無い VisualC#のIntelliSenseが一番役に立つ まとめ IronPythonは非常に面白い言語 ● 今、手をだす人は「よく訓練された人柱」 ● 基本的に英語が読めないと辛い 正直、C#からC#をコンパイルしたほうが楽・・・かも ● 実用性は別問題 CsharpCodeProviderを使用 そもそも、C#に組み込み言語が必要なのか怪しい ● C#はコンパイルが早い ご清聴ありがとうございました Q&A
© Copyright 2024 Paperzz