Перейти к содержимому

Упаковка данных

Мест в памяти мало, а флаг у юнита один. Несколько чисел приходится складывать в одно

сложноНужно знать: Число внутри, Битовые операции
тик 0
Установить0
=
Установить1
=
Операция2
=
Операция3
=
Операция4
=
Операция5
=
Стоп6
@counter0number
xnullnull
ynullnull
упакованоnullnull
обратноXnullnull
обратноYnullnull
op mul упаковано x 1000
op add упаковано упаковано y
op idiv обратноX упаковано 1000
op mod обратноY упаковано 1000

Координаты 37 и 12 превратились в одно число 37012 — и разобрались обратно. Это и есть упаковка: умножить старшее на разряд, прибавить младшее.

Действие Чем
упаковать op mul и op add
достать старшее op idiv — деление нацело
достать младшее op mod — остаток

Мест, куда можно положить число, в mlog мало:

  • флаг юнита — ровно одно число на юнита;
  • ячейка памяти — 64 места, блок памяти — 512;
  • переменная соседа, которую он читает по имени.

Когда нужно передать «юнит номер три везёт медь на склад у точки 37, 12», приходится складывать это в одно число. Обычно так и делают: младшие разряды — координата, старшие — задача.

Второй способ — битовые операции: сдвинуть влево, сложить, потом сдвинуть обратно и наложить маску.

op shl упаковано x 10
op or упаковано упаковано y
op shr обратноX упаковано 10
op and обратноY упаковано 1023

Это быстрее в понимании «сколько влезет»: десять бит — тысяча двадцать четыре значения, и границы точные. Зато число в переменных читается хуже: 37900 вместо понятного 37012.

  • пакуйте целые. Дробь в упаковке ломается: op idiv отбрасывает часть числа, и обратно она не вернётся;
  • следите за отрицательными. -5 в упаковке превратится в мусор: если знак нужен, прибавьте смещение (например, всегда +500) и вычтите его при распаковке;
  • не пакуйте то, что можно не паковать. В ячейке 64 места — обычно хватает, чтобы положить числа по отдельности и не мучиться.

Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.