IronPython R2 - 全日本学生ゲーム開発者連合(全ゲ連)資料置き場

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