Я ничего не знал о Rust, но после 382 часов написания проектов на этом языке сделал игровой движок Rust для физически корректного рендеринга обезьянки:

Вот эта обезьянка

Напишу, что и как у меня получилось на первом году изучения Rust.

Обезьянка?

На изображении выше  —  обезьянка Сьюзи, отрисованная сделанным на скорую руку игровым движком Rust при помощи шейдера физически корректного рендеринга.

Вот исходный код движка.

Этот проект выполнялся в процессе изучения Rust, поэтому мною проделан максимум работы. Использованные крейты: png для загрузки изображений, windows-rs для поддержки Windows, web-sys, wasm-bindgen и js-sys для веб-поддержки.

Вот функционал, ничего особенного:

  • Движок запускается на Windows и в интернете.
  • Рендеринг с OpenGL на Windows.
  • Рендеринг с WebGL в интернете.
  • Все привязки графических библиотек/загрузка сделаны самостоятельно.
  • Шейдер физически корректного рендеринга, основной источник  —  LearnOpenGL.com.
  • Матричная/векторная алгебра.
  • Архитектура для отделения платформы от движка, игрового кода от кода движка и рендеринг бэкенда от движка.
  • Горячая перезагрузка библиотеки динамической компоновки DLL для разработки на Windows.

О последних 10 месяцах изучения Rust

Краткая предыстория. Я работаю с Unity больше 13 лет, последние восемь  —  старшим инженером-программистом Unity. Написал собственный игровой движок на C++ и физически корректный рендерер/средство передачи освещенности на изображениях, но без официальных или профессиональных релизов.

Вот все мои проекты Rust за этот год, а также затраченное на них время:

  • Gengar  —  название этого игрового движка. От начала и до конца всего 128 часов на создание его проекта, визуализатора и поддержки на Windows и в интернете.
  • Last Finance  —  незавершенное и невыпущенное приложение по бюджетированию с применением Tauri и Leptos.
  • Advent of code  —  это 20 дней решений на Rust для advent of code 2023. Вот репозиторий.
  • Rust Computer Enhance  —  это эмулятор процессора 8086 на основе курсов Computer Enhance Кейси Муратори. Вот репозиторий.
  • Rust  —  это просто чтение «Языка программирования Rust» и различных руководств по Rust.
  • Blockchain  —  изучение блокчейна Rust.
  • И Graphite  —  это изучение проекта редактора Graphite.rs, в развитии которого надеюсь скоро поучаствовать.

Мысли о Rust по прошествии 382 часов

В основном я пишу на C#. Говорят, он сложный. Для меня нет. Возможно, потому, что поработал на C++ и обычно избегаю шаблонов ООП. Но модель владения и система проверки заимствований показались очень естественными. С последней я никогда не «боролся». Система проверки заимствований много жалуется, но в своих жалобах обычно корректна.

Cargo невероятен. В Rust я пишу намного больше тестов, потому что с Cargo тестирование очень плавное. Пишу их, конечно, во время разработки функционала: так тестировать проще, чем вручную. И продолжать эти тесты можно вечно.

Перечисления и исчерпывающее сопоставление с образцом кажутся сверхспособностями в сравнении с C#. Так же, как и неразрывно связанная с этим обработка ошибок. В проектах Unity особенно много неявных допущений о том, чем null является, а чем нет. Если их не делать, код быстро превращается на 10 % в бизнес-логику и на 90 % в проверку null. То же верно в отношении исключений. Их предпочтительнее перехватывать, потому что одно исключение где-нибудь да появится.

В целом, с Rust работать легче. Чтобы справиться с проектом, здесь меньше держишь всего в голове. Благодаря типажам и принципу «композиция вместо наследования», не нужно мысленно загружать дерево переопределений, чтобы понять один метод. А благодаря принципу «эксплицитность вместо имплицитности» в коде сообщается, что происходит. При имплицитности же, чтобы разобраться, потребовался бы мысленный поиск.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Ryan Rothweiler: I spent 382 hours learning Rust and all I got was this shiny monkey

Предыдущая статьяОт биологии к биоинформатике: практическое руководство для новичков
Следующая статьяКак создать анимацию мерцающего текста в Jetpack Compose