Корзинка
Количество просмотров: 280

Лаунчер для кастомного мода Arma 3

И так.. на прошлой неделе у меня была задача написать лаунчер и апдейтер в одном лице для мода к Арме 3, как говориться, флаг мне в руки. В итоге, програмка скачивает файл для апдейта (перечень файлов в моде), с рассчитанными на сервере хешами (sha1) и указанными размерами, затем ищет файлы в папке с армой, затем если файл найден, то с него берется хеш, если же файл не найден или хеши отличаются, он добавляется в очередь загрузки. В процессе работы программы юзер видит что происходит (какой хешь считается, что отсустсвует/присуствует и т.д.) .

ega3l_01

Технически — ничего сложного нету. Главное это следить, что основная программа работает, и, если юзер ее таки закрывает, то сказать об этом потокам. Так как программа из «двух трех кнопок», то ничего монструозного или грандиозного там нету. Зато там есть рекурсия:)

Рекурсия или «сам себе дедушка».

В начале была пустота, потом набор boolean’ов и радостная работа. Затем, когда один и тот же поток должен был отработать 30 раз возник хаос. Побороть хаос получилось при помощи небольшого планировщика и пары boolean’ов. «Планировщик» работал отдельным потоком с своим sleep и координировал работу программы. Но, так как програмка небольшая, и планировщик так по сути не въелся, а логика работы из разряда «сходить за хлебом и купить молока», то функционал на запуск подпотоков был отдан.. самим потокам.

Например, надо расчитать хеш для 30+ файлов. Программа запускает один экземпляр

new Thread(new EGA3Sha1()).start();

Который в процессе вычисления хеша (каждые 8Мб) проверяет, активна ли программа (через пару boolean’ов), затем, если все ок, выполняет

new Thread(new EGA3Sha1()).start();

В итоге расчет хешей файлов идет в фоне последовательно, что не может не радовать. А пользователь видит с каким файлом в данный момент работает программа.

Аналогично и сделана загрузка файлов, там есть основной класс, который качает, есть класс, которые проверяет сколько скачано и есть класс, который отвечает на GUI, а именно выводит пользователю информацию.

ega3l_02

Как видно на картинке, качается файл, скачано 2 Мб из 5, а именно 56%. Чтобы увидеть абсолютные значения в байтах, достаточно навести мышки на прогресбар. Максимальная величина прогресс бара, забитая в программе равна 100 и, как это не странно, 100 = 100%, так что % вычисляется как раз в том потоке, который отвечает за GUI в процессе загрузки, а не считается тупым способом присвоения скачанных байт..

После того, как все скачано запускается проверка, которая активирует кнопку «Играть!», которая уже запускает клиент arma3.exe с нужным нам модом!

Баннер тянется с сервера, как и ссылка, на которую он ведет. Файлы мода и ресурсы лаунчера администраторы загружают на сервер, где они обрабатываются. Вычисляется sha1 вместо md5 потому, что 40 против 32 и потому, что sha1 вычисляется на больших файлах быстрее или, как минимум, равноценно, чем md5. Мод размером 1.5Гб хешируется за 3-4 секунды на (сервере). У пользователя — в зависимости от мощности процессора.

Вот собственно и все! Ясное дело, исходники приводить не вижу смысла по двум причинам: мне укажут на использование экзекутора, который мне нахрен не нужен в таких масштабах, пожурят за стиль кодинга. Но, вашу-то мать, это ж не корпоратив! 🙂

Facebooktwittergoogle_plusredditpinterestlinkedintumblrFacebooktwittergoogle_plusredditpinterestlinkedintumblr

Comments are closed.