Страница 3 из 4

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

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

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

СообщениеДобавлено: 21 апр 2016, 22:09
Woolf
очень не дешевая операция в каждом кадре лезть в GameManager.Instance

Что за чушь? Дешевле этого только локальная переменная, но и то, не на много.

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

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

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

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


Ну сделал на миллион, одинаково вышло. Что не так?

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

СообщениеДобавлено: 23 апр 2016, 13:45
Merklar
Вы уверены? Только что сделал, к локальной переменной более чем в 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);
    }
       
}

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

СообщениеДобавлено: 23 апр 2016, 20:28
Woolf
Ну-ка покажите-ка мне код 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)


Ну и по синглтону, конечно же, тоже самое.

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

СообщениеДобавлено: 23 апр 2016, 20:58
Merklar
Сделал, как вы сказали - ничего не поменялось, по прежнему более чем в 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

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

СообщениеДобавлено: 23 апр 2016, 21:43
Woolf
Вот код синглтона

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

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

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


Теперь достаточно его один раз инициализироать где-то на старте игры, и пользуйтесь сколько хотите. А так-то конечно, каждый раз его на null проверять, никакой проверялки не хватит.

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

СообщениеДобавлено: 23 апр 2016, 22:11
Cr0c
Синтаксис:
Используется csharp
    public static BotsData Instance { get; private set; }
    public void Awake()
    {
        Instance = this;
    }

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

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

СообщениеДобавлено: 23 апр 2016, 22:55
Woolf
А такой код в синглтоне - нормально?

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

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


А то мало ли в какой момент вам понадобится вернуться на эту стартовую сцену..

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

СообщениеДобавлено: 24 апр 2016, 00:51
Merklar
Спасибо Вам за пояснение, действительно, теперь всего в 2 раза быстрее стало обращение. Теперь придется переписывать все свои синглтоны)

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

СообщениеДобавлено: 25 апр 2016, 11:58
kodekq
Хочу вернутся к обсуждению типов шейдеров, провёл простой эксперемент, как и писалось выше создал 500 одинаковых спрайтов наложенных друг на друга, но почему-то разницы в производительности совершенно нет между opaque, cutout и transparent, везде на слабом железе просадка до 2-3 фпс, что я сделал не так?

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

СообщениеДобавлено: 06 май 2016, 07:47
kodekq
Я наверно задал крайне тупой вопрос, Вы уж извините, может кто-нибудь со стальными нервами всё же сможет мне пояснить?

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

СообщениеДобавлено: 06 май 2016, 17:27
Cr0c
А проблема точно в графической подсистеме?

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

СообщениеДобавлено: 07 май 2016, 08:16
kodekq
Cr0c писал(а):А проблема точно в графической подсистеме?

Ну думаю да, больше не в чем ей быть, проект нулёвый, только 500 спрайтов наложенных друг на друга