コアタイプ

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

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

定義

Godot は、現在すべてのコンパイラでサポートされている標準のC98データ型 ( uint8_tuint32_tint64_t など) を使用します。それらのホイールを再発明するのは楽しくありません。コードを読みにくくするからです。

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

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

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

参照:

メモリモデル

PC is a wonderful architecture. Computers often have gigabytes of RAM, terabytes of storage and gigahertz of CPU, and when an application needs more resources the OS will swap out the inactive ones. Other architectures (like mobile or consoles) are in general more limited.

The most common memory model is the heap, where an application will request a region of memory, and the underlying OS will try to fit it somewhere and return it. This often works best and is flexible, but over time and with abuse, this can lead to segmentation.

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

However, in many studies and tests, it is shown that given enough memory, if the maximum allocation size is below a given threshold in proportion to the maximum heap size and proportion of memory intended to be unused, segmentation will not be a problem over time as it will remain constant. In other words, leave 10-20% of your memory free and perform all small allocations and you are fine.

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

メモリの割り当て

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

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

memalloc()
memrealloc()
memfree()

These are equivalent to the usual malloc, realloc, free of the standard C library.

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, the PoolVector<> template is provided. PoolVector is a standard vector class, and is very similar to vector in the C++ standard library. To create a PoolVector buffer, use this:

PoolVector<int> data;

PoolVector can be accessed using the [] operator and a few helpers exist for this:

PoolVector<int>::Read r = data.read()
int someint = r[4]
PoolVector<int>::Write w = data.write()
w[4] = 22;

These operations allow fast read/write from PoolVectors and keep it locked until they go out of scope. However, PoolVectors should be used for small, dynamic memory operations, as read() and write() are too slow for a large amount of accesses.

コンテナ

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

  • ベクター(Vector)
  • List
  • 設定
  • Map

C++のテンプレートは多くの場合インライン化され、デバッグシンボルとコードの両方でバイナリサイズがかなり大きくなるため、これらはシンプルで、可能な限り最小限にすることを目指しています。リスト、セット、およびマップは、次のようにポインターを使用して反復できます:

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

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

  • 書き込み時にコピーするので、変更しない限りコピーを作成する方が安価です。
  • 参照カウンタでアトミック操作を使用して、マルチスレッドをサポートします。

文字列

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

参照:

StringName

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

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

算術型

There are several linear math types available in the core/math directory.

参照:

NodePath

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

参照:

RID

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

参照: