ASCII-Nova 🇺🇦
91 subscribers
1K photos
42 videos
9 files
440 links
предложка: @ascii_nova_suggest_bot

Гиковство && занудство, инди-музыка, геймдев и непрошенные советы

Чат, где мы обсуждаем код и всё около него: @ascii_nova_chat
Download Telegram
### Небольшая история про Rust-каналы и асинхронные функции

Предыстория: когда-то обсуждая* горутины из Golang с позиции их взаимодействия с друг другом, мне показалось неудобным, что всё взаимодействие идёт исключительно** через каналы. Видимо, я тогда был разбалован долгой работой на Nodejs и в целом JS Promise'ами, которые позволяли просто возвращать результат.

В чём проблема передавать канал как аргумент? Конечно ни в чём на самом деле, но хотелось бы иметь возможность получать результат как через обычную функцию, через возврат. Иными словами, вопрос эстетики/эргономики + небольшого снобизма.

Почему я вспомнил эту историю?

Мне, уже на Rust, потребовалось запускать отдельные OS-потоки*** в detached (отвязанном) для каждого отдельного JS runtime. Т.к. я не могу дожидаться завершения потоков (они работают, пока их не попросят остановиться), то чтобы получить результат мне приходится использовать каналы (прямо как в Golang).

Но чем хорош Rust, при желании могу сделать функцию — см. скиншот. И как пользователь этой функции буду использовать просто результат, не думая как он вообще получается — из канала, из другого потока, из другого асинхр... в общем, не думая как этот black box работает.

В общем удобно и мой внутренний задротский педант рад :)

Расскажите в комментариях, как радовали недавно своего внутреннего кодового педанта :)



* Разговор был давно, могу что-то упускать, т.к. Golang я только читаю, но не пишу
** Если нет, расскажите в комментариях
*** К сожалению, специфика работы Rust-обвязки вокруг JS-движка.

С одной стороны очень расточительно иметь целый поток, с другой стороны, они стартуют только в самом начале.
К тому же, планировщик Linux супер-круто раскидывает работу по ним (потокам процесса).

Или Linux стал лучше, или у меня железо мощнее стало, или всё вместе — что в итоге не создаёт проблемы.

Раньше, когда я был С++-бекендером, меня таким можно было пугать как скримером :)
🔥4👍1
Или пора заканчивать на сегодня кодить, или это и правда имеет смысл

Залип на пару минут на выборе между импортами :)

Есть необходимость, для простоты, сделать импорт A, B, C, D, которые лежат на разной глубине одного модуля

1) Импортировать с каждого подвложенного модуля на отдельной строке
2) Импортировать с одного модуля всё сразу



У каждого варианта, есть свои преимущества, 1) даёт более красивый git diff, 2) более компактные импорты

Вопрос чисто в духе табы или пробелы, но всё же :)

Ниже будет опрос) Помогите мне выбрать)
😁1🤔1
### Параллельный запуск JS кода и кустарные бенчмарки

Было очень интересно, сколько же времени займут параллельные запуски JS отдельных окружений в среде с ограниченными ресурсами (моём ноуте).

После полировки кода и выбора подхода с потоками (см. предыдущий пост). В качестве тестового стенда симулируем 4000 игроков, код каждого выполняется 100мс

Получились следующие результаты:
- Ожидаемо создание и подготовка* потоков заняла много времени: ~40 секунд
- Долговато, но для разовой акции терпимо
- Общий тик игрового сервера занял ~930-1000 миллисекунд
- Что в общем-то отличный результат! Честно говоря, рассчитывал на худшие результаты

Но стоит отметить, что для симуляции долго работающего кода использовалась наивная синхронная реализация функции sleep() (см 2ой скрин ниже). Ради интереса посмотрел, сколько раз она успевает вызваться для каждого потока.

Результаты для 4000 "игроков" следующие: от 8_000 до 12_000. Для 10 "игроков" от 200_000 до 400_000. Пока что рабочая гипотеза, что V8 движок начинает тротлить вызовы к API времени, чтобы снять нагрузку.

Хоть и разница существенная, но это не должно стать проблемой для реальных игроков в теории. Поэтому очень даже доволен промежуточным результатом :)



* Создание асинхронного runtime, и прочий bootstrap код
👏3
Вау, Adobe очень крутые
Forwarded from ExposedCat's blog (Artem)
This media is not supported in your browser
VIEW IN TELEGRAM
Next one: Adobe Illustrator got beta Generative Recolor AI, allowing to change image colors via text prompt. You are not restricted to palette requests — it understands colors of time seasons, known styles, etc.

After these words, real horror began in the design freelancers' train.

Source
🔥2👍1🤯1
В тот момент, пока в движке параллельного выполнения JS кода пытаюсь внедрить ограничения по ОЗУ на каждое выполнение (условно, игрок не может потратить больше 512 кб), хочу поделиться музыкальной (и не только) находкой:

Альбом Citizen Sleeper (по одноимённой игре) от Amos Roddy. Потрясающий космический эмбиент, включающих в себя великолепные бит-партии и удивительно разные настроения, при этом сохраняя одну тематику весь альбом. Проваливаюсь в этой звук, словно лечу вниз после прыжка на бездонном батуте.

Ух, однозначно одна из находок года, учитывая количество переслушиваний всего альбома :)

Сама игра выглядит максимально стильной, а учитывая мою вновь возросшую тягу к космосу после прочтения Соляриса, обязательно положена в беклог. Хвалят за прописаность и эстетику.

Ниже несколько треков с альбома, но рекомендую слушать целиком по порядку
😍3