#unity #асинхронность #производительность
Приветствую, друзья 👋
Подведем итоги по проблеме с кодом, который разбирали в недавнем опросе 👇
Пример 1.
Проблема кода, приведенного выше, будет заключаться в производительности.
Получение данных из сокета происходит в отдельном треде (Task.Delay(1)).
Так, как операция выполняется быстро, то await на каждой итерации необходимо будет ждать, пока главный поток освободится.
Следовательно, в данном случае узкое горлышко - главный поток.
Предлагаю рассмотреть разницу между кодом из опроса (Пример 1) и приведенным ниже 👇
Пример 2.
❗Пример 1 и Пример 2 будут сильно отличаться по количеству итераций.
Бóльшее количество итераций будет в примере 2.
Всё зависит от того, как долго у нас занят главный поток на каждой своей итерации. Если время получения данных из сокета на каждой итерации (t1) в нашем цикле меньше времени одной итерации главного потока (t2), то мы при await receiveDataTask упрёмся во время t2 и будем ожидать ~ t2.
Таким образом код из Пример 1 демонстрирует ограничения, с которыми мы можем столкнуться в реальной разработке.
❗Пример 2 показывает, как можно избежать просадки производительности, используя ConfigureAwait(false) для receiveDataTask. В таком случае продолжение будет выполнено вне главного потока и ожидания не будет.
Думаю, что об асинхронности стоит позже написать отдельный пост и поговорить о контексте синхронизации в 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.
Хорошего дня!
Хороших выходных!
Приветствую 👋
Пока я готовлю материал по десереализации, предлагаю поучаствовать в дискуссии.
Давайте обсудим проблему на стыке взаимодействия нескольких отделов игровой студии: аниматор+3d художник -> разработчик.
В играх с 3d персонажами перед командой стоит задача частого преображения/изменения героя: 3d модели, анимаций или стилизация (например: смена одежды).
Зоны ответственности поделены между:
- аниматор+3d художник - результатом работы которых является fbx файл
- разработчик создает и модифицирует prefab, созданный из fbx. В иерархии prefab присутствует набор скриптов.
Таким образом при модификации арт командой исходного fbx, разработке необходимо применить изменения для prefab.
❗И именно в этом месте после манипуляций над fbx на выходе часто оказывается неработоспособный prefab, где степень повреждений может варьировать от "руки модели вдруг начинают расти не из того места" до "полностью пропало визуальное отображение модели".
Документация Unity достаточно скудно покрывает данный вопрос и не содержит коробочных решений!
Предлагаю обсудить:
- сталкивались ли вы с данной проблемой на практике и как решали?
- если не сталкивались, предположите порядок действия для изменения корректного переноса изменений в prefab.
Хорошего дня!
Хороших выходных!
#задача #unity
Приветствую 👋
Предлагаю разобрать задачу, которая легко может ввести в ступор разработчика 🫣
Итак, рассмотрим пример из проекта 👇
У нас в игре есть турель (GameObject), которая стреляет по некоторому таргету (Transform).
Дуло пушки (находится внутри GameObject), поднято на некоторый оффсет (x,y,z).
При стрельбе пушка должна поворачиваться к таргету так, чтобы дуло смотрело точно в центр таргета.
Напишите в комментариях, как бы вы решали данную задачу ✍️
Ближе к выходным расскажу вам свое решение и дам комментарий по вашим подходам!
Хорошего дня 🤝
Приветствую 👋
Предлагаю разобрать задачу, которая легко может ввести в ступор разработчика 🫣
Итак, рассмотрим пример из проекта 👇
У нас в игре есть турель (GameObject), которая стреляет по некоторому таргету (Transform).
Дуло пушки (находится внутри GameObject), поднято на некоторый оффсет (x,y,z).
При стрельбе пушка должна поворачиваться к таргету так, чтобы дуло смотрело точно в центр таргета.
Напишите в комментариях, как бы вы решали данную задачу ✍️
Ближе к выходным расскажу вам свое решение и дам комментарий по вашим подходам!
Хорошего дня 🤝
#разбор_кода #unity #архитектура
Приветствую 👋
Я завершил разбор кода для игры с кубиками 🥳.
Видео доступно по ссылке ➡️
https://www.youtube.com/watch?v=xikR6XkeuKE
Приятного просмотра 😉
Приветствую 👋
Я завершил разбор кода для игры с кубиками 🥳.
Видео доступно по ссылке ➡️
https://www.youtube.com/watch?v=xikR6XkeuKE
Приятного просмотра 😉
YouTube
Геймдев. Разбор архитектурного подхода на примере игры для канала https://t.me/gamedev_unity3d
Разбор подхода к проектированию архитектуры игрового проекта в рамках образовательного канала по разработке игр на Unity 3D.
Разбираем:
- точка входа в код
- слои абстракции
- префабы и их организация
- жизненный цикл объектов.
Больше полезной информации…
Разбираем:
- точка входа в код
- слои абстракции
- префабы и их организация
- жизненный цикл объектов.
Больше полезной информации…