Random Rust Dev
365 subscribers
77 photos
41 videos
1 file
28 links
Разработка на языке Rust.
Пишу простыни со своими мыслями о Rust и проектах на нем.
Download Telegram
Пятнично.
Я заметил, что у меня есть почти все ачивки в ER.
И не хватало только пары легендарок и 2х концовок.
И у меня был перс, прошедший базу в Jorney 2, кроме ластов.

Что, ж. Собрал леги (пришлось пройти весь квест Ранни, но на это ушел всего час), завалил ластов.
Бегом в Jorney 3. Взял 2 великие руны (Годрик и Райкард), проскочил Линдел, Напрямик к Огненному Гиганту, заваливая только боссов, что встречались по дороге.
Фарум Азула как нож сквозь масло (Jorney 3 кажется проще чем Jorney 2).
Маликет взят с первого пула, несмотря на небольшой факап с бафанием.
На Всезнайке попотел.
Годфри дал жару еще хлеще, оставил его на утро. Утром с первого пула.
Радагон и Зверь с нескольких пулов.

Я точно мучался на Jorney 2 намного больше.
А ведь за весь Jorney 3 я вкачал че-то типа 240-245. Потому что руны с нескольких боссов профукал на вайпах на следующих.

В целом что хочу сказать.
Elden Ring это одна из лучших игр, в какие я играл. Максимально советую всем любителям помахать мечем.
И не бойтесь сложности, она проще чем Dark Souls.
👍5👎4🤷‍♂2
Rust Tip по оптимизации дебажного билда.

В Cargo.toml можно указать, что в dev профиле нужно оптимизировать определенные зависимости.

Такая запись заставит сборщик оптимизировать зависимость foo.

[profile.dev.package.foo]
opt-level = 3


А вот так можно оптимизировать все зависимости разом.

[profile.dev.package."*"]
opt-level = 2


А так будут оптимизировать билдскрипты и процедурные макросы.

[profile.dev.build-override]
opt-level = 3


Оптимизируя зависимости вы ускорите процесс дебега, если только вам не надо заходить внутрь функций зависимости. При необходимости уберите оптимизацию для нее.

Приятного вам дебага.
7👍2💯2
Занимался сегодня рефакторингом небольшого крейта gametime.
Сделал чистку всех предупреждений с clippy::pedantic и задокументировал всё, хоть и минимально.

В крейте функционал для работы со временем в играх.
И минимум сложностей.

Во первых TimeStamp - точка во времени с наносекундной точностью. Относительно чего-то. Обычно относительно того, откуда они берутся.

TimeSpan - промежуток между меньшим и большим TimeStampами. Почти как Duration, но лишь u64 наносекунд.

Clock - часы. Связывают монотонный таймер core::time::Instant и TimeStampы. Генерирует ClockStep, на каждый вызов Clock::step, где есть текущий TimeStamp и TimeSpan между текущим и предыдущим.
Предполагается использовать Clock в главном цикле, делать Clock::step в начале каждой итерации и раздавать ClockStep везде, где нужно знать время.

GlobalClock - как Clock, но используют единую для процесса точку отсчета. Требуется std и global_reference фича

ClockRate - часы со скоростью. Использует внешний источник TimeSpan, генерирует ClockStep с указанной относительной скоростью. Без накапливаемой потери точности.
Удобно для контроля времени в симуляции. Паузы, буллет таймы, перемотки. Просто вся симуляция должна использовать ClockStep из ClockRate, а не общего Clock.

FrequencyTicker - генератор тиков с заданной частотой. Использует внешний TimeSpan и возвращает итератор по ClockStep тиков, произошедших в течение этого времени. Без накапливаемой потери точности.

Ознакомиться с кодом можно здесь.
https://github.com/zakarumych/gametime
🔥9
3😁2💯1
Как объяснить картинкогенератору, что во время прямого удара ногой в живот подошву не видно?

Я сколько не уговаривал, все равно разворачивает ногу подошвой к зрителю.
😁7
😁2😐2
🔥16🫡31👏1
Для тех кто рос в 90е
🔥14😁7
Теперь можно на целый день убежать от семьи в свой "офис" :)
😁62
Класть разные замыкания во враппер без аллокаций это конечно круто.

Но еще круче, когда в сигнатурах могут быть лайфтаймы и и высокоранковые лайфтаймы.
🤯13👍4😱1
Кстати говоря,
бесцветные зеленые идеи спят яростно.

А я тем временем пробую chumsky для написания парсера моего игрушечного языка.
👍4
Попробовал Codex от OpenAI.

Плюсы:
Он нашел в одном месте баг, где я вместо min написал max. И добавил юнит тест на этот код.

Минусы:
Попросил его написать за меня парсер.
Он написал игрушечный нерабочий парсер, где Expr это просто SmolStr, а Operators ограничивается вариантом Add, и вообще все не то, как я описал синтаксис.
Попросил переделать - ответил, что ему слишком сложно.

Вывод:
Можно время от времени просить найти баги в репе. Найдет - хорошо. Не найдет - ну и ладно.
В обучающем датасете слишком много кода из туториалов.
👍6💯1
Как почувствовать себя хакером. Пошаговая инструкция:

1. Зайдите в кафе или заправку, где посетитель сам использует кофе-машину.

2. Получите сообщение об ошибке.

3. Нажмите на незаметную кнопочку на сенсорном экране, что бы открыть админское меню.

4. Угадайте пин с первого раза. Например 1111.

5. Перезагрузите кофе-машину.

6. Сделайте себе кофе.

7. Наслаждайся своим кофе, хакерман. (Или хакервуман. Но есть ли такие у меня в подписчиках, даже не знаю.)
7🔥2👨‍💻1😎1
Не могу понять прикола.

Работаю потихоньку над арканой, но как только надо делать импорт ассетов начинаю забивать.

Потом снова берусь делать что-то другое. И опять, сел делать ассеты, потупил 10 минут и переключился на поиграть.
9
Статическая типизация?
Динамическая типизация?
Галюцинатическая типизация!
😁182👍2🙈2🔥1🦄1
Немного юморов в... пустоту
3👍1
Немного ужасов С++ в ленту.

В std есть шаблон std::common_type<T...>, в который можно передать список типов, и в ассоциированном типе type взять общий из них.

Разумно предположить, что если в списке типов только 1 тип, то он и будет в type,
т.е. std::common_type<T>::type == T.
При условии, что нет перегрузки для списка из одного T.
😱3😭1
Мысли вслух:

Кощей не бессмертный, он просто глюканул и его хитбокс прилепился к игле, вместо его тела.
11😁1