Кот и код – Telegram
Кот и код
567 subscribers
157 photos
21 videos
1 file
81 links
Про разработку на Unity и .Net, радость и боль программирования.
Автор: @KotikovD

Про искусство и игрострой:
@svolochandborshch
Download Telegram
Финальный пост про хакатон хочу сделать красивым, поэтому он позже, а пока давайте на технические темы.

Попался пост от умного чела, который точно знает, что делает с приемом хранения двух переменных, например переменных типа int в типе long. Вот пример метода извлечения из его поста:

void ToInts(long a, out int a1, out int a2)
{
a1 = (int)(a & uint.MaxValue);
a2 = (int)(a >> 32);
}

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

Наглядным это не назвать, 2 подписанных поля типа int в структуре — это удобно читать глазами, а парсить long глазами — нет.

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

struct Test
{
int a;
int b;
}

Потому, что каждый процессор производит выравнивание по адресным границам, до значений, с которыми именно он лучше работает. Тот случай, когда «на моей машине» может работать по-другому, проц может сделать выравнивание, например, до 12 или 16 байт. Итого размер может плясать. Но если мы работаем на таком низком уровне оптимизации, то надо следить за всей картиной кода. Одно неосторожное движение где-то в стеке вызов и эта оптимизация станет ничтожна. И конечно, вопрос к объёму данных на которых это станет «интересно».

Остаётся поинт про быстрее работает, но снова скорее всего, эффект будет заметен только на больших объемах данных.

Если фантазировать, то пожалуй, подобную штуку в купе с другими приемами оптимизации можно вкручивать в фичи, где есть тоны данных, например, какое-то гигантское игровое поле с клетками, где нужно хранить данные для каждой клетки.
#техничка
👍4🤯2🌚21
Еще немного про джемы. Зачем вообще участвовать в конкурсах? Один мой коллега, который часто участвует в подобного рода событиях, недавно поделился своим мнением. Хочу пересказать некоторые его поинты и дополнить своими:

1. На джеме сталкиваешься с задачами уровня приложения - жизненный цикл, загрузка статических данных, менеджмент окон итд. Тот самый “скелет”, который уже решён на рабочем проекте и очень редко можно столкнуться с задачами такого уровня.
2. Джем хорошо показывает код, который невозможно настроить. Позволяет на короткой дистанции сделать выводы, что не так. Подсвечивает разницу между фичей и игрой. Становятся понятны требования к инструментам, которые важны на следующих этапах разработки - сетап и тесты.
3. Ограничение по времени учит "срезать углы". Есть идея, на работе ее оценил бы в 5 дней. Но как сделать тоже самое за 5 часов? Оказывается это возможно. Чтобы понимать масштаб проблемы, можно посмотреть на победителей прошлого джема - часто, это делают любители за короткий срок. А ты, профессионал, способен повторить такое? Без лукавства "мне надо х10 времени, потому что оно будет по SOLID, расширяемо и там архитектура".
4. В ваш проект поиграют и дадут фидбек. Похвалят и укажут проблемы. Это позволит оценить верность принятых вами решений.
5. Делая фичи на работе, можно забыть как делать игру. Класть кирпичики друг на друга - это не тоже самое, что строить дом.
6. Нетворкинг. Я участвовал всего несколько раз в джемах и каждый раз это выливалась в массу знакомств, новых контактов, проектов, историй.
7. Если вы джун без опыта или в поиске работы, то такие события создают вам проекты в портфолио, строчки в резюме и возможность попасть на собес через новые знакомства.
8. Ещё один обширный поинт я хочу подробнее раскрыть в отдельном посте и закрыть тему с джемами на время.
#события
👍53🐳1
Марево. Так называется наша игра-финалист с конкурса “Лидеры цифровой трансформаций 2023”. Теперь я готов сказать пару слов о смысле участия в конкурсе и выложить ссылку для желающих поиграть.

В продолжение предыдущего поста про дежмы, я говорил о практической пользе, но психологический для программиста это обычные серые будни - развиваться, разбираться, искать лучшее решение, делать новое итд. Все мы ещё люди и поэтому на одних “нужных\полезных\правильных” вещах далеко не уедешь. Ещё нужна энергия и способность сохранять простой интерес к профессии годами. Поэтому пара философских мыслей в дополнение к ответу на вопрос. Здесь уже конкретно по нашему опыту на ЛЦТ 2023.

Мы вписались в конкурс под закрытие заявок и времени было мало. Проект наш заведомо небольшой и технический не сложный. Но у нас была цель - довести идею до ума и сдать его вовремя. Мы справились и потом неожиданно для себя попали в финал. Далее началось наше приключение, нас пригласили в Москву в инновационный кластер МГУ, там нас ждали новые испытания, дедлайны, лидеры отрасли, команды, лекции, выставки, диджеи, робо-собака и много другое. А также то, что мы сами себе организовали, когда преодолели все дедлайны - прогулка по летней Москве по локациям нашей игры всей командой и с винишком. Затем в финале мы вместе со всеми трепещали в ожидании результатов, чтобы узнать, что мы заняли 9ое место… и получили ещё шквал эмоций.

Я это все рассказываю, чтобы проиллюстрировать суть, к которой подвёл. Именно так создаются эмоции, дружба, совместные моменты, общие истории и именно так заряжается батарейка на новые свершения.

Мы с самого начала не рассчитывали на денежные призы или первые места из-за миниатюрности и “странности” своего проекта, но получили гораздо больше, чем рассчитывали изначально. Поэтому в шапке этого поста не трейлер игры.

Скачать проект можно по ссылке: https://rayonist.itch.io/marevo

А во втором нашем канале более высоковибрационное описание проекта

@cat_and_code
#события #девлог
🔥74
Люблю встречать что-то эдакое в коде, обычно не свойственное для С#. Указатели как раз такой зверь, который встречается не часто. Их применение на мой взгляд не оправдано, потому что можно обойтись без них. Что характерно для их использования? Они работают в блоках unsafe кода. Это такие участки кода, где среда CLR не может отследить использование памяти и собрать мусор. Эта задача ложится на программиста. Потенциально опасное место для утечек и ошибок, особенно когда код пишется руками разных программистов.

Что можно сделать с помощью указателей? Например, грубо выражаясь, можно заставить value-объект вести себя как ссылочный.

int* pointer;
int anyValue = 100;
point = &pointer; // теперь указатель pointer ссылается на ту же область памяти, где записано значение anyValue
anyValue += 100;
Debug.Log($”{*pointer}”); // 200
*pointer = 500;
Debug.Log($”{anyValue}”); // 500

Ещё с помощью указателей можно получить адрес памяти, куда ссылается указатель, но это очень специфично. И конечно можно ссылать один указатель на другой, но здесь я ещё больше радуюсь данной возможности, но совсем не могу придумать применение в нашей сфере.

На самом деле мы работаем с указателями в шарпах чаще всего другими способами:
- Когда создаём объект через операцию new, которая возвращает указатель на объект после выделения памяти и вызова всех конструкторов
- Когда используем оператор as, среда проверяет совместимость типов и возвращает либо указатель, либо null. Warrior unit = wizard as Warrior;
- Когда пишем ключевое слово this мы обращаемся к указателю
- При упаковке значимых типов, они записываются в кучу и получают свою ссылку, то есть указатель
- При передачи параметров в методы мы можем использовать ключевые слова ref и out для значимых типов, где компилятор будет генерировать метаданные, описывающие параметр как передаваемый по ссылке
- Когда назначаем делегат - фактический назначаем указатель на функцию.
- Ну про ссылочные типы и говорить нечего…

Если у вас есть примеры из практики, где вы используете указатели в unsafe коде - поделитесь, интересно.
#техничка
🐳4👍2
У меня есть подборка мемов про разработку, но они лежат где попало и поэтому неудобно искать нужный к ситуации, хочется простой систематизации. Во-вторых прекрасным хочется делиться, а как мне кажется, здесь у нас вполне себе небольшое общество ценителей айтишных шутеек. И наконец, их наличие не испортит никакие другие посты и темы. Поэтому буду теперь иногда вкидывать с тегом для поиска.

Если у вас есть пара любимых мемов - киньте в коменты.
👍2
Какую мысль можно вынести из скандала с Unity? На данный момент они начирикали в Твиттере X, что извиняются, но не понятно за что. Толи за весь сыр-бор, толи за то, что не смогли нормально "продать" свою новую систему сборов и вернутся к нам, когда подготовят презентацию получше.

При этом сейчас разные слухи ходят о будущем Unity, в том числе, что его готовят к сливу. Но предлагаю абстрагироваться от подробностей и просто принять факт, что если будет какой-то негативный сценарий (не важно какой конкретно) и движок начнёт накрываться медным тазом, что это значит для нас?

Тогда технология будет терять свою популярность, и это напрямую отразится на количестве вакансий для Unity Developers. Не в один день, потому что старые-большие проекты будут поддерживаться, но новых будет все меньше.

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

Как действовать в таких условиях? Можно отнестись к этому, как к толчку, который мы давно ждали. Кому-то его не хватало, чтобы начать изучать Unreal и C++, Godot, серверный стек или что-то ещё. Не потому что корабль тонет и сейчас надо паниковать, а потому, что всегда стоит держать в голове, что рынок может поменяться, и нужно иметь план Б. Сейчас просто яркое напоминание об этом.

Какие-то технологии уходят, и на их место приходят новые. Можно вспомнить взлёт и падение популярности Xamarin. А также знания разных инструментов помогают подбирать эти инструменты под задачи, а не делать все одним и тем же молотком. Такие перемены всегда некомфортны, но для нас, как для специалистов, это возможность для развития.
#новость
6🫡5
На этом канале обсуждаем техническую сторону разработки игр, говорим про особенности Unity и C#, общаемся на профессиональные темы программистов и про геймдев в целом.

@KotikovD — автор канала, программист

А Горюшко вслед собакою… - наша игра в Steam, атмосферное и эмоциональное приключение о юной почтальонке

Основные теги:
#девлог@cat_and_code - про разные проекты, которыми занимаюсь
#техничка@cat_and_code - про программирование, код и Unity
#мем@cat_and_code - развивающаяся коллекция IT-мемов на разные ситуации
#игры@cat_and_code - мои небольшие обзоры про специфические игры в которые играю
#события@cat_and_code - про митапы, лекции и хакатоны

Буст канала:
https://news.1rj.ru/str/boost/cat_and_code
Я чаще всего играю, сидя на диване, а не за столом. Меня особенно расстраивает, когда игры не имеют поддержки геймпада. И поэтому в нашей собственной игре (GVS) не может быть такого недочёта. Наконец-то дошла очередь, и я переделал "старую" систему ввода Unity на "новую", и теперь мы можем позволить себе настраивать управление как захочется. Так что в релизе оно точно будет.

А также я добавил настройку для подстройки дрифта стиков, потому что второе, что меня расстраивает, если в игре все-таки есть поддержка геймпада — это отсутствие такой настройки.
#девлог
3🔥3
Мало кто знает, что изначально я хотел вести не канал в Telegram, а сделать подкаст для программистов. Говорить об индустрии и наших технических темах в аудио формате через стриминговые сервисы.

Очень долго я планировал темы, форматы повествования, изучал аудиотехнику и даже записался и прошёл курс актёров озвучки, чтобы хоть как-то разобраться, как нормально работать с голосом, микрофоном и звуком. И я был очень далёк от этого. Стоит ли говорить, что каждый шаг, который я делал в направлении этой цели, оказывался гораздо сложнее, чем мои изначальные предположения? Возможно, об этом расскажу отдельно, а сейчас лучше к сути.

Итак, спустя примерно год подготовительной работы я придумал и настроил флоу, с которым моя задумка получает попытку на жизнь.

Завтра утром будет первый выпуск подкаста. 🔠🔠🅰️

Пока что в пилотном варианте, в виде аудиофайла прямо здесь на канале. Первый выпуск будет о истории геймдева, второй выйдет через 2 недели и будет техническим.
#подкаст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3👏2🤯2
Audio
Студия Nival
Выпуск про легендарную студию, зародившуюся в далёкие 90ые. Поговорим про их путь, проекты и выдающихся выходцев, которые во многом помогли сформировать геймдев в России.

Ссылки выпуска:
Аллоды: Печать тайны
Сайт Нивала

Автор: @cat_and_code
#подкаст 1
🔥82
Спасибо за ваши реакции под первым выпуском подкаста. Проголосуйте, пожалуйста, в опросе. Все вместе посмотрим на сколько в целом зашёл формат. И если у вас есть комментарии, пожелания, фидбек - напишите в комментариях. Так вы можете повлиять на будущие выпуски.
Давайте поиграем в ответы на вопросы с собесов. Пишите свой ответ в комментариях.

Почему в профайлере памяти может быть такая картинка?
😁3🐳21
ComponentLurker

Классный инструмент для поиска по скрипту. Можно найти все префабы в проекте, где накинут выбранный скрипт. Дополнительно можно указать условие и найти префбы, где выбранное поле в скрипте имеет определённое значение. Например найти все префабы где ничего не прокинуто в интересующее поле.

https://github.com/vksokolov/ComponentLurker/
👍61🤔1
Audio
Паттерн "Команда"
Обсуждаем один из наиболее используемых паттернов программирования и разбираем примеры применения.

Автор: @cat_and_code
#подкаст 2
👍4🔥2
Новые посты пишут те, у кого старые плохие долго думал я. 🌚

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

Когда нам нужен класс с данными, который в логике приложения нужно сравнивать с другими. Сделан для того, чтобы экономить время и не заниматься переопределением кучи методов: операторы == и !=, GetHashCode, Equals, ToString и конструктор.

Как он работает? Компилятор сам создаёт переопределения для всех необходимых методов. Что по сути превращает record в новых вкусный сахар.

Создание record, способ №1:

public record Name(int Value, string Str);
var n1 = new Name(1, “name1”);

В этом примере свойства под капотом создаются get. Но есть синтаксис, который все-таки позволяет менять значения после создания экземпляра.

n1 = n1 with { Value = 3 }; 


Что делает эта строчка? Создаётся новый экземпляр и записывается в n1, то есть запись выше равносильна такой:

n1 = new Name(3, n1.Str);


Способ №2, сразу с настройкой свойств как вам нужно. Тут уже без проблем можно присваивать новые значения через “=”.

public record Name(int Value, string Str)
{
public int Value {get; set;} = Value;
}

var n2 = new Name(2, “name2”);
n2.Value = 3;


В обоих случаях компилятор за нас сгенерирует конструктор и создаст все перегрузки методов сравнения. Сразу можно пользоваться:

if (n1 == n2) 


Повторюсь, что record - это сахар, разворачивается в class, поэтому есть поддержка всего, что мы любим:
- Наследование
- Могут быть abstract
- Могут быть sealed
- Поддерживают реализацию интерфейсов

#техничка
@cat_and_code
🔥6🍾5
Чет прям в голос, жизненно))
@cat_and_code #мем
😁6🌚1