GameDev: разработка на Unity3D
443 subscribers
6 photos
2 videos
7 files
40 links
Все для успешного развития разработчика в геймдев: от junior до CTO. SOLID на практике, IOC, DI. Новые паттерны для gamedev. Личный опыт.

Заявка на разбор тестовых https://forms.gle/kqVPv1jWT97Bkps9A
Download Telegram
#unity #асинхронность #производительность
Приветствую, друзья 👋

Подведем итоги по проблеме с кодом, который разбирали в недавнем опросе 👇

Пример 1.
TimeSpan workDuration = TimeSpan.FromSeconds(10);
DateTime endDateTime = DateTime.Now.Add(workDuration);

int iterationsCount = 0;
while (DateTime.Now < endDateTime)
{
// some fast network operation, receive data from socket, speed 200 Mbps
Task receiveDataTask = Task.Delay(1);

await receiveDataTask;

iterationsCount++;
}

Debug.Log($"Iterations count: {iterationsCount}");


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

Получение данных из сокета происходит в отдельном треде (Task.Delay(1)).
Так, как операция выполняется быстро, то await на каждой итерации необходимо будет ждать, пока главный поток освободится.
Следовательно, в данном случае узкое горлышко - главный поток.

Предлагаю рассмотреть разницу между кодом из опроса (Пример 1) и приведенным ниже 👇

Пример 2.
TimeSpan workDuration = TimeSpan.FromSeconds(10);
DateTime endDateTime = DateTime.Now.Add(workDuration);

int iterationsCount = 0;
while (DateTime.Now < endDateTime)
{
// some fast network operation, receive data from socket, speed 200 Mbps
Task receiveDataTask = Task.Delay(1);

await receiveDataTask.ConfigureAwait(false);

iterationsCount++;
}

Debug.Log($"Iterations count: {iterationsCount}");


Пример 1 и Пример 2 будут сильно отличаться по количеству итераций.
Бóльшее количество итераций будет в примере 2.
Всё зависит от того, как долго у нас занят главный поток на каждой своей итерации. Если время получения данных из сокета на каждой итерации (t1) в нашем цикле меньше времени одной итерации главного потока (t2), то мы при await receiveDataTask упрёмся во время t2 и будем ожидать ~ t2.

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

Пример 2
показывает, как можно избежать просадки производительности, используя ConfigureAwait(false) для receiveDataTask. В таком случае продолжение будет выполнено вне главного потока и ожидания не будет.

Думаю, что об асинхронности стоит позже написать отдельный пост и поговорить о контексте синхронизации в Unity.

Хорошей всем недели 💪.
#unity_3d #prefab #модель #анимация #fbx

Приветствую 👋

Пока я готовлю материал по десереализации, предлагаю поучаствовать в дискуссии.

Давайте обсудим проблему на стыке взаимодействия нескольких отделов игровой студии: аниматор+3d художник -> разработчик.

В играх с 3d персонажами перед командой стоит задача частого преображения/изменения героя: 3d модели, анимаций или стилизация (например: смена одежды).

Зоны ответственности поделены между:
- аниматор+3d художник - результатом работы которых является fbx файл
- разработчик создает и модифицирует prefab, созданный из fbx. В иерархии prefab присутствует набор скриптов.

Таким образом при модификации арт командой исходного fbx, разработке необходимо применить изменения для prefab.

И именно в этом месте после манипуляций над fbx на выходе часто оказывается неработоспособный prefab, где степень повреждений может варьировать от "руки модели вдруг начинают расти не из того места" до "полностью пропало визуальное отображение модели".

Документация Unity достаточно скудно покрывает данный вопрос и не содержит коробочных решений!

Предлагаю обсудить:
- сталкивались ли вы с данной проблемой на практике и как решали?
- если не сталкивались, предположите порядок действия для изменения корректного переноса изменений в prefab.

Хорошего дня!
Хороших выходных!
#задача #unity
Приветствую 👋

Предлагаю разобрать задачу, которая легко может ввести в ступор разработчика 🫣

Итак, рассмотрим пример из проекта 👇
У нас в игре есть турель (GameObject), которая стреляет по некоторому таргету (Transform).
Дуло пушки (находится внутри GameObject), поднято на некоторый оффсет (x,y,z).

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

Напишите в комментариях, как бы вы решали данную задачу ✍️
Ближе к выходным расскажу вам свое решение и дам комментарий по вашим подходам!

Хорошего дня 🤝