SYSTEM ARCHITECTURE & NATIVE PERFORMANCE

Архитектура ядра лаунчера: отказ от чистого Electron в пользу Rust FFI

TL;DR: Переход на нативное Rust-ядро позволил сократить потребление оперативной памяти лаунчером во время простоя с 420 МБ до 28 МБ, ускорить холодный запуск до 0.4 секунды и обеспечить параллельную валидацию 3 500 игровых файлов за 1.2 секунды на AVX2 инструкциях.

1. Проблема классических лаунчеров на Electron

Большинство популярных Minecraft-лаунчеров последних лет построены вокруг связки Electron и Node.js. Это решение обеспечивает быстрый прототип интерфейса на веб-технологиях, однако имеет колоссальные архитектурные издержки: каждый процесс Chromium потребляет 300–500 МБ памяти, а асинхронный I/O в однопоточном цикле Node.js становится узким местом при распаковке сотен тысяч текстур и проверки хэшей.

Для соревновательного киберспортивного клиента Minecrafter-X такая избыточность недопустима: ресурсы компьютера должны быть максимально высвобождены для Minecraft и сборщика мусора Java, а не расходоваться на фоновое окно лаунчера.

2. Гибридная архитектура на Rust и Tokio

В версии MCX 4.0 мы полностью переписали сетевой и файловый подсистемный слой на Rust. Веб-интерфейс теперь визуализируется легковесным системным Webview (WebKitGTK в Linux, WebView2 в Windows, WebKit в macOS), а вся бизнес-логика выполняется в нативном бинарном потоке.

Для загрузки библиотек и ассетов Fabric 1.21.4 используется асинхронный рантайм tokio и HTTP-клиент reqwest с поддержкой соединений по HTTP/2 и HTTP/3. Загрузка происходит параллельно в 32 воркера с динамическим балансировщиком CDN-зеркал (Москва, Петербург, Алматы).

src/engine/asset_verifier.rs — SIMD-валидация файлов
use sha2::{Digest, Sha256};
use rayon::prelude::*;
use std::fs::File;
use std::io::{BufReader, Read};

pub fn verify_installed_assets_simd(manifest: &Vec<AssetManifestEntry>) -> Vec<FailedHashReport> {
    // Параллельная проверка хэшей по всем ядрам CPU через Rayon
    manifest.par_iter().filter_map(|entry| {
        let path = std::path::Path::new(&entry.local_path);
        if !path.exists() {
            return Some(FailedHashReport::Missing(entry.asset_id.clone()));
        }
        
        let mut hasher = Sha256::new();
        let file = match File::open(path) {
            Ok(f) => f,
            Err(_) => return Some(FailedHashReport::IoError(entry.asset_id.clone())),
        };
        
        let mut reader = BufReader::with_capacity(128 * 1024, file);
        let mut buffer = [0u8; 16384];
        
        while let Ok(n) = reader.read(&mut buffer) {
            if n == 0 { break; }
            hasher.update(&buffer[..n]);
        }
        
        let computed = format!("{:x}", hasher.finalize());
        if computed != entry.expected_sha256 {
            Some(FailedHashReport::ChecksumMismatch {
                id: entry.asset_id.clone(),
                expected: entry.expected_sha256.clone(),
                actual: computed,
            })
        } else {
            None
        }
    }).collect()
}

3. Безопасный бутстрап процесса JVM

Запуск игрового процесса Minecraft в Minecrafter-X контролируется изолированным процессом-супервайзером. Rust передает проверенный набор аргументов для Eclipse Temurin 21, исключая инъекцию вредоносных системных переменных (CVE-подобных манипуляций _JAVA_OPTIONS или JAVA_TOOL_OPTIONS).

Каждый запуск формирует одноразовый токен сессии IPC, через который клиент обменивается с лаунчером данными телеметрии фреймтайма и статусными сообщениями Sentinel Integrity.

4. Результаты сравнительных бенчмарков

Тестирование на типовой конфигурации (Intel Core i5-12400F, 16 ГБ DDR4, Windows 11) показало следующие преимущества новой архитектуры:

  • Холодный запуск лаунчера: сократился с 3.8 с (Electron) до 0.38 с (Rust).
  • Потребление RAM в трее: снизилось с 420 МБ до рекордных 28.4 МБ.
  • Верификация 3 500 файлов сборки: 1.18 с против 14.6 с у старого скрипта.
  • Скорость установки чистого клиента: 18 секунд на гигабитном канале благодаря 32-поточному пулу Tokio.
Все статьи блога