Rust로 크로스 플랫폼 게임을 개발해 보세요~

I. 소개

  어렸을 때 워크래프트 III MOD의 마법에 푹 빠진 이후로 저는 항상 게임 스크립팅 언어에 특별한 애정을 갖고 있었습니다. 당시를 돌이켜보면 블리자드가 개발한 JASS 언어는 워크래프트 3의 게임 레벨을 개발하는 데 사용됐다. JASS는 오늘날의 관점에서 볼 때 매우 투박하지만 주요 기능은 정적 타이핑 + GC 기능 없음이었는데, 업계 표준은 아직 형성되지 않았으며 게임 개발 언어에 대한 과감한 시도를 나타냅니다.

게임을 개발할 때 스크립팅 언어를 사용하는 이유는 무엇입니까?

  게임 스크립팅 언어의 도입은 주로 개발 및 테스트의 편의성을 향상시키기 위한 것입니다. C++와 같은 저수준 언어를 직접 사용하는 경우 코드 줄을 변경할 때마다 복잡한 도구 체인의 컴파일 및 패키징을 기다리는 데 많은 시간을 소비해야 할 수 있습니다. 스크립팅 언어를 사용하면 게임플레이를 구현하는 프로그램을 핫로드하고 실행할 수 있어 게임 개발 효율성이 크게 향상됩니다.

  시간이 지남에 따라 Lua 및 JavaScript와 같은 동적 유형의 스크립팅 언어가 게임 개발에서 보편화되었습니다. 그러나 프로그래밍 언어의 개발로 우리는 게임 스크립팅 언어에 대한 새로운 표준을 재정의할 수 있는 기회를 얻었습니다. 이는 Rust + WASM의 조합입니다.

2. Rust + WASM + Dora SSR: 게임 스크립트 개발 재정의

  Rust와 WASM을 결합함으로써 예를 들어 전통적인 애플리케이션 개발 도구 체인에 의존하지 않고도 성능 저하 없이 Android 또는 iOS 장치에서 직접 게임을 핫 업데이트하고 테스트할 수 있습니다. 또한 Dora SSR 오픈 소스 게임 엔진의 Web IDE 인터페이스 덕분에 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를 사용 하여 Rust 프로젝트 폴더에 WASM 파일을 업로드합니다. IP 매개변수는 Dora SSR이 시작된 후 표시되는 Web IDE 주소입니다. 업로드 예정:

python3 upload.py "192.168.3.1" "Hello"

스크립트를 사용하여 원클릭 컴파일 완료, 업로드 및 실행 시작

4단계: 게임 게시

  편집기 왼쪽의 게임 리소스 트리에서 새로 생성된 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하고 "다운로드"를 선택합니다.

  브라우저가 패키지된 프로젝트 파일에 대한 다운로드 프롬프트를 표시할 때까지 기다립니다.

3. 달성 방법

  Dora SSR에 Rust 언어 개발 지원 및 WASM 런타임 임베딩을 구현하는 프로세스는 주로 다음 세 가지 주요 단계를 포함하는 새로운 기술 탐색 및 시도입니다.

1. IDL(인터페이스 정의 언어) 설계

  WASM 런타임을 포함하고 C++로 작성된 게임 엔진에 Rust 언어를 지원하려면 먼저 서로 다른 프로그래밍 언어 간의 통신 및 데이터 교환을 용이하게 하는 IDL(인터페이스 정의 언어)을 설계해야 합니다. IDL의 디자인은 C++ 인터페이스를 기반으로 하며, 언어 간 인터페이스 매핑을 수행하기 위해 Rust 언어 기능에 맞는 태그가 추가 되었습니다 object. 다음은 Dora SSR이 설계한 WASM IDL의 인터페이스 예입니다.readonlyoptional

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의 디자인 철학 간의 차이점을 고려하여 우리는 Rust에서 C++의 객체 지향 동작을 부분적으로 시뮬레이션했습니다. 이를 위해서는 C++의 클래스 및 메서드에 대응하기 위해 Rust에서 몇 가지 추가 메커니즘을 작성해야 했습니다. 이 접근 방식은 일부 개발 작업을 추가하지만 인터페이스를 깔끔하게 유지하고 시스템을 유지 관리 가능하게 유지합니다.

2. 글루코드 생성 프로그램

  두 번째 단계는 IDL을 통해 C++, WASM, Rust 간에 서로 호출하기 위한 글루 코드를 생성하는 프로그램을 작성하는 것입니다. 이를 달성하기 위해 우리는 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로 개발된 게임 실행을 지원하여 게임 프로젝트의 접근성과 유연성을 크게 향상시킬 수 있습니다.

  통합 과정에서 우리는 개발자가 향후 Dora SSR 게임 엔진을 기반으로 Rust 언어로 작성된 다른 게임 모듈을 쉽게 개발하고 다시 게시할 수 있도록 필요한 모든 인터페이스와 도구가 포함된 Rust 개발자를 위한 크레이트 패키지를 출시했습니다.

4. 결론

  Dora SSR + Rust를 게임 개발 도구로 선택하는 것은 최첨단 기술을 추구할 뿐만 아니라 게임 개발 프로세스에 대한 새로운 탐구이기도 합니다. 우리는 게임 개발을 사랑하는 모든 사람을 우리 커뮤니티에 참여하여 이 흥미진진한 기술 여정을 함께 탐험할 수 있도록 진심으로 초대합니다. 자세한 내용을 알아보고 개발에 참여하려면 GitHub 저장소프로젝트 홈페이지를 방문해 주셔서 감사합니다 . 게임 개발의 새로운 시대를 함께 만들어 갑시다!

  우리 Q 그룹이 여기 있습니다. 플레이를 환영합니다: 512620381

동료 치킨 "오픈 소스" deepin-IDE 및 마침내 부트스트랩을 달성했습니다! 좋은 친구, Tencent는 Switch를 "생각하는 학습 기계"로 전환했습니다. Tencent Cloud의 4월 8일 실패 검토 및 상황 설명 RustDesk 원격 데스크톱 시작 재구성 웹 클라이언트 WeChat의 SQLite 기반 오픈 소스 터미널 데이터베이스 WCDB의 주요 업그레이드 TIOBE 4월 목록: PHP 사상 최저치로 떨어졌고 FFmpeg의 아버지인 Fabrice Bellard는 오디오 압축 도구인 TSAC를 출시했으며 Google은 대규모 코드 모델인 CodeGemma를 출시했습니다 . 오픈소스라서 너무 좋아요 - 오픈소스 사진 및 포스터 편집기 도구
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/4925410/blog/11052782