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 2025 Paperzz