Понедельник, 25 Ноября 2024, 08:30

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Оптимизация 3D игры
BassPiraT92Дата: Четверг, 23 Января 2020, 14:29 | Сообщение # 1
участник
Сейчас нет на сайте
Подскажите как оптимизировать большое колличество блоков(типа майнкрафта)

т.к. при небольшой карте сгенерированной, фпс падает до 15-20. Хотя нагрузки на проц или видюху нету!

Вот скрипт и скрины генератора:

Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class WorldCreate : MonoBehaviour
{
    public GameObject[] GroundPref;

    [SerializeField] GameObject UILoad;
    [SerializeField] GameObject Player;
    [SerializeField] Text SizeWorld;

    public float offcet = 0;
    public float offcetEnd = 50f;

    bool startBlock = false;
    void Start()
    {
        Cursor.visible = true;
        
    }

    
    void Update()
    {

    }

    public void StartGenerator()
    {
        if (SizeWorld == null)
        {
            offcetEnd = 50f;
        }
        else
        {
            offcetEnd = int.Parse(SizeWorld.text);
        }
        StartCoroutine(Generator());
    }

    IEnumerator Generator()
    {
        while (true)
        {
            float genX=0;

            if (startBlock != true)
            {
                Instantiate(GroundPref[Random.Range(0,GroundPref.Length)], transform.position, new Quaternion(0, 0, 0, 0), transform);
                startBlock = true;
            }
    
            for (int i = 0;i < offcetEnd; i++)
            {
               genX += 1;
               GameObject spawnBlock = Instantiate(GroundPref[Random.Range(0, GroundPref.Length)], new Vector3(genX, transform.position.y, offcet), new Quaternion(0, 0, 0,0), transform);
                if (spawnBlock.tag.Equals("stone"))
                {
                    spawnBlock.transform.position = new Vector3(spawnBlock.transform.position.x, spawnBlock.transform.position.y + Random.Range(0f,1f), spawnBlock.transform.position.z);
                    
                }
                if (spawnBlock.tag.Equals("Tree1"))
                {
                    spawnBlock.transform.position = new Vector3(spawnBlock.transform.position.x, spawnBlock.transform.position.y + Random.Range(-1f,3f), spawnBlock.transform.position.z);

                }
                if (spawnBlock.tag.Equals("Ground2"))
                {
                    spawnBlock.transform.position = new Vector3(spawnBlock.transform.position.x, spawnBlock.transform.position.y + Random.Range(0f,0.3f), spawnBlock.transform.position.z);

                }

            }
            if (offcet != offcetEnd)
            {
                offcet += 1;
                StartCoroutine(Generator());
            }

            UILoad.SetActive(false);
            Player.SetActive(true);
            yield break;
        }
    }
}



WiteДата: Четверг, 23 Января 2020, 15:50 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Вы про драв колы слыхали не ? У вас их 92 тысячи. Объединяйте меши с одним материалом в один меш. Используйте окулизион кулинг.
martukДата: Четверг, 23 Января 2020, 16:20 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Помню писал свою реализацию геймлея как в minecraft, только вот не на Unity а на js+three.js, что добавляло сложности и требования к оптимизации. И то я удосужился почитать статьи как это все устроено в самом minecraft'те, что есть там какие то чанки и все такое, что нет там как таковых "Блоков", меш генерируется динамически на основе массива и при каждом добавлении/удалении блоков - пересчитывается весь меш условной группы блоков. И с 90к вызовов мы плавно переходим к 32-90 вызовов отрисовки. Господи, так я просто умел гуглить и интересоваться тем, что собираюсь делать. У вас такая мощь в руках под названием Unity, и вы умудряетесь такую хрень на нем писать, а потом хламить форумы своими глупыми вопросами.
BassPiraT92, ты по счету 99349543 человек, который решил сделать очередной майн обычными кубиками.

Добавлено (23 Января 2020, 16:25)
---------------------------------------------
Цитата Wite ()
Хотя нагрузки на проц или видюху нету!

На последнем скриншоте у тебя процессор нагружен довольно сильно, где хоть нету-то?

Добавлено (23 Января 2020, 16:27)
---------------------------------------------
Цитата Wite ()
Объединяйте меши с одним материалом в один меш. Используйте окулизион кулинг.

Расшифрую: Подели мир на отдельные меши 16x16x16 блоков и скрывай их, если они все поля видимости. Один материал - один меш еще может быть, но в одном меше может быть несколько текстур, не нужно путать.


Сообщение отредактировал martuk - Четверг, 23 Января 2020, 16:31
BassPiraT92Дата: Четверг, 23 Января 2020, 16:32 | Сообщение # 4
участник
Сейчас нет на сайте
martuk, спасибо) уже пробую) Но у меня не майнкрафт) просто некоторые локации в игре должны генерироваться, поэтому упростил до кубиков =)
martukДата: Четверг, 23 Января 2020, 16:34 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Спойлер: все гораздо будет проще, если научиться самому процедурно генерировать меш.
drcrackДата: Четверг, 23 Января 2020, 16:57 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата
"Блоков", меш генерируется динамически на основе массива и при каждом добавлении/удалении блоков - пересчитывается весь меш условной группы блоков.

я хотел сначала добавить некоторые детали (сам писал чето похожее недавно), но потом посмотрел на код тса и передумал ;)

BassPiraT92, я бы тебе посоветовал прокачать скилл на чем-нибудь попроще прежде чем браться за свой майнкрафт, т.к. это намного, намного сложнее чем просто создание миллиона блоков с помощью Instantiate

PS если ты просто включишь инстансинг в материалах, фпс вырастет раз в 10


Сообщение отредактировал drcrack - Четверг, 23 Января 2020, 16:58
ShortKedrДата: Четверг, 23 Января 2020, 19:13 | Сообщение # 7
Renword Studio
Сейчас нет на сайте
BassPiraT92, рассказываю секрет работы всех видеокарт:

Для каждого объекта в сцене вызывается цикл прорисовки или так называемый в unity - drawcall. По факту это использование программы шейдера, которая считает цвет пикселов, какой объект за каким рендерится и т.д. Собственно именно с помощью шейдерной программы видяха рисует объект на экране, все пикселы параллельно в разных потоках. Потоков конечно много, но они не бесконечны. Так же каждый drawcall или прорисовка объекта идёт последовательно одна за другой. Вычисления просты и видяха не напрягается, не используются все потоки, но из за объёма последовательных вызовов увеличивается время на рендеринг, понимаешь.

Если хочешь мир как в майнкрафте сделать. Научись процедурно генерировать и изменять меш, разбей на чанки, каждый чанк это свой меш - так можно будет не напрягать сильно процессор при пересчетах. Так же научись этому мешу правильно UV развёртки делать. Если ты замечал, в ресурсах того же майна используется одна текстура со всем, иногда больше, если на одной не помещается. Если все это научиться делать - то и работать будет шустро и проблем не возникнет потом странных. Кстати генерировать квадратные меши - это самое простое и гораздо проще чем те же неровные поверхности или например майнкрафт со сглаживание кубиков - 256 вариантов субмешей выходит, которые надо просчитать заранее

Добавлено (23 Января 2020, 19:18)
---------------------------------------------
Кстати static batching никто не отменял, он может всю работу за тебя сделать, серьёзно, даже парится может не придётся, всего лишь надо одну галочку ткнуть. А ещё можно GPU instancing использовать, вот вообще красота. Короче UnityTechnologies уже всё за тебя сделали =)


Сообщение отредактировал ShortKedr - Четверг, 23 Января 2020, 19:21
drcrackДата: Пятница, 24 Января 2020, 02:47 | Сообщение # 8
старожил
Сейчас нет на сайте
так-то все правильно написал, но насчет
Цитата
Кстати static batching никто не отменял, он может всю работу за тебя сделать, серьёзно, даже парится может не придётся, всего лишь надо одну галочку ткнуть.

подумай еще раз ))


Сообщение отредактировал drcrack - Пятница, 24 Января 2020, 02:47
ShortKedrДата: Пятница, 24 Января 2020, 04:15 | Сообщение # 9
Renword Studio
Сейчас нет на сайте
drcrack, ну конечно там есть условности и особенности, это человек уже может сам прочитать в документации, если действительно заинтересован :D
Тем не менее если ты ничего не трогал лишнего и одну галочку тыкнул, всё должно работать... Или у тебя есть чем переубедить меня, хм? ;)

Добавлено (24 Января 2020, 04:22)
---------------------------------------------
А ты видимо про это:
Цитата
So technically it does not save “3D API draw calls”, but it saves on state changes done between them (which is the expensive part).

Да, не приятно для майнкрафта)) Но это только технически, реально же прирост производительности значительный присутствует, однако тоже depends. От ситуации зависит
Тем не менее, главная идея оптимизации, думаю, автору понятна :)

Добавлено (24 Января 2020, 04:33)
---------------------------------------------
Чуть не забыл, рендер то рендер, но...
Ещё, не надо делать очень много объектов в инспекторе, каждый со своим сложным Update просчётом и ещё чем-нибудь. Проц загнётся
Как раз если делать так:
Цитата drcrack ()
просто создание миллиона блоков с помощью Instantiate

То кирдык процу

Из этого можно сделать простой вывод, что оптимизированная игра должна правильно использовать и процессор и видеокарту. Если что-то используется через чур круто, можно попрощаться с фпс


Сообщение отредактировал ShortKedr - Пятница, 24 Января 2020, 04:40
InsaneSystemsДата: Пятница, 24 Января 2020, 18:27 | Сообщение # 10
участник
Сейчас нет на сайте
Самый правильный совет дал drcrack, тут просто подсказки с форума ничем не помогут. ТСу надо понимать, как работает вообще процесс отрисовки сцены, что для его уровня может быть несколько тяжеловато.

Цитата
Но у меня не майнкрафт) просто некоторые локации в игре должны генерироваться, поэтому упростил до кубиков =)

В таком случае рекомендую использовать как можно меньше кубиков, лучше объединить всё что генерится по одному паттерну (деревья там) в одну модель, как и всё остальное. Затем включить Dynamic Batching и проставить во всех материалах таких объектов Enable GPU Instancing, как уже сказали выше. Но это даст максимум фреймрейт "на пороге", чуть лишнего накрутишь - и вернутся лаги и просады фпс. Лучше действительно попробовать что попроще сделать, или начать серьёзно разбираться в вопросе. :)


Сообщение отредактировал InsaneSystems - Пятница, 24 Января 2020, 18:35
BassPiraT92Дата: Пятница, 31 Января 2020, 17:54 | Сообщение # 11
участник
Сейчас нет на сайте
Ну впринципе все понятно, но вот почему мешкомбайн ломает готовую модель:



Немного оптимизировал код:


Сообщение отредактировал BassPiraT92 - Пятница, 31 Января 2020, 21:13
drcrackДата: Пятница, 31 Января 2020, 21:52 | Сообщение # 12
старожил
Сейчас нет на сайте
Цитата
Ну впринципе все понятно, но вот почему мешкомбайн ломает готовую модель:

А как она выглядела до того как сломалась?
LLLДата: Пятница, 31 Января 2020, 22:00 | Сообщение # 13
участник
Сейчас нет на сайте
Есть же исходники вроде. Переведи на юнити.
ShortKedrДата: Суббота, 01 Февраля 2020, 08:32 | Сообщение # 14
Renword Studio
Сейчас нет на сайте
Цитата BassPiraT92 ()
Ну впринципе все понятно, но вот почему мешкомбайн ломает готовую модель:

Если топология верная, но всё стало одного цвета, так понимаю? Материалы не комбинятся, нужно делать композитный материал с текстурой, пускай 2 на 2 пикселя с 4 цветами(ну или сколько тебе нужно там) в каждом и менять uv кординаты вертексов моделек, которые присоединяешь. Текстуру можно даже генерить по имеющимся материалам, ничего сложного там нет
BassPiraT92Дата: Среда, 05 Февраля 2020, 22:01 | Сообщение # 15
участник
Сейчас нет на сайте
drcrack, Она была квадратная, цвет точно такой же. Просто при объединении более 50х50 блоков, форма конечного меша меняется
drcrackДата: Четверг, 06 Февраля 2020, 04:13 | Сообщение # 16
старожил
Сейчас нет на сайте
возможно дело в том что по дефолту в меше 16-битные индексы и соответственно лимит в ~65k вертексов (в дефолтном кубе 24 вертекса, т.е. примерно 2700 кубов)
в новых юнити можно попробовать
Код
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;


Сообщение отредактировал drcrack - Четверг, 06 Февраля 2020, 04:15
djwirtuozДата: Понедельник, 10 Февраля 2020, 19:08 | Сообщение # 17
почетный гость
Сейчас нет на сайте
Не совсем по теме вопроса, но интересная статья про оптимизацию в целом
статья


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

Сообщение отредактировал djwirtuoz - Понедельник, 10 Февраля 2020, 19:09
ShortKedrДата: Вторник, 11 Февраля 2020, 01:37 | Сообщение # 18
Renword Studio
Сейчас нет на сайте
djwirtuoz, хорошая статья в целом. Много чего разобрано, в том числе самое главное - относительность процесса. Плюсег поставил за это =)

Сообщение отредактировал ShortKedr - Вторник, 11 Февраля 2020, 01:38
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг