Оптимизация public (ООП)

Программирование на Юнити.

Оптимизация public (ООП)

Сообщение olimpset 22 июн 2016, 17:37

Есть например класс MonoBehaviour, в нем есть переменные публичные.
Синтаксис:
Используется csharp
public class CLASS1
{
public string aadadada1;
public int aadadada2;
public GameObject aadadada3;
...
}

Достаточно много таких публичных переменных.
И обьектов с таким классом на сцене очень много (300 - 500 где то).
К этим обьектам идет частое обращение из других скриптов, вернее к публичным переменным этого класса.
Знаю, много public переменных пагубно влияет на производительность. Может вместо этих переменных сделать один public массив List<object>, и зная ключ массива из других скриптов обращаться непосредственно к массиву?
Или просто сделать все переменные приватными и создать public функцию, по запросу которой берется нужная переменная?
Например:
Синтаксис:
Используется csharp
List<object> list;

public void Get(int i)
{
     return list[i];
}

Как то так. Как хорошо оптимизировать это дело? Думаю понятно объяснил.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Оптимизация public (ООП)

Сообщение waruiyume 22 июн 2016, 17:54

Знаю, много public переменных пагубно влияет на производительность.

Изображение
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение olimpset 22 июн 2016, 17:58

Читал много литературы, говорится в них что нужно как можно меньше использовать public переменных. Это не я выдумал.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Оптимизация public (ООП)

Сообщение waruiyume 22 июн 2016, 18:17

в них что нужно как можно меньше использовать public переменных

Там написано <<много public переменных пагубно влияет на производительность>>?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение olimpset 22 июн 2016, 18:23

Цитирую из одного сайта:
"В нормальных книгах по Delphi черным по белому не рекомендуется использование глобальных переменных.
И ничего не мешает в Delphi так же как в твоём примере для C# обернуть все глобальные переменные в класс и обращаться к ним через свойства.
Delphi полностью объектно-ориентированный язык программирования. И ничего не мешает кодировать с его помощью "продвинуто" (100%-тно объектно ориентированно)."
Это применимо ко всем языкам, не только Delphi.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Оптимизация public (ООП)

Сообщение Paul Siberdt 22 июн 2016, 18:31

А где в цитате про производительность?

Паблики = излишняя видимость данных = возможность напортачить. Больше ничего.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Оптимизация public (ООП)

Сообщение DbIMok 22 июн 2016, 18:33

то есть по вашему глобальные это public? вместо чтения советов на непонятных сайтах, прочтите пару первых глав из любого C# учебника
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Оптимизация public (ООП)

Сообщение waruiyume 22 июн 2016, 18:35

Хотите хохму? Доступ к публичным переменным напрямую будет быстрее, чем через методы, а тем более, быстрее чем через свойства (popcorn)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение olimpset 22 июн 2016, 18:42

waruiyume писал(а):Хотите хохму? Доступ к публичным переменным напрямую будет быстрее, чем через методы, а тем более, быстрее чем через свойства (popcorn)

Быстрее, но если будет изобилие public ов, можно легко будет в коде запутаться. Я стараюсь методы из MonoBehaviour ов, которые на сцене висят переносить в отдельный класс (не наследуемый), и обращаться к методам в этом классе.
Синтаксис:
Используется csharp
class GameLogic
{
void1();
void2();
void3();
}
class P: MonoBehaviour
{
GameLogic gm = new GameLogic();
gm.void1();
}
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Оптимизация public (ООП)

Сообщение DbIMok 22 июн 2016, 18:45

olimpset писал(а):легко будет в коде запутаться

почему?
olimpset писал(а):переносить в отдельный класс

зачем?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Оптимизация public (ООП)

Сообщение olimpset 22 июн 2016, 18:49

DbIMok писал(а):
olimpset писал(а):легко будет в коде запутаться

почему?
olimpset писал(а):переносить в отдельный класс

зачем?


1. Это справедливо, когда будет много строк кода.
2. Не будет глазу приятно смотреть на большое количество строк кода. И легче будет изменить какой то, метод, не иская их в сотнях скриптов.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Оптимизация public (ООП)

Сообщение waruiyume 22 июн 2016, 18:53

Мне кажется, что Вы не совсем поняли идеологию ООП.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение olimpset 22 июн 2016, 19:00

Возможно не совсем. В ООП я не использую в данный момент интерфейсов. Так как сколько не читал литературы, не понял как они работают. Понял для чего, но не понял как организовать структуру классов для интерфейса.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Оптимизация public (ООП)

Сообщение seaman 22 июн 2016, 21:16

а тем более, быстрее чем через свойства

Это не факт. Любые свойства - это на самом деле методы.
Берем Object из Юнити смотрим что внутри:
Изображение
Видим отдельно метод get_name и метод set_name для одного известного все свойства name. Ну и собственно свойство name.
Вот теперь вопрос - дураки ли разработчики компилятора? Если есть отдельные методы - почему не использовать их в вызовах?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Оптимизация public (ООП)

Сообщение waruiyume 22 июн 2016, 21:45

Действительно.
Я подумал так, из-за теста пипа этого
Синтаксис:
Используется csharp
using System.Diagnostics;
using UnityEngine;

public class MethodVsProperty : MonoBehaviour
{
    public float a;

    void Start()
    {
        Vector3 testVec = Vector3.one;
        Vector3 zero = Vector3.zero;

        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();
        for (int i = 0; i < 100000000; i++)
        {
            a = Vector3.Distance(testVec, zero);
        }
        stopwatch.Stop();
        var methodResult = stopwatch.ElapsedMilliseconds;

        stopwatch.Reset();
        stopwatch.Start();
        for (int i = 0; i < 100000000; i++)
        {
            a = (testVec-zero).magnitude;
        }
        stopwatch.Stop();
        var propertyResult = stopwatch.ElapsedMilliseconds;

        UnityEngine.Debug.LogFormat("method= {0}, property= {1} ratio= {2}", methodResult, propertyResult, (double)methodResult/propertyResult);
    }
}
 

Всё же непонятно, откуда 20% разницы?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

След.

Вернуться в Скрипты

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

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