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

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

Страницы: 157 58 59 60 61 62 Следующая »
#885

А всё равно в ILSpy поиск и навигация удобнее.

27 мар. 2018

#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)

#887

алилуя

11 апр. 2018

#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)

#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)

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

11 апр. 2018

#890

alexzzzz
А почему object может инициализироваться нулям? Даже кресты уходят от 0 вместо null.

11 апр. 2018

#891

Все типы в C#, кроме указателей, наследуются от object. Это не object инициализируется нулём, это значение ноль боксится: в куче создаётся объект типа int, хранящий значение 0, а переменная типа object инициализируется ссылкой на этот объект.

object o = 100;  // 100 тут ничем не отличается от нуля.
int i = (int)o; // i = 100

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

#892

alexzzzz
> В обоих случаях требуется по одному неявному преобразованию аргумента
Да, точно. Это для меня очевидно, потому, что для меня преобразование в nullable как бы менее явное.

11 апр. 2018

#893

Кто-нибудь разобрался и может объяснить, что-такое и как работает burst compiler?

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

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

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

#894

alexzzzz
Насколько я понял, это для их новой ECS архитектуры, оптимизация идёт для SIMD прибамбасов разных процессоров.

13 апр. 2018

#895

Если в коде задать углы:

transform.localEulerAngles = new Vector3( 91, 0, 0 );
То в итоге эти углы будут: 89,00005; 180; 180. Видимо это из-за кваиернионов.

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

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

#896

https://habrahabr.ru/company/pvs-studio/blog/353640 - Проверяем исходный C#-код Unity
Я думал они используют анализаторы...
Всё же солидная контора.
Жуть:)
Интересно, в плюшном ядре такой же бардак?
Хотя, я и в анриловских исходниках находил странные вещи)

17 апр. 2018

#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)

#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)

#899

Что-то хак с переключением скина на тёмный перестал работать во всех установленных версиях Unity одновременно. Скин просто самопроизвольно вернулся на светлый, хотя экзешники остались пропатченными, их никто не трогал.

18 апр. 2018

Страницы: 157 58 59 60 61 62 Следующая »
ФлеймФорумРазработка игр