Упаковка данных
Мест в памяти мало, а флаг у юнита один. Несколько чисел приходится складывать в одно
op mul упаковано x 1000op add упаковано упаковано yop idiv обратноX упаковано 1000op mod обратноY упаковано 1000Координаты 37 и 12 превратились в одно число 37012 — и разобрались обратно. Это
и есть упаковка: умножить старшее на разряд, прибавить младшее.
| Действие | Чем |
|---|---|
| упаковать | op mul и op add |
| достать старшее | op idiv — деление нацело |
| достать младшее | op mod — остаток |
Зачем это
Заголовок раздела «Зачем это»Мест, куда можно положить число, в mlog мало:
- флаг юнита — ровно одно число на юнита;
- ячейка памяти — 64 места, блок памяти — 512;
- переменная соседа, которую он читает по имени.
Когда нужно передать «юнит номер три везёт медь на склад у точки 37, 12», приходится складывать это в одно число. Обычно так и делают: младшие разряды — координата, старшие — задача.
Биты вместо разрядов
Заголовок раздела «Биты вместо разрядов»Второй способ — битовые операции: сдвинуть влево, сложить, потом сдвинуть обратно и наложить маску.
op shl упаковано x 10op or упаковано упаковано yop shr обратноX упаковано 10op and обратноY упаковано 1023Это быстрее в понимании «сколько влезет»: десять бит — тысяча двадцать четыре значения,
и границы точные. Зато число в переменных читается хуже: 37900 вместо понятного 37012.
Правила, которые стоит держать
Заголовок раздела «Правила, которые стоит держать»- пакуйте целые. Дробь в упаковке ломается:
op idivотбрасывает часть числа, и обратно она не вернётся; - следите за отрицательными.
-5в упаковке превратится в мусор: если знак нужен, прибавьте смещение (например, всегда +500) и вычтите его при распаковке; - не пакуйте то, что можно не паковать. В ячейке 64 места — обычно хватает, чтобы положить числа по отдельности и не мучиться.
Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.