Random Rust Dev
379 subscribers
80 photos
41 videos
1 file
30 links
Разработка на языке Rust.
Пишу простыни со своими мыслями о Rust и проектах на нем.
Download Telegram
Сейчас начнется новый стрим.
Разработка импортера для картинок.
Ссылка та же
👍3
https://www.twitch.tv/videos/2277544249
Ссылка на запись стрима.
Я немного покосячил с окнами, но в целом получилось не так плохо, как мне кажется.

Сделали импортер для картинок, сделали UI для импорта, увидели, что что-то заимпортилось и получило AssetID.
👍5
Как вы думаете, на сколько надо подготавливаться заранее к стриму?

Я не имею в виду звук и настройку окон и вот это, что непосредственно стрим составляет. Это конечно надо все подготовить 🍳

Я про сам код. Я пробовал кодить с наскоку 🏇
Сегодня вот только убедился что создание плагина работает. Из-за чего эдитор перестал запускаться, когда я плагин удалил 🤦‍♂️
Но совершенно не продумывал как я буду писать. Только что.

На другом конце спектра будет ненастоящее программирование, а переписывание того, что уже написал заранее.

Как по вашему мнению, где золотая середина?
🤔2👍1🔥1
На стриме я реализовывал импортер картинок в базовый RGB, что в общем-то сильно неоптимально.

Поэтому время пришло для того что бы жать картинки.

Как известно, GPU нативно поддерживают блочные сжатые форматы.
Реализовал сжатие в BC1.
Очень простое.

GUI что бы видеть результаты.
Слева картинка из файла, справа она же пожатая и разжатая обратно.
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Попробовал интегрировать texpresso.
Из минусов:
1. Какие-то белые пиксели.
2. Очень долго сжимает - на видео видно пролаг при нажатии на чекбокс.
💔2👍1
Продолжаю работать над сжатием картинок.
Прочитал два папируса сегодня: по кодам Хаффмана и работы Лемпеля и Зива.
Буду использовать сжатие без потерь, что бы пожать блоки, выданные блочными сжимателями.
При чем таким образом, что бы разжать можно было эффективно на gpu
🔥1
Реализовал компрессию блоков формата BC1 для экономии на IO.

BC1 size: 362952 - 354KiB
JKL size: 13151 - 12.8KiB

Если я нигде не накосячил, то очень даже неплохой такой результат.
👍5
Все же в сжимателе я напортачил.
И compression ratio оставляет желать лучшего на сложных картинках.

На простых, где много одного тона, там конечно да.
😢1
Заменил байт-ориентированный выход из кромпрессора на бит-ориентированный.

И сразу результат.

Пришлось попотеть чуть, за то теперь у меня есть std::io::{Read, Write} врапперы, чтоб писать и читать битики
🔥7
LZ78 -> LZW
873KiB -> 799KiB
👍1
Безумная идея.
Сделать маленькую нейронку, которая будет пытаться предсказать следующий пиксель и после каждого пикселя чуть-чуть обучаться.
Если предсказания будут точны, то разница с фактическим значением будет мала. А если почти все кодируемые значения малы, то и повторяемость последовательностей будет больше.

В файл веса класть не надо. При декодировании она точно так же должна обучаться
Я кстати понял, почему трава такая несжимаемая.
Она в жипеге весит столько же, сколько bc1, там энтропия чуть ли максимальная.
This media is not supported in your browser
VIEW IN TELEGRAM
Просили больше нейронок? Получайте!

На видео микронейронка учится предсказывать картинку по соседям.

Цвета всех блоков на 3й картинке предсказаны нейронкой на основе соседей слева и сверху.
А точнее на входе квадрат 4х4 без правого-нижнего, а на выходе собственно правый-нижний.
🔥4👍2
1. В процессе обучения.
2. И доучилась.

Слева-направо
Картинка в bc1
Предсказание первого цвета из каждого блока.
Абсолютная ошибка предсказания.
2
Пришлось пойти на крайние меры, что бы сжать эту траву.

Никакие предсказания не помогали с ней, хотя некоторые картинки и жались лучше.

Нет, мне пришлось, образно выражаясь, расщепить атом бит!
Абсолютно случайно опубликовал новый crate - "vtid", что значит Volatile Type ID.
"А что ж это за зверь такой?" - подумали вы, наверное.
А это очень простая и совершенно ненужная 99.9% программистам вещь - это расширенный TypeId, который точно-точно меняется, если крейт перекомпилировался.
Нужен он для горячих перезагрузок, а точнее для их ускорения.
Идея проста, если Vtid типа остался прежним, то и тип никак не мог поменяться, потому что тогда его крейт бы перекомпилировался и Vtid поменялся.
А раз тип не изменился, то можно взять да и переиспользовать его старые инстансы. В частности загруженные ассеты.

Конечно Vtid меняется все же чаще чем хотелось бы. Любое изменение в крейте меняет Vtid всех типов из него и зависимых крейтах, даже если меняется только код какой-нить функции.
Поэтому для уменьшения количества перезагружаемых ассетов я постараюсь типы с большими ассетами объявлять в отдельныйх крейтах-плагинах с минимумом плагинов-зависимостей.

Ссылка на сам крейт https://crates.io/crates/vtid
👍11
Посмотрел запись стрима, на котором человек взял egui-snarl и попробовал сделать на нем UI для логических цепей.
Очень интересно наблюдать, как человек без предварительной подготовки просто берет и пробует использовать API, который я придумал.
Для меня то он очевиден, а как для других людей… для меня это всегда было загадкой. Письменный фидбэк не дает полной картины. Что ж, завеса тайны слегка приоткрыта.

Ссылка на запись стрима
https://www.youtube.com/watch?v=zigPWkPm00U
🔥11