Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

コアタイプ

Godot には、そのコアを構成する豊富なクラスとテンプレートのセットがあり、すべてがその上に構築されています。

このリファレンスでは、理解を深めるためにそれらをリストしようとします。

定義

Godot uses the standard C99 datatypes, such as uint8_t, uint32_t, int64_t, etc. which are nowadays supported by every compiler. Reinventing the wheel for those is not fun, as it makes code more difficult to read.

一般に、大きな構造体や配列を使用しない限り、特定のタスクで最も効率的なデータ型を使用するようには注意が必要です。 int は、必要な場合を除き、ほとんどのコードで使用されます。これは、今日ではすべてのデバイスが少なくとも32ビットバスを持っており、1サイクルでそのような操作を行うことができるので行われます。コードも読みやすくなります。

ファイルまたはメモリサイズの場合は、 size_t が使用され、64ビットであることが保証されます。

Unicode文字の場合、多くのアーキテクチャには4バイトの長いwchar_tがあり、2バイトが必要な場合があるため、wchar_tの代わりにCharTypeが使用されます。ただし、デフォルトでは、これは強制されておらず、CharTypeはwchar_tに直接マップされます。

リファレンス:

メモリモデル

PCは素晴らしいアーキテクチャです。多くの場合、コンピューターにはギガバイトのRAM、テラバイトのストレージ、ギガヘルツのCPUがあり、アプリケーションがさらにリソースを必要とすると、OSは非アクティブなリソースをスワップアウトします。その他のアーキテクチャ(モバイルやコンソールなど)は、一般的にもっと制限されています。

最も一般的なメモリモデルはヒープです。ヒープは、アプリケーションがメモリの領域を要求し、基盤となるOSがそれをどこかに適合させて返すことを試みます。これは、多くの場合、最適に機能し、柔軟性がありますが、時間が経つと乱用されると、セグメンテーションにつながる可能性があります。

セグメンテーションでは、ほとんどの一般的な割り当てには小さすぎるホールがゆっくりと作成されるため、メモリが浪費されます。ヒープとセグメンテーションについては多くの文献があるため、ここではこのトピックについては詳しく説明しません。最近のオペレーティング・システムはページ・メモリーを使用するため、セグメンテーションの問題は緩和されますが、解決されません。

ただし、多くの調査とテストでは、十分なメモリがある場合、最大ヒープサイズと未使用のメモリの割合に比例して最大割り当てサイズが所定のしきい値を下回っていれば、時間が経過してもセグメンテーションは一定のままで、問題にならないことが示されています。つまり、メモリの10〜20%を空けて、小さな割り当てですべて実行すれば大丈夫です。

Godotは、動的に割り当てることができるすべてのオブジェクトが小さいことを要求します(せいぜい数KB未満)。しかし、割り当てが大きすぎるとどうなりますか(画像やメッシュジオメトリ、大きな配列など)?この場合、Godotには動的メモリプールを使用するオプションがあります。このメモリにアクセスするにはロックする必要があり、割り当てがメモリ不足になると、プールは必要に応じて再配置および圧縮されます。ゲームのニーズに応じて、プログラマは動的メモリプールサイズを構成できます。

メモリの割り当て

Godot には、特にデバッグ中にゲーム内のメモリ使用量を追跡するための多くのツールがあります。このため、通常のCおよびC++ライブラリ呼び出しは使用しないでください。代わりに、他にもいくつか用意されています。

Cスタイルの割り当てでは、Godotはいくつかのマクロを提供します:

memalloc()
memrealloc()
memfree()

これらは、標準Cライブラリに含まれる通常のmalloc、realloc、freeと同等です。

C++スタイルの割り当てでは、特別なマクロが提供されます:

memnew( Class / Class(args) )
memdelete( instance )

memnew_arr( Class , amount )
memdelete_arr( pointer to array )

これは、new、delete、new[]およびdelete[]と同じです。

memnew/memdeleteはまた、小さなC++マジックを使用し、オブジェクトが作成された直後に、そして削除される直前にオブジェクトに通知します。

For dynamic memory, use one of Godot's sequence types such as Vector<> or LocalVector<>. Vector<> behaves much like an STL std::vector<>, but is simpler and uses Copy-On-Write (CoW) semantics. CoW copies of Vector<> can safely access the same data from different threads, but several threads cannot access the same Vector<> instance safely. It can be safely passed via public API if it has a Packed alias.

The Packed*Array types are aliases for specific Vector<*> types (e.g., PackedByteArray, PackedInt32Array) that are accessible via GDScript. Outside of core, prefer using the Packed*Array aliases for functions exposed to scripts, and Vector<> for other occasions.

LocalVector<> is much more like std::vector than Vector<>. It is non-CoW, with less overhead. It is intended for internal use where the benefits of CoW are not needed. Note that neither LocalVector<> nor Vector<> are drop-in replacements for each other. They are two unrelated types with similar interfaces, both using a buffer as their storage strategy.

List<> is another Godot sequence type, using a doubly-linked list as its storage strategy. Prefer Vector<> (or LocalVector<>) over List<> unless you're sure you need it, as cache locality and memory fragmentation tend to be more important with small collections.

リファレンス:

コンテナ

Godot には、一般的なコンテナのセットも用意されています:

  • ベクトル

  • List

  • 設定

  • Map

They aim to be as minimal as possible, as templates in C++ are often inlined and make the binary size much fatter, both in debug symbols and code. List, Set and Map can be iterated using pointers, like this:

for(List<int>::Element *E=somelist.front();E;E=E->next()) {
    print_line(E->get()); // print the element
}

Vector<> クラスには、いくつかの優れた機能もあります:

  • 書き込み時にコピーするので、変更しない限りコピーを作成する方が安価です。

  • 参照カウンタでアトミック操作を使用して、マルチスレッドをサポートします。

リファレンス:

文字列

GodotはStringクラスも提供しています。このクラスには、膨大な量の機能、すべての関数(類似ケース操作)での完全なUnicodeサポート、utf8解析/抽出、そして変換と視覚化のためのヘルパーがあります。

リファレンス:

StringName

StringNameはStringに似ていますが、一意です。文字列からStringNameを作成すると、すべての等しい文字列に対して一意の内部ポインターが作成されます。文字列を比較することは基本的にポインタを比較するため、StringNameは識別子として文字列を使用するのに便利です。

StringName(特に新しい文字列)の作成は遅くなりますが、比較は高速です。

リファレンス:

算術型

core/mathディレクトリには、いくつかの線形数学タイプがあります。

リファレンス:

NodePath

これは、シーンツリーにパスを格納し、高速に参照するために使用される特別なデータ型です。

リファレンス:

RID

RIDはリソースIDです。 サーバーはこれらを使用して、保存されているデータを参照します。 RIDは不透明です。つまり、RIDが参照するデータに直接アクセスすることはできません。 RIDは、さまざまな種類の参照データに対しても一意です。

リファレンス: