✅ Object Pooling: Режем лаги при спавне
Что это?
Паттерн: переиспользование объектов вместо Instantiate/Destroy.
Зачем?
• Убрать тормоза при частом спавне (пули, враги)
• Снизить нагрузку GC
• Предотвратить фрагментацию памяти
Как реализовать?
Использование:
Важно!
• Рестарт состояния при возврате в пул
• Динамически расширяй пул при нехватке
• Для частиц используй ParticleSystem.Stop(true)
#Unity #Optimization #GameDev
Что это?
Паттерн: переиспользование объектов вместо Instantiate/Destroy.
Зачем?
• Убрать тормоза при частом спавне (пули, враги)
• Снизить нагрузку GC
• Предотвратить фрагментацию памяти
Как реализовать?
public class BulletPool : MonoBehaviour
{
[SerializeField] GameObject bulletPrefab;
[SerializeField] int poolSize = 20;
private Queue<GameObject> pool = new Queue<GameObject>();
void Start()
{
for (int i = 0; i < poolSize; i++)
{
GameObject bullet = Instantiate(bulletPrefab);
bullet.SetActive(false);
pool.Enqueue(bullet);
}
}
public GameObject GetBullet()
{
if (pool.Count > 0)
{
GameObject bullet = pool.Dequeue();
bullet.SetActive(true);
return bullet;
}
return Instantiate(bulletPrefab); // Fallback
}
public void ReturnBullet(GameObject bullet)
{
bullet.SetActive(false);
pool.Enqueue(bullet);
}
}
Использование:
void Shoot()
{
GameObject bullet = pool.GetBullet();
bullet.transform.position = firePoint.position;
bullet.GetComponent<Rigidbody>().velocity = transform.forward * 50f;
}
// В пуле: void OnCollisionEnter() => pool.ReturnBullet(gameObject);
Важно!
• Рестарт состояния при возврате в пул
• Динамически расширяй пул при нехватке
• Для частиц используй ParticleSystem.Stop(true)
#Unity #Optimization #GameDev
❤6 3🔥2😁1 1
✅ Unity: Addressables — умная загрузка ассетов
Что это?
Система для динамической загрузки ресурсов (модели, текстуры, сцены) без захламления памяти. Как "умный склад" для ваших ассетов!
Зачем?
• Уменьшает размер начальной сборки игры
• Загружает контент по требованию (например, уровни)
• Обновляет ассеты без перевыпуска приложения
• Упрощает работу с большими проектами
• Подходит для всех платформ (PC, мобильные, WebGL)
Как начать?
1. Включи в Package Manager:
2. Пометь ассет как Addressable:
- Выбери ресурс (префаб, текстуру)
- В инспекторе нажми "Addressable" + задай уникальный ключ
3. Загрузи в коде:
Важно!
• Всегда выгружай ненужные ассеты через
• Группируй ассеты в Addressables Groups (например: "UI", "Уровни")
• Используй Analyze Tool для поиска ошибок зависимостей
• Для сцен:
💡 Применяй для: DLC, загрузки HD-текстур, управления памятью в мобильных играх.
Тестируй в Play Mode с профилем "Use Existing Build".
#Unity #Addressables #GameDev #Optimization
Что это?
Система для динамической загрузки ресурсов (модели, текстуры, сцены) без захламления памяти. Как "умный склад" для ваших ассетов!
Зачем?
• Уменьшает размер начальной сборки игры
• Загружает контент по требованию (например, уровни)
• Обновляет ассеты без перевыпуска приложения
• Упрощает работу с большими проектами
• Подходит для всех платформ (PC, мобильные, WebGL)
Как начать?
1. Включи в Package Manager:
Window > Asset Management > Addressables 2. Пометь ассет как Addressable:
- Выбери ресурс (префаб, текстуру)
- В инспекторе нажми "Addressable" + задай уникальный ключ
3. Загрузи в коде:
using UnityEngine.AddressableAssets;
// Загрузка префаба
Addressables.LoadAssetAsync<GameObject>("Ключ_Ассета").Completed +=
(handle) =>
{
Instantiate(handle.Result);
};
// Выгрузка (обязательно!)
Addressables.Release(handle);
Важно!
• Всегда выгружай ненужные ассеты через
Release() • Группируй ассеты в Addressables Groups (например: "UI", "Уровни")
• Используй Analyze Tool для поиска ошибок зависимостей
• Для сцен:
Addressables.LoadSceneAsync("Scene_Key") 💡 Применяй для: DLC, загрузки HD-текстур, управления памятью в мобильных играх.
Тестируй в Play Mode с профилем "Use Existing Build".
#Unity #Addressables #GameDev #Optimization
🔥4❤1
✅ Unity ECS & Jobs System: революция производительности
Что это?
Архитектура, где данные хранятся отдельно от логики (Data-Oriented Design). Позволяет обрабатывать десятки тысяч объектов без падения FPS.
Зачем?
- Массовые симуляции (орды врагов, частицы, песочницы)
- Полное использование многоядерных процессоров
- Предсказуемое управление памятью (Zero GC Allocations)
Базовые понятия:
- Entity — не объект, а легковесный ID.
- ComponentData — чистые данные (struct, без методов).
- System — логика, которая работает с массивами компонентов.
Пример (спавн кубов):
Важно!
- Требуется пакет
- Это полный разрыв с
- Идеально для VR/AR с strict performance требованиями
💡 Начинай с гибридного подхода:
#Unity #ECS #Performance #Optimization #JobSystem
Что это?
Архитектура, где данные хранятся отдельно от логики (Data-Oriented Design). Позволяет обрабатывать десятки тысяч объектов без падения FPS.
Зачем?
- Массовые симуляции (орды врагов, частицы, песочницы)
- Полное использование многоядерных процессоров
- Предсказуемое управление памятью (Zero GC Allocations)
Базовые понятия:
- Entity — не объект, а легковесный ID.
- ComponentData — чистые данные (struct, без методов).
- System — логика, которая работает с массивами компонентов.
Пример (спавн кубов):
// Компонент (данные)
public struct RotationSpeed : IComponentData
{
public float RadiansPerSecond;
}
// Система (логика)
public class RotationSystem : SystemBase
{
protected override void OnUpdate()
{
float deltaTime = Time.DeltaTime;
Entities
.ForEach((ref Rotatable rotatable, in RotationSpeed speed) =>
{
rotatable.Value = math.mul(
math.normalize(rotatable.Value),
quaternion.AxisAngle(math.up(), speed.RadiansPerSecond * deltaTime)
);
}).ScheduleParallel();
}
}
Важно!
- Требуется пакет
Entities и Unity.Burst- Это полный разрыв с
MonoBehaviour и ООП- Идеально для VR/AR с strict performance требованиями
💡 Начинай с гибридного подхода:
MonoBehaviour -> преобразование в Entity через ConvertToEntity.#Unity #ECS #Performance #Optimization #JobSystem
🔥3
✅ C# Events в Unity: Избавься от спагетти-кода
Что это?
Паттерн, позволяющий объектам общаться друг с другом без прямых ссылок.
Зачем?
- Сильно снизить связность кода
- Делать код modular и переиспользуемым
- Легко добавлять новую реакцию на событие (звук, анимацию, UI)
- Избегать постоянных проверок в Update (
Как создать?
1. Объяви делегат и событие
2. Подпиши метод на событие
3. Вызови событие, когда что-то произошло
Пример (Смерть игрока):
Как использовать?
Важно!
- Всегда отписывайся от событий в
-
#Unity #CSharp #Events #Delegates #Optimization
Что это?
Паттерн, позволяющий объектам общаться друг с другом без прямых ссылок.
Зачем?
- Сильно снизить связность кода
- Делать код modular и переиспользуемым
- Легко добавлять новую реакцию на событие (звук, анимацию, UI)
- Избегать постоянных проверок в Update (
if (isDead) {...})Как создать?
1. Объяви делегат и событие
2. Подпиши метод на событие
3. Вызови событие, когда что-то произошло
Пример (Смерть игрока):
public class PlayerHealth : MonoBehaviour
{
// 1. Объявляем событие
public static event Action OnPlayerDeath;
public void TakeDamage()
{
if (health <= 0)
{
// 3. Вызываем событие
OnPlayerDeath?.Invoke();
}
}
}
Как использовать?
public class GameManager : MonoBehaviour
{
void OnEnable()
{
// 2. Подписываемся на событие
PlayerHealth.OnPlayerDeath += HandlePlayerDeath;
}
void OnDisable()
{
// Важно: отписываемся при выключении
PlayerHealth.OnPlayerDeath -= HandlePlayerDeath;
}
void HandlePlayerDeath()
{
// Реакция на смерть игрока
Debug.Log("Game Over!");
Time.timeScale = 0f;
}
}
Важно!
- Всегда отписывайся от событий в
OnDisable или OnDestroy, чтобы не было утечек памяти.-
?.Invoke() проверяет, есть ли подписчики (null-check).#Unity #CSharp #Events #Delegates #Optimization
🔥7 3 2🎄1 1
✅ Unity: ключевые инструменты тестирования и оптимизации
Что проверять перед билдом?
Быстрая проверка проекта на основные узкие места: производительность, память, размер сборки.
1. Статистика (Stats) во вкладке Game
Зачем? Мгновенная оценка производительности в реальном времени.
Смотри на:
• FPS (кадры в секунду): цель — стабильные 60+.
• CPU: общее время рендера и обработки скриптов.
• Render Thread: нагрузка на рендер.
• Batches (батчи): чем их меньше — тем лучше. Объединяй объекты!
• Saved by batching: сколько вызовов отрисовано за 1 батч. Цифра должна быть высокой.
• Tris/Verts: количество треугольников и вертексов на кадр.
2. Профайлер (Window > Analysis > Profiler)
Зачем? Найти точную причину падений FPS.
Как использовать?
1. Открой окно.
2. Запусти игру.
3. Смотри графики. Пики — это проблемы.
• CPU: ищи тяжёлые скрипты и методы.
• Rendering: проблемы с рендером, сложные шейдеры.
• Memory: утечки памяти (кнопка «Take Sample» для снимка).
• Audio: нагрузка от звуков.
3. Размер билда (File > Build Settings > Build)
Зачем? Узнать итоговый вес игры и что его увеличивает.
Что делать?
• В окне билда нажми «Build» и посмотри итоговый размер.
• Для деталей: в билде открой «Build Report» (включи в настройках Player).
• Смотри: какие ассеты самые тяжёлые (текстуры, аудио, модели).
• Сжимай текстуры, оптимизируй аудио (формат .ogg).
4. Батчинг (Batching)
Зачем? Снизить количество вызовов отрисовки (draw calls).
Как работает?
• Static Batching: для статических объектов (отмеченных Static). Unity объединяет их в одну сетку.
• Dynamic Batching: Unity автоматически объединяет мелкие объекты с общими материалами.
Важно! Используй общие материалы для одинаковых объектов — это ключ к батчингу.
💡 Вывод: перед билдом всегда проверяй Stats и Профайлер, чтобы найти слабые места. Оптимизируй батчинг и следи за памятью.
#Unity #Unity3D #Optimization #GameDev #Профайлер #Батчинг
Что проверять перед билдом?
Быстрая проверка проекта на основные узкие места: производительность, память, размер сборки.
1. Статистика (Stats) во вкладке Game
Зачем? Мгновенная оценка производительности в реальном времени.
Смотри на:
• FPS (кадры в секунду): цель — стабильные 60+.
• CPU: общее время рендера и обработки скриптов.
• Render Thread: нагрузка на рендер.
• Batches (батчи): чем их меньше — тем лучше. Объединяй объекты!
• Saved by batching: сколько вызовов отрисовано за 1 батч. Цифра должна быть высокой.
• Tris/Verts: количество треугольников и вертексов на кадр.
2. Профайлер (Window > Analysis > Profiler)
Зачем? Найти точную причину падений FPS.
Как использовать?
1. Открой окно.
2. Запусти игру.
3. Смотри графики. Пики — это проблемы.
• CPU: ищи тяжёлые скрипты и методы.
• Rendering: проблемы с рендером, сложные шейдеры.
• Memory: утечки памяти (кнопка «Take Sample» для снимка).
• Audio: нагрузка от звуков.
3. Размер билда (File > Build Settings > Build)
Зачем? Узнать итоговый вес игры и что его увеличивает.
Что делать?
• В окне билда нажми «Build» и посмотри итоговый размер.
• Для деталей: в билде открой «Build Report» (включи в настройках Player).
• Смотри: какие ассеты самые тяжёлые (текстуры, аудио, модели).
• Сжимай текстуры, оптимизируй аудио (формат .ogg).
4. Батчинг (Batching)
Зачем? Снизить количество вызовов отрисовки (draw calls).
Как работает?
• Static Batching: для статических объектов (отмеченных Static). Unity объединяет их в одну сетку.
• Dynamic Batching: Unity автоматически объединяет мелкие объекты с общими материалами.
Важно! Используй общие материалы для одинаковых объектов — это ключ к батчингу.
💡 Вывод: перед билдом всегда проверяй Stats и Профайлер, чтобы найти слабые места. Оптимизируй батчинг и следи за памятью.
#Unity #Unity3D #Optimization #GameDev #Профайлер #Батчинг
🔥6❤4