Почему низкий фпс при большом количестве CharacterController

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Почему низкий фпс при большом количестве CharacterController

Сообщение Zimaell 02 мар 2023, 20:47

У меня на сцене по задумке должно быть примерно 1000 нпс, каждый что-то делает, например ходит от точки а к точке б, иногда подпрыгивает если нужно.
Я прикрепил им CharacterController и для теста просто их заспавнил, 1000 единиц.
скрипт по минимум, только движение вперёд
Синтаксис:
Используется csharp
controller.Move(MoveDirection * Time.deltaTime * speed);

фпс сразу уменьшилось до 5-8...
То есть 1000 пустых объектов с CharacterController, всё больше на нём ничего нет, при этом такой низкий фпс, а это я даже им не прицепил скрипт который будет их направлять...

Что можно сделать в данной ситуации? Как можно двигать 1000 единиц, при этом чтобы фпс не просаживался?

(контроллер должен быть у них однозначно, так как местность генерируемая, склоны, обрывы...)
(3D проект)
Zimaell
UNIверсал
 
Сообщения: 474
Зарегистрирован: 04 июл 2020, 18:45

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение Alkos26Rus 02 мар 2023, 21:22

Свой делать ну или искать готовый, т.к CharacterController гавно
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение Zimaell 02 мар 2023, 21:25

Alkos26Rus писал(а):Свой делать ну или искать готовый, т.к CharacterController гавно

там еще советуют navmesh, не знаю еще не пробовал его, что лучше свой контроллер делать или навмеш использовать?
просто не знаю что будет продуктивнее...
Zimaell
UNIверсал
 
Сообщения: 474
Зарегистрирован: 04 июл 2020, 18:45

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение krauser0993 02 мар 2023, 22:27

Zimaell писал(а):
Alkos26Rus писал(а):Свой делать ну или искать готовый, т.к CharacterController гавно

там еще советуют navmesh, не знаю еще не пробовал его, что лучше свой контроллер делать или навмеш использовать?
просто не знаю что будет продуктивнее...


а где связь? navmesh можешь повесить на пустышку и он будет двигаться
krauser0993
UNITрон
 
Сообщения: 342
Зарегистрирован: 05 апр 2019, 15:17

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение Zimaell 02 мар 2023, 23:41

krauser0993 писал(а):
Zimaell писал(а):
Alkos26Rus писал(а):Свой делать ну или искать готовый, т.к CharacterController гавно

там еще советуют navmesh, не знаю еще не пробовал его, что лучше свой контроллер делать или навмеш использовать?
просто не знаю что будет продуктивнее...


а где связь? navmesh можешь повесить на пустышку и он будет двигаться

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

думал основная нагрузка на аниматор и мешрендерер, с ними разобрался, а тут вот, не думал что контроллер так нагружает, буду дальше крутить мутить...
Zimaell
UNIверсал
 
Сообщения: 474
Зарегистрирован: 04 июл 2020, 18:45

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение Jarico 03 мар 2023, 10:51

Не знаю какой у тебя там калькулятор но лаги начинаются из-за вызова CharacterController.Move
Наличие хоть 10000 компонентов на количество кадров никак не влияют
Скрытый текст:
с 300 контроллеров (Windows 10, i3 10100f)
Лаги:
с 220 контроллеров (Windows 10, Xeon X5450)
с 40 контроллеров (Windows 8.1, Pentium N3540)
с 80 контроллеров (Android 11, MediaTek Helio G96)


Изображение

Синтаксис:
Используется csharp
using System.Collections.Generic;
using UnityEngine;

public class Test2kCC : MonoBehaviour
{
    List<CharacterController> list = new();
    void Start()
    {
        for(var i = 0; i < 300; i++)
        {
            list.Add(new GameObject($"CC_{i}").AddComponent<CharacterController>());
        }
    }

    public void DrawBounds(Bounds b, Color color, float duration = 0)
    {
        var p1 = new Vector3(b.min.x, b.min.y, b.min.z);
        var p2 = new Vector3(b.max.x, b.min.y, b.min.z);
        var p3 = new Vector3(b.max.x, b.min.y, b.max.z);
        var p4 = new Vector3(b.min.x, b.min.y, b.max.z);

        Debug.DrawLine(p1, p2, color, duration);
        Debug.DrawLine(p2, p3, color, duration);
        Debug.DrawLine(p3, p4, color, duration);
        Debug.DrawLine(p4, p1, color, duration);

        var p5 = new Vector3(b.min.x, b.max.y, b.min.z);
        var p6 = new Vector3(b.max.x, b.max.y, b.min.z);
        var p7 = new Vector3(b.max.x, b.max.y, b.max.z);
        var p8 = new Vector3(b.min.x, b.max.y, b.max.z);

        Debug.DrawLine(p5, p6, color, duration);
        Debug.DrawLine(p6, p7, color, duration);
        Debug.DrawLine(p7, p8, color, duration);
        Debug.DrawLine(p8, p5, color, duration);

        Debug.DrawLine(p1, p5, color, duration);
        Debug.DrawLine(p2, p6, color, duration);
        Debug.DrawLine(p3, p7, color, duration);
        Debug.DrawLine(p4, p8, color, duration);
    }

    void FixedUpdate()
    {
        for (var i = 0; i < list.Count; i++)
        {
            list[i].Move(Random.insideUnitSphere * Random.Range(-3,3));
            DrawBounds(list[i].bounds, Color.red);
        }
    }
}

 



для NPC используй пул, когда он дохнет кидай в пул и снова создавай когда он нужен
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение Zimaell 03 мар 2023, 13:34

Jarico писал(а):Не знаю какой у тебя там калькулятор но лаги начинаются из-за вызова CharacterController.Move

да я заметил, но двигаться то они должны, просто не думал что из-за движения контроллера будут такая просадка...
В чём я точно убедился что стандартный CharacterController для массового использования точно не подойдёт, сейчас еще потестю навмеш, но как я понял тут больше нужно копать с сторону DOTS... копаю дальше...
Zimaell
UNIверсал
 
Сообщения: 474
Зарегистрирован: 04 июл 2020, 18:45

Re: Почему низкий фпс при большом количестве CharacterController

Сообщение Jarico 04 мар 2023, 01:35

В качестве контроллера подойдёт rigidbody, но кодом придется поднимать его на ступеньках с помощью Physics.ComputePenetration, rigidbody менее прожорлив чем CC почти в 2 раза
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16