← Назад к вопросам

Приведи пример достижения которым гордишься

1.6 Junior🔥 151 комментариев
#Опыт и софт-скиллы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример достижения в разработке на Unity: Оптимизация рендеринга сложной сцены в мобильном проекте

Контекст проекта

В 2021 году я работал над мобильной игрой в жанре action-adventure с открытым миром. Проект сталкивался с критической проблемой производительности на средних и слабых устройствах Android — частота кадров (FPS) падала ниже 25 в плотных лесных и городских локациях, что делало игру практически неиграбельной. Основные боли: высокий draw call count, чрезмерное использование динамических теней и неэффективный уровень детализации (LOD).

Подход к решению

Я возглавил задачу по оптимизации рендеринга. Моя стратегия включала несколько этапов:

1. Анализ и профилирование

Сначала я провёл глубокий анализ через Unity Profiler, Frame Debugger и RenderDoc. Ключевые находки:

  • Draw calls: Более 800 на кадр из-за множества уникальных материалов.
  • Тени: Каждый динамический источник света вычислял тени для всех объектов, включая мелкую листву.
  • Геометрия: Высокополигональные модели использовались даже на дальних дистанциях.

2. Реализация решений

Я внедрил комплекс мер, главной из которых стала кастомная система Batch-рендеринга для статической растительности.

Проблема: Тысячи мешей травы и кустов имели уникальные трансформы и материалы, что делало Static Batching неприменимым, а GPU Instancing — неэффективным из-за разных текстур.

Моё решение: Я написал скрипт, который на этапе bake-time объединял объекты растительности в кластеры на основе материала и дистанции, создавая комбинированные меши и атласы текстур. Для рендеринга этих кластеров я использовал Graphics.DrawMesh, что радикально снизило количество draw calls.

// Упрощённая логика кластеризации (запускалась в редакторе)
public void ClusterVegetation(List<VegetationObject> objects, float clusterRadius)
{
    List<VegetationCluster> clusters = new List<VegetationCluster>();

    foreach (var obj in objects)
    {
        bool added = false;
        // Поиск подходящего кластера по материалу и близости
        foreach (var cluster in clusters)
        {
            if (cluster.material == obj.material &&
                Vector3.Distance(cluster.center, obj.position) < clusterRadius)
            {
                cluster.AddObject(obj.mesh, obj.position, obj.uv);
                added = true;
                break;
            }
        }
        // Создание нового кластера
        if (!added)
        {
            var newCluster = new VegetationCluster(obj.material);
            newCluster.center = obj.position;
            newCluster.AddObject(obj.mesh, obj.position, obj.uv);
            clusters.Add(newCluster);
        }
    }

    // Выпекание финальных мешей и атласов для каждого кластера
    foreach (var cluster in clusters)
    {
        cluster.BakeCombinedMesh();
        cluster.BakeTextureAtlas();
    }
}

Дополнительные оптимизации:

  • Замена динамических теней на baked-карты теней для статического окружения.
  • Настройка агрессивных LOD-групп с использованием Occlusion Culling.
  • Атласизация текстур для архитектурных объектов.
  • Оптимизация скриптов: кэширование ссылок, уменьшение Update() вызовов, пулинг объектов.

Результаты

После двух месяцев работы были достигнуты впечатляющие результаты, подтверждённые тестами на устройстве Samsung Galaxy A50:

  • Draw calls: Снижение с 800+ до 150-220 на кадр.
  • Частота кадров (FPS): Рост с <25 FPS до стабильных 50-60 FPS в тех же сложных сценах.
  • Использование CPU: Снижение нагрузки на рендеринг на ~40%.
  • Потребление памяти: Сокращение VRAM на 15% за счёт атласов.

Почему я этим горжусь

Это достижение — не просто техническая победа. Оно имело прямое влияние на бизнес-показатели:

  1. Расширение аудитории: Игра стала доступна на 70% более широком парке Android-устройств.
  2. Улучшение рейтингов: Резко сократилось количество негативных отзывов из-за лагов в магазинах приложений.
  3. Командный рост: Мои наработки и проведённые воркшопы стали стандартом оптимизации в компании для последующих проектов.

Гордость исходит от комплексного подхода: от диагностики до реализации нестандартного, но элегантного решения, которое напрямую повлияло на качество продукта и опыт миллионов игроков. Этот опыт глубоко укрепил моё понимание конвейера рендеринга Unity и важности проактивной оптимизации в мобильной разработке.

Приведи пример достижения которым гордишься | PrepBro