Архитектура ядра лаунчера: отказ от чистого Electron в пользу Rust FFI
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-зеркал (Москва, Петербург, Алматы).
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.