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
実 行 速 度 の 問 題 オブジェクト 数 が 最 低 数 千 2Dゲームではトップクラスの 負 荷 IronPythonを 使 用 する 部 分 は 限 定 キャラクター 固 有 の 特 殊 な 動 作 能 力 AI 実 は30fps RTSに60fpsは 必 要 ない その 結 果 シングルコアでも 遊 べる 速 度 に
importの 問 題 1 動 作 1キャラそれぞれに1ファイル よく 使 用 する 機 能 はC# 側 で 実 装
文 法 によるメリット IronPython 部 分 を 記 述 してるのは 非 プログラマ 簡 単 な 言 語 なので 非 プログラマでも 使 用 可 能 非 プログラマが 書 いても 読 みやすい
書 籍 紹 介 そんなものはほとんどない IronPythonの 世 界 ( 日 本 語 ) 資 料 が 古 く 組 み 込 みに 関 するコードは8 割 くらい 通 らない IronPython in Action( 洋 書, 英 語 ) 資 料 が 古 く 組 み 込 みに 関 するコードは9 割 くらい 通 る 半 年 前 に 動 いたコードが 通 らなくなる 程 度 発 展 途 上 の 言 語 なんで 仕 方 が 無 い VisualC#のIntelliSenseが 一 番 役 に 立 つ
まとめ IronPythonは 非 常 に 面 白 い 言 語 実 用 性 は 別 問 題 今 手 をだす 人 は よく 訓 練 された 人 柱 基 本 的 に 英 語 が 読 めないと 辛 い 正 直 C#からC#をコンパイルしたほうが 楽 かも CsharpCodeProviderを 使 用 そもそも C#に 組 み 込 み 言 語 が 必 要 なのか 怪 しい C#はコンパイルが 早 い
ご 清 聴 ありがとうございました
Q&A