А мы тут, знаете, всё плюшками гифками балуемся
Продолжаю развлекаться с матрицей ламп, а тут Factorio недавно обновилась до версии 2.0 (В смысле полгода назад!?), которая принесла новые возможности как для расширения вашего завода, так и для ещё более хитроумных логических схем.
Разрабы принесли целых 3 невероятно крутых штуки.
1) Огромное обилие логических сигналов, начиная от кучи новых предметов и заканчивая внутриигровыми объектами. Так ещё это количество можно множить на 5 за счёт качества благодаря чему конечное число доступных сигналов становится более 2700! При старых около 200.
2) Разделённые зелёных и красный входы и множественные условия, которые по большей части утилитарны, но с ними можно делать некоторые съемы более компактными.
3) А главная вишенка на торте это новые способы управления цветом лампы. Через RGB компоненты и через RGB значение закодированное в один сигнал.
Все эти нововведения наконец-то позволяют сделать цветную матрицу с размером пикселя всего в одну клетку вместо 2 на 2 в старой версии.
Что да как
Каждая лампа настроена читать в "Packed RGB" один из сигналов и все лампы объединены в одну логическую сеть. Если подать в эту сеть соответствующие сигналы с нужными значениями, то уже можно показывать небольшие изображения. Такую объединённую группу ламп я буду называть тайлом, а массив сигналов с данными - пакетом. С имеющимися сигналами можно сделать матрицу 50 на 50.
Если же хотим увеличить размер матрицы более суммарных 2700 пикселей, то тут уже придётся составлять несколько тайлов вместе. Эта матрица размера 170 на 160 содержит 10 тайлов размером 17 на 160.
На ней мы можем показывать уже что-то по больше.
Большая матрица, конечно, хорошо, но теперь нам нужно целых 27200 сигналов для хранения изображения. Сейчас каждый пиксель использует 24 битный цвет и занимает весть 32 битный сигнал. Помимо того что мы уменьшаем геометрический размер оригинального изображения, почему бы нам не уменьшить и количество занимаемых цветом бит.
Вспоминаем что мы тут гифками балуемся, а они для уменьшения занимаемой памяти используют цветовую палитру. Например, если для приемлемого качества
нам достаточно 64 цвета, то каждый пиксель можно будет кодировать всего 6 битами, вместо 24. И таким образом в один сигнал умещается уже целых 5 пикселей 5 * 6 = 30. Значит в один пакет мы можем закодировать пикселей на 5 тайлов. Палитру мы делаем для каждого изображения/анимации свою для лучшего качества. Некую связанную между собой группу тайлов я буду называть кластером. Таким образом один пакет содержит в себе данные для одного кластера из 5 тайлов.
Так как сигналы сейчас несут информацию для нескольких тайлов и лишь номера цветов, то нам нужно декодировать их используя палитру. По 5 разным маскам из сигналов вычленяются номера цветов соответствующие разным тайлам, затем эти данные передаются на 5 декодеров палитры, преобразующих номера цветов в их RGB коды и по 5 линиям всё идёт на тайлы.
Чтобы отобразить полное изображение нам нужно более одного пакета данных. Конечно можно сделать 2 параллельные схемы с отдельной постоянной памятью и декодерами палитры, но это слишком глупо. Мы сделаем единую память и один декодер и будем отправлять пакеты друг за другом.
Для этого каждый тайл матрицы имеет 2 буферные ячейки памяти. Пока первая ячейка отображает своё содержимое на тайле, вторая доступна для записи. После того как все данные записаны, буферы переключаются и уже в первый мы пишем, а второй отображает картинку на экране. Это в купе с адресацией кластеров позволяет сначала записать все данные в буферы и только потом отобразить всё целиком. Такой своего рода VSync.
Для лучшего качества использовались моды:
- Hidden Thicker Circuit Wires - Скрывает провода, так как они сильно зеленят/краснят матрицу.
- Schall Lamp Contrast - Делает лампы более контрастными чтобы на них было хоть что-то видно.
А теперь немного порно гифок
Гифка с Хорни была второй на которой всё тестировалось, а первая будет в отдельном NSFW посте ;)