Rustでクロスプラットフォームゲームを開発してみよう〜

I.はじめに

  子供の頃に Warcraft III MOD の魔法に夢中になって以来、私は常にゲーム スクリプト言語に特別な愛情を持ってきました。当時を振り返ると、Warcraft 3 のゲームレベル開発には Blizzard が開発した JASS 言語が使用されていました。JASS は静的型付け + GC 機能なしが主な特徴で、今から見ると非常に粗雑なものではありますが、業界標準はまだ形成されていませんでしたが、これはゲーム開発言語における大胆な試みを表しています。

ゲーム開発にスクリプト言語を使用する理由は何ですか?

  ゲームスクリプト言語の導入は、主に開発とテストの利便性を向上させることを目的としています。 C++ などの低レベル言語を直接使用する場合、コード行を変更するたびに、複雑なツール チェーンのコンパイルとパッケージ化を待機するために多くの時間を費やす必要がある場合があります。スクリプト言語を使用することで、ゲームプレイを実装するプログラムをホットロードして実行できるため、ゲームの開発効率が大幅に向上します。

  時間が経つにつれ、Lua や JavaScript などの動的に型付けされたスクリプト言語がゲーム開発において一般的になりました。しかし、プログラミング言語の発展により、レトロと革新の両方のゲーム スクリプト言語の新しい標準を再定義する機会が得られました。これが Rust + WASM の組み合わせです。

2. Rust + WASM + Dora SSR: ゲームスクリプト開発の再定義

  Rust と WASM を組み合わせることで、たとえば、パフォーマンスを犠牲にすることなく、従来のアプリケーション開発ツール チェーンに依存せずに、Android または iOS デバイス上でゲームを直接ホット アップデートしてテストできます。さらに、Dora SSR オープンソース ゲーム エンジンの Web IDE インターフェイスを利用すると、Rust で書かれたゲーム コードを一度コンパイルしてテストし、さまざまなゲーム デバイス上で実行できます。

なぜRustを選ぶのでしょうか?

  Rust は、ガベージ コレクター (GC) の介入を必要とせずに比類のないメモリの安全性を保証するため、特にパフォーマンスが重視されるシナリオでのゲーム開発に最適です。 WASM と組み合わせると、Rust は高性能の実行効率を提供するだけでなく、クロスプラットフォームの一貫性とセキュリティも維持できます。

クイックスタートガイド

  開発を開始する前に、Dora SSR ゲーム エンジンをインストールする必要があります。このエンジンは、Windows、Linux、macOS、iOS、Android などの複数のプラットフォームをサポートしています。特定のインストール手順と要件については、公式クイック スタート ガイドを参照してください: Dora SSR クイック スタート

macOS 上で実行される Dora SSR v1.3.17 バージョン

ステップ 1: 新しいプロジェクトを作成する

  Dora SSR エンジン バイナリ プログラムが起動したら、ブラウザで Dora SSR Web IDE を開き、左側のゲーム リソース ツリーを右クリックし、[新規] を選択して、[Hello] という名前の新しいフォルダーを作成します。

ブラウザでDora SSRのWeb IDEにアクセスし、新しいフォルダーを作成します。

ステップ 2: ゲームコードを書く

  次に、コマンドラインで新しい Rust プロジェクトを作成します。

rustup target add wasm32-wasi
cargo new hello-dora --name init
cd hello-dora
cargo add dora_ssr

src/main.rsコードを次のように記述します  。

use dora_ssr::*;

fn main () {
  let mut sprite = match Sprite::with_file("Image/logo.png") {
    Some(sprite) => sprite,
    None => return,
  };
  let mut sprite_clone = sprite.clone();
  sprite.schedule(once(move |mut co| async move {
    for i in (1..=3).rev() {
      p!("{}", i);
      sleep!(co, 1.0);
    }
    p!("Hello World");
    sprite_clone.perform_def(ActionDef::sequence(&vec![
      ActionDef::scale(0.1, 1.0, 0.5, EaseType::Linear),
      ActionDef::scale(0.5, 0.5, 1.0, EaseType::OutBack),
    ]));
  }));
}

  WASM ファイルを構築して生成します。

cargo build --release --target wasm32-wasi

ステップ 3: ゲームをアップロードして実行する

  Dora SSR Web IDE で、新しく作成したフォルダー「Hello」を右クリックし、「アップロード」を選択して、コンパイルされた WASM ファイルをアップロードしますinit.wasm

Web IDE 経由でファイルをアップロードする方が、補助スクリプトを使用するよりも便利な場合があります

  または、補助スクリプトUpload.pyを使用して WASM ファイルを Rust プロジェクト フォルダーにアップロードします。コマンドは次のとおりです。IP パラメーターは、Dora SSR の起動後に表示される Web IDE アドレスです。アップロードされるもの:

python3 upload.py "192.168.3.1" "Hello"

スクリプトを使用してワンクリックでコンパイルを完了し、アップロードして実行を開始します

ステップ 4: ゲームを公開する

  エディター左側のゲームリソースツリーで、新しく作成したプロジェクトフォルダーを右クリックし、「ダウンロード」を選択します。

  ブラウザーに、パッケージ化されたプロジェクト ファイルのダウンロード プロンプトが表示されるまで待ちます。

3. 達成方法

  Rust 言語開発サポートと WASM ランタイム埋め込みを Dora SSR に実装するプロセスは、新たな技術的探求と試みであり、主に 3 つの重要なステップが含まれます。

1. インターフェース定義言語 (IDL) の設計

  WASM ランタイムを埋め込み、C++ で記述されたゲーム エンジンで Rust 言語をサポートするには、まず、異なるプログラミング言語間の通信とデータ交換を容易にするインターフェイス定義言語 (IDL) を設計する必要があります。 IDL の設計は C++ インターフェイスに基づいており、クロス言語インターフェイス マッピングを実行するために、 、 などobjectreadonlyRust言語機能に適合したタグが追加されています。optional以下は、Dora SSR によって設計された WASM IDL のインターフェイスの例です。

object class EntityGroup @ Group
{
	readonly common int count;
	optional readonly common Entity* first;
	optional Entity* find(function<bool(Entity* e)> func) const;
	static EntityGroup* create(VecStr components);
};

  C++ のオブジェクト指向機能と Rust の設計思想の違いを考慮して、C++ のオブジェクト指向の動作を Rust で部分的にシミュレートしました。これには、C++ のクラスとメソッドに対応するいくつかの追加メカニズムを Rust で記述する必要がありました。このアプローチでは開発作業が多少追加されますが、インターフェイスがクリーンに保たれ、システムが保守しやすくなります。

2. グルーコードを生成するプログラム

  2 番目のステップは、C++、WASM、Rust の間で IDL を介して相互に呼び出しを行うためのグルー コードを生成するプログラムを作成することです。これを実現するために、Dora SSR プロジェクトによって作成された Yuescript 言語を使用することにしました。 Yuescript は、Lua に基づく動的プログラミング言語で、Lua 言語エコシステムの lpeg 構文解析ライブラリを組み合わせて、IDL 解析とグルー コード生成を処理します。 Yuescript を使用する利点は、Lua の柔軟性と軽量性を継承しながら、複雑なコード生成タスクの処理に適した、より豊富な構文と関数を提供することです。以下は、PEG 文法を使用して作成された IDL パーサーからのコードの抜粋です。

Param = P {
	"Param"
	Param: V"Func" * White * Name / mark"callback" + Type * White * Name / mark"variable"
	Func: Ct P"function<" * White * Type * White * Ct P"(" * White * (V"Param" * (White * P"," * White * V"Param")^0 * White)^-1 * P")" * White * P">"
}

Method = Docs * Ct(White * MethodLabel) * White * Type * White * (C(P"operator==") + Name) * White * (P"@" * White * Name + Cc false) * White * Ct(P"(" * White * (Param * (White * P"," * White * Param)^0 * White)^-1 * P")") * White * C(P"const")^-1 * White * P";" / mark"method"

3. WASM ランタイムとコードの統合を埋め込む

  最後のステップでは、WASM ランタイムと生成された C++ グルー コードをゲーム エンジンに埋め込んで、コードの統合を完了します。 WASM ランタイムには、複数の CPU アーキテクチャをサポートし、コンパイル チェーンの複雑さを簡素化し、クロスプラットフォーム互換性を向上させる、高性能で軽量な WebAssembly インタープリターである WASM3 を使用することを選択しました。このようにして、Dora SSR は、Rust で開発されたゲームをさまざまなアーキテクチャのハードウェア デバイス上で実行できるようになり、ゲーム プロジェクトのアクセシビリティと柔軟性が大幅に向上します。

  統合プロセス中に、私たちは Rust 開発者向けのクレート パッケージをリリースしました。これには、開発者が将来、Dora SSR ゲーム エンジンに基づいて Rust 言語で書かれた他のゲーム モジュールを簡単に開発して再公開できるように、必要なすべてのインターフェイスとツールが含まれています。

4. 結論

  ゲーム開発ツールとして Dora SSR + Rust を選択することは、最先端のテクノロジーを追求するだけでなく、ゲーム開発プロセスの新たな探求でもあります。ゲーム開発を愛するすべての人が私たちのコミュニティに参加し、このエキサイティングな技術の旅を一緒に探索することを心から歓迎します。詳細を確認し、開発に参加するには、GitHub リポジトリプロジェクトのホームページにようこそ。一緒にゲーム開発の新時代を創りましょう!

  私たちの Q グループがここにあります。ぜひプレイしてください: 512620381

仲間のニワトリがDeepin-IDE を 「オープンソース」化し、ついにブートストラップを達成しました。 いい奴だ、Tencent は本当に Switch を「考える学習機械」に変えた Tencent Cloud の 4 月 8 日の障害レビューと状況説明 RustDesk リモート デスクトップ起動の再構築 Web クライアント WeChat の SQLite ベースのオープンソース ターミナル データベース WCDB がメジャー アップグレードを開始 TIOBE 4 月リスト: PHPは史上最低値に落ち、 FFmpeg の父であるファブリス ベラールはオーディオ圧縮ツール TSAC をリリースし 、Google は大規模なコード モデル CodeGemma をリリースしました 。それはあなたを殺すつもりですか?オープンソースなのでとても優れています - オープンソースの画像およびポスター編集ツール
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4925410/blog/11052782
おすすめ