虎の巻 - Effective AngelScript
Last-modified: 2010-04-27 (火) 22:41:09
このページについて
AngelScript(以下AS)を使うにあたって知っておいたほうがお得な情報を紹介していきます。
オブジェクトを引数にとるときはオブジェクトハンドルではなく参照を使おう
下記のような2つの関数があった場合,funcHandleのほうが処理が重くなります。
1
2
3
4
5
6
7
8
9
|
-
!
-
!
| class Class {};
void funcRef( Class& obj )
{
}
void funcHandle( Class@ obj )
{
}
|
これは,funcHandleはオブジェクトハンドルで受け取っていることが原因で参照カウント処理が挿入されるためです。
オブジェクトハンドルを引数に使わないといけないケースはないはずなので
関数の引数には参照のみを使うようにしましょう。
よく使うコードはASではなくC++で書こう
ASコード上で定義したクラスの動作はあまり速くありません。
遅い原因として
・ASコード上で定義したクラスはアクセス時に参照カウント処理が必ず入る
・仮想マシン上でコードが実行されるためネイティブなC++コードと比べて処理が重い
といったことが挙げられます。
このようなところから,よく使うコードはC++で書いてバインドするようにしましょう。
筆者はVector3やMatrix34などよく使う数学クラスなどをC++で書いてバインドしています。
ASコードでしか登録できないもの・C++コードでしか登録できないものを把握しよう
ASコードで登録できるもの全てがC++コードで登録できるわけではありません。
また逆に,C++コードで登録できるもの全てがASコードで登録できるわけではありません。
ASコード,C++コード,それぞれが登録できるものは把握しておきましょう。
下記の表がそれのまとめになります。
項目 | AS | C++ |
クラスを継承したクラスの宣言 | o | x |
インターフェースを継承したクラスの宣言 | o | x |
POD型のクラスの宣言 | x | o |
値型のクラスの宣言 | x | o |
C++のPOD型のクラスはasOBJ_PODフラグを付けよう
C++コード上のPOD型のクラスをASにバインドするときはasOBJ_PODをつけるようにしましょう。
ここでいうPOD型とは,メンバ変数にポインタやオブジェクトハンドルを持たない型のことです。
asOBJ_PODをつけるとデフォルトコンストラクタ・代入演算子の定義が必要なくなると共に代入演算関数が自動生成されます。
in,out,inoutについて理解しよう
ASの関数の引数に使われる&in,&out,&inout修飾子は少々癖があります。
これらの使い分けについて理解しておきましょう。
下記の表に各修飾子をつけたときの動作の説明を記述しました。
修飾子 | 動作説明 |
&in | 関数コール時に渡された値が一時変数にコピーされ,関数本体にはコピーされた一時変数の参照が渡されます。 |
const &in | 関数コール時に渡された参照を,そのまま関数本体に渡します。 |
&out | 未初期化の一時変数の参照が関数本体に渡されます。 関数の処理が終了するタイミングで,その一時変数の値を関数コール時に渡されたに参照に代入します。 |
const &out | 動作内容が不明です。 (公式のドキュメントには「この修飾子は役にたたない」としか書かれていない) |
&inout | 関数コール時に渡された参照を,そのまま関数本体に渡します。
[下記の内容が公式のドキュメントに書かれていますが,最新版ではコンパイルエラーにならないようです。情報が古い?] ただし,内容の書き換えが可能なため,一時変数を渡すことはできません。(コンパイルエラーになります) もし,一時変数を渡したいのであれば,ローカル変数として一度インスタンス化したものを渡してください。 |
const &inout | 動作内容が不明です。 (公式のドキュメントには「この参照は関数内で変更ができません」としか書かれていない) |
通常使うであろう修飾子は
の3種類です。
(&inは処理パフォーマンスが悪くなるので使うことはないでしょう。)
この3種類の使い方と動作さえ覚えておけばコーディングで困ることはないでしょう。
処理負荷が軽いメモリアロケータを登録しよう
ASはスクリプト実行時にかなりの回数のAlloc/Freeをコールします。
そのため,asSetGlobalMemoryFunctions関数で登録したメモリアロケータのパフォーマンスが
スクリプトのパフォーマンスに大きな影響を与えます。
ASに登録するメモリアロケータは処理負荷が軽いものを登録するようにしましょう。