Насколько оптимизирован данный код

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

Насколько оптимизирован данный код

Сообщение Demak 29 ноя 2017, 23:29

И так, возник вопрос по поводу использования данного кода:
Синтаксис:
Используется csharp
void Update () {
        transform.Translate(0, 0, speed * Time.deltaTime);
        posy=transform.localPosition.y;
        posx=transform.localPosition.x;
        if (Mathf.Sqrt(posy * posy + posx * posx) > 3) {
            transform.Rotate(0, 210, 0);
        }
        }

Я создал пустой объект, к нему присоединил код который создает 5 штук мобов с данным скриптом, сами мобы двигаються в пред и должны поворачивать как только они вышли из радиуса равному 3 ед, насколько правильно в методе Update использовать корень из квадратов координат?, просто у меня сами мобы поворачивают назад через раз... и тут либо комп не успевает прощитывать корень 5 раз, либо я не правильно код написал. И есть ли какой нибудь метод получше для ограничения движения моих мобов ?
Demak
UNец
 
Сообщения: 1
Зарегистрирован: 29 ноя 2017, 23:13

Re: Насколько оптимизирован данный код

Сообщение Paul Siberdt 30 ноя 2017, 00:24

Данный код оптимизирован чуть менее, чем нисколько.
Синтаксис:
Используется csharp
Transform t; //объявляем переменную для будущей ссылки

void Start()
{
        t = transform; //определяем кэшированную ссылку на трансформ
}

void Update ()
{
        t.Translate(0, 0, speed * Time.deltaTime);
        if(t.position.magnitude > 3f) //вместо тригонометрических рассчетов, просто узнаем длину вектора позиции
            t.Rotate(0, 210, 0);
}
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5100
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Насколько оптимизирован данный код

Сообщение samana 30 ноя 2017, 08:26

Paul Siberdt писал(а):Данный код оптимизирован чуть менее, чем нисколько.

Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

if(t.position.magnitude > 3f) //вместо тригонометрических рассчетов, просто узнаем длину вектора позиции

На самом деле, метод magnitude использует тот же самый метод Mathf.Sqrt внутри себя (https://github.com/MattRix/UnityDecompi ... Vector3.cs), поэтому быстрее точно не станет в плане производительности. И раз такое дело, то быстрее должно быть
Синтаксис:
Используется csharp
t.position.sqrMagnitude > 3f * 3f
Аватара пользователя
samana
Адепт
 
Сообщения: 3793
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: Насколько оптимизирован данный код

Сообщение Paul Siberdt 30 ноя 2017, 12:21

samana писал(а):Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

В том и дело, что-то вроде не нужно, а что-то форсировано убирают из движковых ссылок и нужно самостоятельно кэшировать. Лучше перебдеть, чем недобдеть, чего и всем желаю. :)

samana писал(а):На самом деле, метод magnitude использует тот же самый метод Mathf.Sqrt внутри себя

Естесственно, но надо быть всемирно известным изобретателем велосипедов, чтобы срать в своем коде тригонометрией. :)
Оптимизировать код можно не только под быстродействие, но и под восприятие, удобство и компактность.

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

Re: Насколько оптимизирован данный код

Сообщение IDoNotExist 30 ноя 2017, 12:41

samana писал(а):Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

Обсуждалось, обсуждается, и будет обсуждаться, сегодня не нужно, а завтра уже нужно. А по факту, за неимением актуальных исходников движка, вы не знаете что именно будет происходить в геттере свойства трансформа, как в принципе и в любом другом.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1023
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Насколько оптимизирован данный код

Сообщение Bill Gates 30 ноя 2017, 12:51

IDoNotExist писал(а):
samana писал(а):Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

Обсуждалось, обсуждается, и будет обсуждаться, сегодня не нужно, а завтра уже нужно. А по факту, за неимением актуальных исходников движка, вы не знаете что именно будет происходить в геттере свойства трансформа, как в принципе и в любом другом.


Вот что там происходит:

Синтаксис:
Используется csharp
private Transform m_CachedTransform
public Transform transform
{
  get
  {
    if (m_CachedTransform == null)
      m_CachedTransform = InternalGetTransform();
    return m_CachedTransform;
  }
}
 
Bill Gates
UNIт
 
Сообщения: 84
Зарегистрирован: 16 июл 2015, 11:27

Re: Насколько оптимизирован данный код

Сообщение IDoNotExist 30 ноя 2017, 12:56

Bill Gates писал(а):Вот что там происходит:

Синтаксис:
Используется csharp
private Transform m_CachedTransform
public Transform transform
{
  get
  {
    if (m_CachedTransform == null)
      m_CachedTransform = InternalGetTransform();
    return m_CachedTransform;
  }
}
 

И что? Какая это версия движка? Что внутри функции InternalGetTransform?
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1023
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Насколько оптимизирован данный код

Сообщение Bill Gates 30 ноя 2017, 13:24

IDoNotExist писал(а):
Bill Gates писал(а):Вот что там происходит:

Синтаксис:
Используется csharp
private Transform m_CachedTransform
public Transform transform
{
  get
  {
    if (m_CachedTransform == null)
      m_CachedTransform = InternalGetTransform();
    return m_CachedTransform;
  }
}
 

И что? Какая это версия движка? Что внутри функции InternalGetTransform?


И то. Причем тут InternalGetTransform, когда речь о кэше? Этот метод уже не вызывается при сохраненной ссылке.
Bill Gates
UNIт
 
Сообщения: 84
Зарегистрирован: 16 июл 2015, 11:27

Re: Насколько оптимизирован данный код

Сообщение Paul Siberdt 30 ноя 2017, 13:42

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

Re: Насколько оптимизирован данный код

Сообщение samana 30 ноя 2017, 21:01

Теперь придётся кешировать и трансформ ~x(
Аватара пользователя
samana
Адепт
 
Сообщения: 3793
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: Насколько оптимизирован данный код

Сообщение Cr0c 01 дек 2017, 12:01

samana писал(а):Теперь придётся кешировать и трансформ ~x(

А с каких пор вызов двух методов стал (как минимум) не медленнее обращения к приватному полю? )) Camera.main тоже знатно нагружает, и его кешировать надо.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2493
Зарегистрирован: 19 июн 2015, 13:50

Re: Насколько оптимизирован данный код

Сообщение samana 01 дек 2017, 12:05

Cr0c писал(а):А с каких пор вызов двух методов стал (как минимум) не медленнее обращения к приватному полю? )) Camera.main тоже знатно нагружает, и его кешировать надо.

Да, всё верно, без кэша теперь никуда.
Аватара пользователя
samana
Адепт
 
Сообщения: 3793
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: Насколько оптимизирован данный код

Сообщение Bill Gates 01 дек 2017, 12:07

Cr0c писал(а):
samana писал(а):Теперь придётся кешировать и трансформ ~x(

А с каких пор вызов двух методов стал (как минимум) не медленнее обращения к приватному полю? )) Camera.main тоже знатно нагружает, и его кешировать надо.


В Camera.main в геттере кажрый при обращении перебираются все активные камеры. Там внутри ничего не кэшируется.
Bill Gates
UNIт
 
Сообщения: 84
Зарегистрирован: 16 июл 2015, 11:27


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

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

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