1746355718
2025-05-02 20:50:00
2025年4月29日
•
11
最小読み•
ベンジャミンG.トンプソン
1年前、私はZigでパズルゲームをゼロからプログラミングし始めました。ゲームを発表するのは時期尚早ですが(今年後半にこれについては詳細)、これまでのZigでGamedevについて得た洞察のいくつかを共有したいと思います。
私はこれを書いています。なぜなら、私は言語で比較的短い時間を費やした人々からのZigの多くのテイクを見てきたからです(例: コードの出現)、しかし、言語を1年以上使用してきた人からは比較的少数です。
以下の洞察と例は最終的にGamedevから出てきましたが、Gamedev以外の人々にも適用できるほど広い言語とエコシステムの側面に焦点を当てようとしました。近い将来、Zigで大規模なプロジェクトを試みることを検討している人にとって有用であることを願っています。
1. Zigの不一致は、小学校と中間レベルの言語の問題を解決するのに非常に役立ちます。
Zig Discordは、Zigを学習する人にとって素晴らしいリソースです。いつでも、 zig-help フォーラムは、「逆にループをどのように作るのか?ほとんどは数分以内に答えられます。
ただし、3Dゲームをゼロからプログラミングする人は誰でも、難易度の高いクラスにある言語の問題に間違いなくつまずくでしょう。私はほんの一握りに遭遇し、ほとんどの場合、ジグの不一致が彼らに答えただけでなく、数分以内にもそうしたことを見つけて喜んでいた。そのような例を説明させてください。
特定のプレイテストセッション中に、ラップトップでゲームを作成し、バイナリをUSBにコピーしました。私の友人がUSBからデスクトップでゲームを起動しようとしたとき、それは始まりましたが、すぐにクラッシュしました。どちらも同じオペレーティングシステムを実行していて、ゲームは私のラップトップで期待どおりに実行されました。何が起こっていたのですか?
「Hello World!」を作成することで、問題を最も基本的なケースに減らしました。 zigのバイナリ。これも友人のデスクトップでクラッシュしたとき、私はそれをポータブルデバッガーで実行しました(RemedyDB)。バイナリには 認識されていない指示。
はぁ?!私は奇妙な方法でバイナリを構築していませんでした – 私は標準を使用していました zig build --Doptimize=ReleaseFast 指示。
私はZigの不一致に目を向け、すぐに問題が特定され、解決されました:Zigが最適化をオンにしてコンパイルされたとき、デフォルトでは最高のものを使用します マイクロアーキテクチャ 利用可能。
両方とも私たちのCPUが期待されていました x86-64 指示ですが、私のラップトップは期待していました x86-64-v4 私の友人のデスクトップが期待されていましたが x86-64-v2。私のCPUは、処理方法を知っていました vpbroadcast 命令;私の友人のCPUはしませんでした。
旗でゲームをコンパイルした後 -Dcpu=baseline、バイナリにのみ含まれています x86-64-v1 指示、私の友人がゲームをプレイできるようにします。
Zigの不一致がなければ、修正を把握するのに何日もかかったでしょう。しかし、コンパイラの内部に関する専門知識を持つ不一致の人々の数は、それが15分以内に解決されたことを意味しました。
2。Zigはベクターの良い組み込みサポートを持っていますが、マトリックスではありません。
ベクターは、明らかに2Dおよび3Dゲームエンジンの重要な部分です。 Zigは彼らのサポートを構築しています。つまり、多くのオペレーターがベクトルタイプをサポートし、可能であればSIMD命令を使用するようにコンパイルします。
たとえば、2つの4次元ベクトル間のユークリッド距離の計算を検討してください。 Zigでは、これは次の関数を定義するのと同じくらい簡単です。

コンパイルされたら、 デバッグモードでも、Zigは、この操作がいくつかのSIMD命令で計算できることを知っています。単一の場合、各ベクトルコンポーネントを個別に減算して掛ける必要はありません vsubps そして vmulps 指示で十分です:

(の指示 @reduce() ステップは少し非効率的ですが、これもデバッグモードからのアセンブリです。)
Zigにはマトリックスのビルトインサポートも同様にサポートされていると報告したいと思いますが、これは(まだ)そうではありません。基本的な線形代数サポートさえ必要な場合は、自分でオーダーメイドのライブラリを書くか、既存のCライブラリを使用する必要があります。
とにかく私のゲームのエンジンを書いているので、これは私にとっての契約breakerではありませんが、同様のプロジェクトを開始する前に、何らかの能力で公式のマトリックスのサポートを望んでいる人もいることを知っています。
3. Zigビルドシステムは、Cmake、Ninja、Mesonなどと比較して、新鮮な空気の息吹です。
昨年、私は高性能コンピューティングに進出しました。私は、計算科学研究全体で広く使用されているGMP算術ライブラリのソースを読んでいて、そのビルドシステムで以下を発見しました。

これが災害であることを認識するために、ビルドシステムの経験が必要です。 (注:から取られたスクリーンショット 現在のGMPリリース、 6.3.0。)
対照的に、以下はビルドファイルの一部です 幽霊、最新のオープンソースプロジェクト ミッチェル・ハシモト、zigで書かれています。違いは昼と昼と同じくらい明確です:

さて、私はここでチェリーピッキングを認めます – 私はAutomakeによって生成されたファイルを選びました – 特にGMPを選ぶつもりはありません。しかし、これらの例は、他のビルドシステムとZigの違いを表していると思います。
私にとって、私のゲームにZigビルドシステムを使用することは、私が持っていたものよりも良い経験でした 全て その他のビルドシステム。
私は嘘をつきません、Zigビルドシステムを学ぶのは簡単ではありません – それはしばしば私に頭痛を与えます。しかし、cmakeは比較すると下顎膜下出血です。中程度に複雑なC/C ++プロジェクトをコンパイルすると、不可解なスクリプト言語の知識が必要ないはずです。
ほとんどのビルドシステムとは対照的に、Zigビルドファイル自体はZigプログラムです。ビルドシステムのソースコードは標準ライブラリの一部であるため、zigプログラムのようにデバッグできます(たとえば、独自のプログラムを挿入できます print ビルドシステムライブラリへのステートメント – 私がたまにやったように)。
4.標準的なライブラリには不完全な部分があります(そして、これはほとんど大丈夫です)。
昨年、私はゲームで、2つの反対側の角を通る垂直軸でキューブが回転することで構成されるアイコンを作成したかったのです。

キューブをその標準的な方向(原点の中心、XYZ軸に平行なエッジ)から、2つの連続した単純な回転でこの構成に回転させることができます。
- X軸の周りのπ / 4による回転により、キューブの「上」がエッジになります。
- 他の水平軸に沿ったθによる回転。
エクササイズ:θとは何ですか? (ヒント:そうです ない π / 4に等しい
ただし、θの計算でゲームをコンパイルしようとしたとき、次のエラーが発生しました。

このような瞬間は一般的ではありませんが、私が使用しているコンパイラがなぜ 0.14.0 – 正面にゼロがあります。
この特定のインスタンスはわずかに迷惑でしたが、大したことではありませんでした。私は角度を焼いただけです。しかし、今日の大きなZigプロジェクトに取り組んでいる間、このように標準的なライブラリが不完全であるための問題が浮上し、それらを回避する必要があることを知っておくことが重要だと思います。
5.コンパイラは、大きく、エキサイティングで壊れた方法で定期的に変更されます。
私のゲームに取り組んでいる間、私はいくつかのZigコンパイラリリースを経験しました。毎回、新しいコンパイラでゲームを構築しようとしたときに何かが失敗しました。ビルドシステム自体が更新されていたか、言語自体が壊れた変更、またはその両方がありました。
しかし、いずれの場合も、2時間以内にゲームを再びコンパイルすることができました。年間2つの主要リリースしかないので、それほど面倒ではありません。
その見返りに、私は言語とツールチェーンにたくさんの前向きな変化を経験しました。
1つは、リリースごとにコンパイル時間が速くなっています。他の人はアプリケーションのパフォーマンスの増加も指摘しています:Mitchell Hashimoto 報告されています GhosttyのスクロールベンチマークがZigから移行した後、3〜5%速くなったこと 0.13.0 に 0.14.0 (しかし これはノイズである可能性があると警告した)。
私はそれに注意する必要があります 大きい デバッグコンパイル時間の短縮も角を曲がっています。 Zigチームにはあります ほぼ排除されました x86-linuxにデバッグビルドを生成するためのLLVMへの依存関係。新しいX86バックエンドを使用していくつかの基本的なプログラムをコンパイルしましたが、LLVMバックエンドをダストに残します。新しいバックエンドは、ベクターを広範囲に使用しているため、現在私のゲームをコンパイルしていませんが、ようなエラーが発生します。 TODO implement airReduce for @Vector(3, f32) – 完了すると、コンパイル時間の短縮が重要になることを完全に期待しています。
別の変化があります --watch コンパイルオプション(例: zig build --watch)。これにより、コンパイラは永続的に「オン」状態になり、変更のためにソースファイルを監視します。ファイルの変更を検出するとすぐに、別のコンパイルを試みます。
LSPとインターフェイスすることなく編集を保存した後、コンパイラが自動的にコードの次のエラーを見つけると、時間を節約でき、満足しています。と組み合わせると インクリメンタルコンピレーション (もう1つの機能が近づいています)、編集を保存してコンパイルの試行仕上げのレイテンシは、指をクリックするのにかかるよりも時間がかかる可能性があります。
先に進むことができますが、今はここを離れます。全体として、私はこれまでのところZigでゲームを構築するのに楽しい時間を過ごしました。私は多くの苦情を持っていません。言語、ツールチェーン、および標準ライブラリはまだアクティブな開発中であるため、私が持っている苦情の多くは、今後のリリースで対処される可能性があります。 Zigでゲームに取り組み続け、今後のZigリリースに取り組むことに興奮しています。
#ZigのGamedevの年を振り返ります