Как оптимизировать 2D игру?

Раздел, посвящённый самому важному - скорости.

Re: Как оптимизировать 2D игру?

Сообщение Merklar 21 апр 2016, 21:55

Ну не скажи. Если проэкт для мобил, да и в куче других вещей, требующих оптимизации... может подпортить жизнь)
Merklar
UNец
 
Сообщения: 14
Зарегистрирован: 30 мар 2016, 22:49

Re: Как оптимизировать 2D игру?

Сообщение Woolf 21 апр 2016, 22:09

очень не дешевая операция в каждом кадре лезть в GameManager.Instance

Что за чушь? Дешевле этого только локальная переменная, но и то, не на много.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Как оптимизировать 2D игру?

Сообщение Merklar 22 апр 2016, 19:06

А вы попробуйте в цикле повторений так 2000 дать на доступ к синглтону, а потом к локальной и время стопвотчем засеките. Вот и увидите)
Merklar
UNец
 
Сообщения: 14
Зарегистрирован: 30 мар 2016, 22:49

Re: Как оптимизировать 2D игру?

Сообщение Woolf 22 апр 2016, 20:03

Merklar писал(а):А вы попробуйте в цикле повторений так 2000 дать на доступ к синглтону, а потом к локальной и время стопвотчем засеките. Вот и увидите)


Ну сделал на миллион, одинаково вышло. Что не так?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Как оптимизировать 2D игру?

Сообщение Merklar 23 апр 2016, 13:45

Вы уверены? Только что сделал, к локальной переменной более чем в 10 раз быстрее. Да, действительно, сильно оптимизировать этим игру нельзя, но все же рациональнее заменить обращение в каждом кадре к Синглтону на единичную рассылку.
Вот код теста, если интересно:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Diagnostics;

public class TestScript : MonoBehaviour {

    private int localVariable = 100;
        // Use this for initialization
    void Start()
    {
        Stopwatch _timer = new Stopwatch();
        _timer.Start();
        for (int i = 0; i < 300000; i++)
        {
            int _testLocal = localVariable;
        }
        _timer.Stop();
        print(_timer.ElapsedMilliseconds);
        _timer.Reset();
        _timer.Start();
        for (int i = 0; i < 300000; i++)
        {
            int _testSinglton = TestSinglTone.Instance.testGlobal;
        }
        _timer.Stop();
        print(_timer.ElapsedMilliseconds);
    }
       
}
Merklar
UNец
 
Сообщения: 14
Зарегистрирован: 30 мар 2016, 22:49

Re: Как оптимизировать 2D игру?

Сообщение Woolf 23 апр 2016, 20:28

Ну-ка покажите-ка мне код TestSinglTone. Что-то у вас не так.
А, ну и, конечно, же int _testLocal = localVariable; неправильно. Компилятор не дурак, увидит, что никакой работы не происходит, и вообще ваш цикл выкинет. Правильнее так:

Синтаксис:
Используется csharp
        int _testLocal =0;
       _timer.Start();
        for (int i = 0; i < 300000; i++) _testLocal+=localVariable;
        _timer.Stop();
        Debug.Log ("testLocal="+_testLocal)


Ну и по синглтону, конечно же, тоже самое.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Как оптимизировать 2D игру?

Сообщение Merklar 23 апр 2016, 20:58

Сделал, как вы сказали - ничего не поменялось, по прежнему более чем в 10 раз быстрее обращение к локальной. Вот код синглтона
Синтаксис:
Используется csharp
    #region Singltone
    private static TestSinglTone __instance;
    public static TestSinglTone Instance
    {
        get
        {
            if (__instance == null)
            {
                __instance = FindObjectOfType<TestSinglTone>();
                if (__instance == null) Debug.LogError("No GameManager!!!");
                return __instance;
            }
            return __instance;
        }
    }
    #endregion
Merklar
UNец
 
Сообщения: 14
Зарегистрирован: 30 мар 2016, 22:49

Re: Как оптимизировать 2D игру?

Сообщение Woolf 23 апр 2016, 21:43

Вот код синглтона

Итить )) А что ж вы хотели то? А разделить секции инициализации и выборки не пробовали?

Синтаксис:
Используется csharp
public static TestSinglTone instance;

public static init(){
 if (instance==null)  instance=new TestSinglTone();
}
 


Теперь достаточно его один раз инициализироать где-то на старте игры, и пользуйтесь сколько хотите. А так-то конечно, каждый раз его на null проверять, никакой проверялки не хватит.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Как оптимизировать 2D игру?

Сообщение Cr0c 23 апр 2016, 22:11

Синтаксис:
Используется csharp
    public static BotsData Instance { get; private set; }
    public void Awake()
    {
        Instance = this;
    }

А такой код в синглтоне - нормально?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Как оптимизировать 2D игру?

Сообщение Woolf 23 апр 2016, 22:55

А такой код в синглтоне - нормально?

Я лично считаю, что да. Только не забудьте DontDestroyOnLoad еще добавить. И хорошо бы проверить еще, не существует ли уже такой GO. Т.е. я бы лучше написал так:

Синтаксис:
Используется csharp
 void Awake() {
        if ( _getI!=null) {
            Destroy(transform.gameObject);
            return;
        }
        _getI = this;
        DontDestroyOnLoad(gameObject);
    }


А то мало ли в какой момент вам понадобится вернуться на эту стартовую сцену..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Как оптимизировать 2D игру?

Сообщение Merklar 24 апр 2016, 00:51

Спасибо Вам за пояснение, действительно, теперь всего в 2 раза быстрее стало обращение. Теперь придется переписывать все свои синглтоны)
Merklar
UNец
 
Сообщения: 14
Зарегистрирован: 30 мар 2016, 22:49

Re: Как оптимизировать 2D игру?

Сообщение kodekq 25 апр 2016, 11:58

Хочу вернутся к обсуждению типов шейдеров, провёл простой эксперемент, как и писалось выше создал 500 одинаковых спрайтов наложенных друг на друга, но почему-то разницы в производительности совершенно нет между opaque, cutout и transparent, везде на слабом железе просадка до 2-3 фпс, что я сделал не так?
kodekq
UNIт
 
Сообщения: 54
Зарегистрирован: 04 сен 2014, 07:02

Re: Как оптимизировать 2D игру?

Сообщение kodekq 06 май 2016, 07:47

Я наверно задал крайне тупой вопрос, Вы уж извините, может кто-нибудь со стальными нервами всё же сможет мне пояснить?
kodekq
UNIт
 
Сообщения: 54
Зарегистрирован: 04 сен 2014, 07:02

Re: Как оптимизировать 2D игру?

Сообщение Cr0c 06 май 2016, 17:27

А проблема точно в графической подсистеме?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Как оптимизировать 2D игру?

Сообщение kodekq 07 май 2016, 08:16

Cr0c писал(а):А проблема точно в графической подсистеме?

Ну думаю да, больше не в чем ей быть, проект нулёвый, только 500 спрайтов наложенных друг на друга
kodekq
UNIт
 
Сообщения: 54
Зарегистрирован: 04 сен 2014, 07:02

Пред.След.

Вернуться в Оптимизация

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

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