Флейм
GameDev.ru / Флейм / Форум / Давайте поговорим о Unity (60 стр)

Давайте поговорим о Unity (60 стр)

Страницы: 156 57 58 59 60 61 Следующая »
alexzzzzПостоялецwww27 мар. 20183:23#885
А всё равно в ILSpy поиск и навигация удобнее.
alexzzzzПостоялецwww10 апр. 201820:50#886
Два любопытных новых пакета для Unity 2018.1

Официальный инкрементальный компилятор C# 7.2
Unity.Mathematics

Packages/manifest.json:

{
  "dependencies": {
    "com.unity.incrementalcompiler": "0.0.32",
    "com.unity.mathematics": "0.0.8"
  },
  "registry": "https://staging-packages.unity.com"
}

Правка: 10 апр. 2018 21:02

DenadanПостоялецwww11 апр. 201812:02#887
алилуя
WISHMASTER35Участникwww11 апр. 201812:41#888
alexzzzz
> Два любопытных новых пакета для Unity 2018.1
Это очень хорошо, но как по мне, лучше сначала убрали бы их прикол с GetComponent и заглушкой.

Похоже обнаружил баг в C#.

F( 0, 0 ); // компилятор не знает какой метод вызвать, хотя по-моему это очевидно
private static void F(object obj, int a) {}
private static void F(int obj, int? a) {}

Правка: 11 апр. 2018 13:06

alexzzzzПостоялецwww11 апр. 201816:01#889
В обоих случаях требуется по одному неявному преобразованию аргумента типа int во что-то другое.
Foo(0, 0);

void Foo(object a, int b)
void Foo(int a, int? b)
void Foo(byte a, int b)
void Foo(int a, byte b)

Все четыре подходят одинаково.

EugeneУчастникwww11 апр. 201816:10#890
alexzzzz
А почему object может инициализироваться нулям? Даже кресты уходят от 0 вместо null.
alexzzzzПостоялецwww11 апр. 201816:16#891
Все типы в C#, кроме указателей, наследуются от object. Это не object инициализируется нулём, это значение ноль боксится: в куче создаётся объект типа int, хранящий значение 0, а переменная типа object инициализируется ссылкой на этот объект.
object o = 100;  // 100 тут ничем не отличается от нуля.
int i = (int)o; // i = 100

Правка: 11 апр. 2018 16:20

WISHMASTER35Участникwww11 апр. 201819:29#892
alexzzzz
> В обоих случаях требуется по одному неявному преобразованию аргумента
Да, точно. Это для меня очевидно, потому, что для меня преобразование в nullable как бы менее явное.
alexzzzzПостоялецwww13 апр. 201817:23#893
Кто-нибудь разобрался и может объяснить, что-такое и как работает burst compiler?

Вот есть компилятор C#, он переводит C# в IL.
IL2CPP-компилятор переводит IL в машинный код во время билда игры.
JIT-компилятор Mono переводит IL в машинный код по ходу исполнения кода на конечном компьютере.

Burst-компилятор вроде бы переводит некоторые порции IL в машинный код более эффективно, чем JIT/AOT/IL2CPP, но посмотрев все видео на эту тему, я так и не понял, что он из себя представляет и в какой момент времени он включается в работу. Это переписанный/модифицированный JIT-компилятор, или это "плагин" к стандартному JIT-компилятору, который перехватывает компиляцию некоторых участков кода, или это такой же "плагин", только к IL2CPP, или что это вообще такое?

Правка: 13 апр. 2018 17:26

Stranger087Постоялецwww13 апр. 201823:46#894
alexzzzz
Насколько я понял, это для их новой ECS архитектуры, оптимизация идёт для SIMD прибамбасов разных процессоров.
WISHMASTER35Участникwww14 апр. 201816:00#895
Если в коде задать углы:
transform.localEulerAngles = new Vector3( 91, 0, 0 );
То в итоге эти углы будут: 89,00005; 180; 180. Видимо это из-за кваиернионов.

Но в инспекторе будет: 91, 0, 0. Как так?

Правка: 14 апр. 2018 16:01

CriDosПользовательwww17 апр. 201812:45#896
https://habrahabr.ru/company/pvs-studio/blog/353640 - Проверяем исходный C#-код Unity
Я думал они используют анализаторы...
Всё же солидная контора.
Жуть:)
Интересно, в плюшном ядре такой же бардак?
Хотя, я и в анриловских исходниках находил странные вещи)
WISHMASTER35Участникwww18 апр. 201813:32#897
Еще один случай когда компилятор пытается вызвать неправильный метод.
Компилятор пытается вызвать F<T>(T arg) и конечно же у него это не получается. Хотя F(object arg) он вполне мог бы вызвать.
MonoBehaviour arg = null;
F( arg );

private static void F(object arg) {
}
//private static void F(MonoBehaviour arg) {
//}
private static void F<T>(T arg) where T : System.IDisposable {
}

Правка: 18 апр. 2018 13:52

alexzzzzПостоялецwww18 апр. 201816:51#898
Возможно (не факт), это результат того, что дженерики появились в C# только во второй версии и нужно было оставить совместимость с первой. Логика такая: сначала ищем наиболее подходящий по аргументам метод, а потом, если это обобщённый метод, проверяем, удовлетворяет ли аргумент типа, с которым мы его будем вызывать, указанным ограничениям.

Если вызывать метод с аргументом типа MonoBehaviour, то среди трёх вариантов

void Foo(object arg)
void Foo(MonoBehaviour arg)
void Foo<T>(T arg) where T : IDisposable
наиболее близкий к MonoBehaviour второй. Он и выбирается, т.к. у остальных типы параметров менее конкретные.

Если второй метод закомментировать, то из первого и третьего выбирается третий, потому что T теоретически может быть MonoBehaviour, а object — это всего лишь родительский класс, а не сам MonoBehaviour. И только затем проверяется, удовлетворяет ли у выбранного  метода фактический аргумент типа указанным ограничениям. Т.к. не удовлетворяет, выдаётся ошибка, что не удовлетворяет.

Ограничения не являются частью сигнатуры метода — Эрик Липперт
Оригинал на английском с комментариями и ответами на них

PS
Так вроде бы логичнее

void Foo(object arg)
void Foo(MonoBehaviour arg)
void Foo(IDisposable arg)

Правка: 18 апр. 2018 17:34

alexzzzzПостоялецwww18 апр. 201822:29#899
Что-то хак с переключением скина на тёмный перестал работать во всех установленных версиях Unity одновременно. Скин просто самопроизвольно вернулся на светлый, хотя экзешники остались пропатченными, их никто не трогал.
Страницы: 156 57 58 59 60 61 Следующая »

/ Форум / Флейм / Разработка игр

2001—2018 © GameDev.ru — Разработка игр