Страница 1 из 1

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

СообщениеДобавлено: 29 ноя 2017, 23:29
Demak
И так, возник вопрос по поводу использования данного кода:
Синтаксис:
Используется 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 раз, либо я не правильно код написал. И есть ли какой нибудь метод получше для ограничения движения моих мобов ?

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

СообщениеДобавлено: 30 ноя 2017, 00:24
Paul Siberdt
Данный код оптимизирован чуть менее, чем нисколько.
Синтаксис:
Используется 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);
}

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

СообщениеДобавлено: 30 ноя 2017, 08:26
samana
Paul Siberdt писал(а):Данный код оптимизирован чуть менее, чем нисколько.

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

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

На самом деле, метод magnitude использует тот же самый метод Mathf.Sqrt внутри себя (https://github.com/MattRix/UnityDecompi ... Vector3.cs), поэтому быстрее точно не станет в плане производительности. И раз такое дело, то быстрее должно быть
Синтаксис:
Используется csharp
t.position.sqrMagnitude > 3f * 3f

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

СообщениеДобавлено: 30 ноя 2017, 12:21
Paul Siberdt
samana писал(а):Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

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

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

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

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

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

СообщениеДобавлено: 30 ноя 2017, 12:41
IDoNotExist
samana писал(а):Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

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

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

СообщениеДобавлено: 30 ноя 2017, 12:51
Bill Gates
IDoNotExist писал(а):
samana писал(а):Так уже столько раз обсуждалось, что кешировать трансформ вроде и не нужно.

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


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

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

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

СообщениеДобавлено: 30 ноя 2017, 12:56
IDoNotExist
Bill Gates писал(а):Вот что там происходит:

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

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

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

СообщениеДобавлено: 30 ноя 2017, 13:24
Bill Gates
IDoNotExist писал(а):
Bill Gates писал(а):Вот что там происходит:

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

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


И то. Причем тут InternalGetTransform, когда речь о кэше? Этот метод уже не вызывается при сохраненной ссылке.

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

СообщениеДобавлено: 30 ноя 2017, 13:42
Paul Siberdt
Однако, у нас-таки остается один бестолковый буль, кадр за кадром, цикл за циклом, обращение за обращением. Спасибо, я лучше сам.

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

СообщениеДобавлено: 30 ноя 2017, 21:01
samana
Теперь придётся кешировать и трансформ ~x(

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

СообщениеДобавлено: 01 дек 2017, 12:01
Cr0c
samana писал(а):Теперь придётся кешировать и трансформ ~x(

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

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

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

Да, всё верно, без кэша теперь никуда.

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

СообщениеДобавлено: 01 дек 2017, 12:07
Bill Gates
Cr0c писал(а):
samana писал(а):Теперь придётся кешировать и трансформ ~x(

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


В Camera.main в геттере кажрый при обращении перебираются все активные камеры. Там внутри ничего не кэшируется.