Понедельник, 25 Ноября 2024, 13:04

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Есть ли способ сократить эти строки кода
alexsilentДата: Воскресенье, 05 Июля 2020, 06:40 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Всё ещё перехожу с JS на C# в Unity.
Есть ли возможность как-то сократить эти длинные строки, которые на JS выглядели,
намного короче и более читабельнее или это максимум, что можно сделать в C#?!

Unity Script (JS)
Код
transform.localPosition.z = initPos.z;
transform.localScale.x = variable;

C#
Код
transform.localPosition = new Vector3(transform.localPosition.x,transform.localPosition.y,initPos.z);
transform.localScale = new Vector3(variable,transform.localScale.y,transform.localScale.z);


PS У меня просто глаза разбегаются, когда смотрю на тот же самый код, но намного длинее по символам.


Сообщение отредактировал alexsilent - Воскресенье, 05 Июля 2020, 06:42
pixeyeДата: Воскресенье, 05 Июля 2020, 07:55 | Сообщение # 2
Red Winter Software
Сейчас нет на сайте
Не рекомендую
Код
public static class HelperTransform
  {
    public static void SetZ(this Transform transform, float z)
    {
      var position = transform.position;
      position.z         = z;
      transform.position = position;
    }
  }


Дальше везде в коде можешь писать
Код

transform.SetZ(10);


Тебе надо кое-что понять :) в "JS" тебе подтирали зад и одевали слюнявчик, я бы лучше поинтересовался не тем почему запись вдруг стала длинее а почему оно так устроено. Ты на C# можешь и короче чем на JS сделать если тебе это так надо :)

Вообще форма ниже отвратна
Код
transform.localPosition = new Vector3(transform.localPosition.x,transform.localPosition.y,initPos.z);


Юнити это С++ движок ( все еще пока что ) - и все трансформы и прочая хрень что ты видишь - это просто мостики для работы с движком.
Итак в твоем коде ты говоришь следующие :
1) обратись через свойство трансформа на С++ сторону и засунуть в трансформ значение позиции которое я отдам далее
2) создай новую структуру вектора через конструктор ( +1 лишний метод )
3) вытащи мне с C++ Vector3 позиции трансформа и отдай оттуда X и назначь в вектор из шага 2
4) вытащи мне с С++ Vector3 позиции трансформа и отдай оттуда Y и назначь в вектор из шага 2
5) назначь свое значение Z в вектор из шага 2

Или
Код

var position = transform.position;
position.z         = initPos.z;
transform.position = position;


1) обратись через свойство трансформа на С++ сторону и вытащи вектор позиции
2) измени значение Z у вектора
3) обратись через свойство трансформа на С++ сторону и засунуть в трансформ значение позиции

Велика ли разница? ~20-30% быстрее последний вариант. Стоил ли запариваться? Зависит от контекста твоей игры и целей. Если у тебя например сборка под мобилы через Il2CPP то обращения по методам сами по себе не оч дешевые то твоя форма записи ужасна не только формой но и содержанием :)


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Воскресенье, 05 Июля 2020, 08:24
drcrackДата: Воскресенье, 05 Июля 2020, 10:08 | Сообщение # 3
старожил
Сейчас нет на сайте
pixeye, я все же не отказался бы от возможности писать как в примере на JS
все-таки производительность важна только в узких местах, а чистый и понятный для понимания код - абсолютно всегда
SetZ как ни крути не дотягивает по читаемости до z =
GMasstaДата: Воскресенье, 05 Июля 2020, 10:25 | Сообщение # 4
частый гость
Сейчас нет на сайте
Цитата drcrack ()
все-таки производительность важна только в узких местах

А потом появляются 8ми битные игры, которые тупят на современном железе.
Добавишь что-то новое, и ищи заветные миллисекунды. Если собираешься писать что-то более менее хорошее, производительность должна стоять на первом месте.

SetZ(transform, 10); выглядит намного читабельные чем transform.localPosition.z = initPos.z;


Make games, not war
Посмотри мои игры для мобилок, влепи лукаса!
Тут я делаю игры на Unity


Сообщение отредактировал GMassta - Воскресенье, 05 Июля 2020, 10:26
pixeyeДата: Воскресенье, 05 Июля 2020, 11:34 | Сообщение # 5
Red Winter Software
Сейчас нет на сайте
Цитата drcrack ()
pixeye, я все же не отказался бы от возможности писать как в примере на JS
все-таки производительность важна только в узких местах, а чистый и понятный для понимания код - абсолютно всегда
SetZ как ни крути не дотягивает по читаемости до z =


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


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

alexsilentДата: Воскресенье, 05 Июля 2020, 14:06 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата pixeye ()
Вообще форма ниже отвратна


pixeye, ну я тут полностью согласен, что мой код не очень, другой вопрос как оптимизировать?

Ведь, тот твой код, я так понял, тоже не самый лучший или я просто не понял эту фразу:
Цитата pixeye ()
Не рекомендую


Сообщение отредактировал alexsilent - Воскресенье, 05 Июля 2020, 14:40
drcrackДата: Воскресенье, 05 Июля 2020, 14:58 | Сообщение # 7
старожил
Сейчас нет на сайте
Цитата
А потом появляются 8ми битные игры, которые тупят на современном железе.
Добавишь что-то новое, и ищи заветные миллисекунды. Если собираешься писать что-то более менее хорошее, производительность должна стоять на первом месте.

С такой логикой надо не Unity использовать, а писать свой движок. Желательно на ассемблере для максимальной производительности.

Цитата
SetZ(transform, 10); выглядит намного читабельные чем transform.localPosition.z = initPos.z;

Изменение значения чего-либо с помощью метода никогда не выглядит читабельнее чем с использованием оператора присваивания


Сообщение отредактировал drcrack - Воскресенье, 05 Июля 2020, 14:58
alexsilentДата: Воскресенье, 05 Июля 2020, 15:27 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата pixeye ()
Не рекомендую

public static class HelperTransform
{
public static void SetZ(this Transform transform, float z)
{
var position = transform.position;
position.z = z;
transform.position = position;
}
}


Может я не правильно понял, и это относилось не к коду ниже, но да ладно)

Придётся писать 4 новых функции, чтобы работать с отдельными осями:
Код
SetX(transform, 1);
SetY(transform, 1);
SetZ(transform, 1);
TurnZ(transform, 1); // для поворота по оси Z
IlyaKosДата: Воскресенье, 05 Июля 2020, 16:43 | Сообщение # 9
участник
Сейчас нет на сайте
Цитата alexsilent ()
Придётся писать 4 новых функции, чтобы работать с отдельными осями:
Код
SetX(transform, 1);
SetY(transform, 1);
SetZ(transform, 1);
TurnZ(transform, 1); // для поворота по оси Z


Можешь вот так)

Код

void Set (x, y, z, bool setX, bool setY, bool setZ)
{
if (!setX && !setY && !setZ) return;

Vector3 position = transform.position;

if (setX) position.x = x;
if (setY) position.y = y;
if (setZ) position.z = z;

transform.position = position;
}

и Set (1, 1, 1, true, true, false)


Мне кажется, это будет шустрее, нежели ты будешь 3 метода вызывать.
:)


Сообщение отредактировал IlyaKos - Воскресенье, 05 Июля 2020, 16:50
VostruginДата: Воскресенье, 05 Июля 2020, 16:51 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
IlyaKos, тогда уже:

Код
void SetPosition (this Transform transform, float? x = null, float? y = null, float? z = null)
{
var position = transform.position;

position.x = x ?? position.x;
position.y = y ?? position.y;
position.z = z ?? position.z;

transform.position = position;
}

transform.SetPosition(y: 20);
или
transform.SetPosition(10, 20);


Но я бы не советовал этим пользоваться, лучше всё таки привыкать писать, в данном случае, без экстеншенов.




GMasstaДата: Воскресенье, 05 Июля 2020, 17:28 | Сообщение # 11
частый гость
Сейчас нет на сайте
Цитата drcrack ()
С такой логикой надо не Unity использовать, а писать свой движок. Желательно на ассемблере для максимальной производительности.

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

Цитата alexsilent ()
Придётся писать 4 новых функции, чтобы работать с отдельными осями:

-Можно использовать функцию transform.Translate();
-Можно заранее создать вектор private Vector3 position и с помощью метода Set передавать ему параметры. затем transform.position = position;


Make games, not war
Посмотри мои игры для мобилок, влепи лукаса!
Тут я делаю игры на Unity


Сообщение отредактировал GMassta - Воскресенье, 05 Июля 2020, 17:28
alexsilentДата: Понедельник, 06 Июля 2020, 10:43 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
pixeye, Спасибо большое за этот код, потестил и выглядит круто, особенно круто то что
в эту static функцию можно добавлять локальные переменные.
Код

public static class HelperTransform
  {
    public static void SetZ(this Transform transform, float z)
    {
      var position = transform.position;
      position.z         = z;
      transform.position = position;
    }
  }


только я не понял вот эту фразу
Код
this Transform transform
this почему-то стоит в странном месте, в инициализации,
я попытался сделать свою такую функцию и не получилось.
Код

public static bool isEmpty(this string string) { //CHECK EMPTY STRING
  if (this==null || this=="") return true;
  return false;
    }


Сообщение отредактировал alexsilent - Понедельник, 06 Июля 2020, 10:55
Storm54Дата: Понедельник, 06 Июля 2020, 10:44 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Цитата Vostrugin ()
(this Transform transform, float? x = null, float? y = null, float? z = null)


Это вообще самый затратный вариант по производительности. На каждый аргумент (x, y и z) будет вызываться боксинг и анбоксинг.
drcrackДата: Понедельник, 06 Июля 2020, 11:26 | Сообщение # 14
старожил
Сейчас нет на сайте
Цитата
я попытался сделать свою такую функцию и не получилось.

ты не сможешь ее сделать т.к. не сможешь вызвать метод у null
кроме того ты назвал переменную "string" что также невозможно т.к. это имя типа (возможно с @ но тсу это знать рано:D )
кароче просто используй string.IsNullOrEmpty для того что ты хотел сделать


Сообщение отредактировал drcrack - Понедельник, 06 Июля 2020, 14:00
VostruginДата: Понедельник, 06 Июля 2020, 11:27 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
Storm54, уже сверху говорили, что хочешь быстро - пиши как обычно. Хочешь удобно - нужно чем-то жертвовать. Сколько должно быть операций, чтобы боксинг/анбоксинг существенно повлиял на производительность? :)



drcrackДата: Понедельник, 06 Июля 2020, 11:34 | Сообщение # 16
старожил
Сейчас нет на сайте
Цитата
Это вообще самый затратный вариант по производительности. На каждый аргумент (x, y и z) будет вызываться боксинг и анбоксинг.

Я чет не совсем понял на каком этапе тут появляется боксинг да еще и анбоксинг?
VostruginДата: Понедельник, 06 Июля 2020, 11:41 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
И да, drcrack прав. Смотри.



XakepДата: Понедельник, 06 Июля 2020, 14:39 | Сообщение # 18
めちゃくちゃちゃ
Сейчас нет на сайте
Уверен, что большинство из тех, кто говорит про производительность, даже профилировщиком пользоваться не умеют. Чтобы что-то оптимизировать надо сначала иметь представление о том, что происходит в системе и сколько это времени тратит.

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


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

Цитата drcrack ()
Я чет не совсем понял на каком этапе тут появляется боксинг да еще и анбоксинг?

я думаю боксин `float?` без боксинга примитив не может быть null.

Добавлено (06 Июля 2020, 14:41)
---------------------------------------------

Цитата Vostrugin ()
И да, drcrack прав. Смотри.

и видим что есть боксинг:
Код
[System.Private.CoreLib]System.Nullable`1<int32>

без боксинга тип будет просто int32
GMasstaДата: Понедельник, 06 Июля 2020, 14:52 | Сообщение # 19
частый гость
Сейчас нет на сайте
Цитата Xakep ()
Даже у опытных игроделов не всегда может получиться написать более производительный движок чем уже существющий

Ну видимо существующий написали боги... Если на OpenGL вывести пару атласов, делая 2д игру по производительности уступит юньке, которая в догонку к паре текстурок захватит еще пару десятков библиотек, которые тебе даром не нужны, то у тебя явно проблемы с :
Цитата GMassta ()
(Если конечно ты понимаешь, что ты делаешь)


Make games, not war
Посмотри мои игры для мобилок, влепи лукаса!
Тут я делаю игры на Unity
drcrackДата: Понедельник, 06 Июля 2020, 15:20 | Сообщение # 20
старожил
Сейчас нет на сайте
Цитата
и видим что есть боксинг:

Nullable<T> это структура с 2 value type полями, нет там боксинга


Сообщение отредактировал drcrack - Понедельник, 06 Июля 2020, 15:21
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг