Pull to refresh
11
0
Антон @Nirvano

.Net Developer

Send message
Подарили мне как то такой набор, я его так и не собрал. Ужасная ситуация с этими зубочистками они все то чуть толще то чуть тоньше. Сборка закончилась на том, что я со всей силы одну из зубочисток загнал себе под ноготь. А до этого еще пару деталей сломал, из за того, что зубочисток десять не хотели залазить в отверстие. Набор потом выкинул. Да, и стоит упомянуть еще раз, что ни воска ни всяких наждачек в наборе нет, так что на работе лучше ни кому не дарить.
Тут можно видеть странный синтаксис наследования #[derive(Debug,Eq)]

Не знаю, знаете вы или нет, по этому предложения для меня непонятно. Но это не синтаксис наследования, это автоматическая реализация трейтов Debug и Eq.

Последний пример написан совершенно непонятно.


1) Смотрим на преобразования с кнопкой. Взяли кнопку, преобразовали ее с помощью OnClickAsObservable. На подписке уже странность: мы в место того что бы взять кнопку из параметра, хардкодим передачу в параметр конкретной кнопки на которую мы подписались. Далее еще странне: мы передаем даже не кнопку, а ее ид. А в самом методе опять сравниваем ее с захардкоженой конкретной кнопкой. В чем выгода относительно простой подписки?


2) Почему someView.AnimateButton происходит при нажатии в обработчике события кнопки, а не рядом с someView.RenderCount? Суть же в том, что бы 1 раз написать как должно вью работать при изменении модели, а здесь этот момент совершенно упущен.

На сколько я понял HttpWebRequest для мобильной вресии игры, а WWW для WebGL.
Вы первую часть осознанно игнорируете?

Все команды являются обертками над HttpWebRequest


Stormfall: Rise of Balur — мобильная игра.
Вы видимо не доконца прочитали, в статье написано так:

Все команды являются обертками над HttpWebRequest и выполняются асинхронно (Asynchronous Programming Model). Для WebGL-билда команды являются обертками над Unity WWW классом, который выполняется через корутины. Для коммуникации с сервером данные сериализуются в JSON-формат.
— «У тебя паранойя, за тобой никто не следит»
— «Если у меня паранойя, это еще не значит, что за мной не следят!» (с)
Верно, что спецификация не указывает что будет. Но тем не менее, я настою на том, что практически считывание будет происходить 1 раз и в машинном коде.

x86
Event?.Invoke();
01652D90 mov ecx,dword ptr ds:[400AE28h] // считываем 1 раз
01652D96 test ecx,ecx // проверка на налл
01652D98 jne 01652D9B
01652D9A ret
01652D9B mov eax,dword ptr [ecx+0Ch] // достаем копию
01652D9E mov ecx,dword ptr [ecx+4]
01652DA1 call eax
01652DA3 ret


x64
00007FFE92E44CE0 sub rsp,28h
00007FFE92E44CE4 mov rcx,21B1DE44C20h // считываем 1 раз
00007FFE92E44CEE mov rcx,qword ptr [rcx]
00007FFE92E44CF1 test rcx,rcx // проверка на налл
00007FFE92E44CF4 jne 00007FFE92E44CFB
00007FFE92E44CF6 add rsp,28h
00007FFE92E44CFA ret
00007FFE92E44CFB mov qword ptr [rsp+20h],rcx // достаем копию
00007FFE92E44D00 mov rcx,qword ptr [rcx+8]
00007FFE92E44D04 mov rax,qword ptr [rsp+20h]
00007FFE92E44D09 call qword ptr [rax+18h]
00007FFE92E44D0C nop
00007FFE92E44D0D add rsp,28h
00007FFE92E44D11 ret


И мне совершенно не понятно, почему Вы ко мне прицепились, ведь я всего лишь указал, что это выражение не будет преобразовано в 1 команду. И пояснил, что будет практически, а не теоретически.
Все что вы написали — верно. Только я не понял что значит: «Там все еще хуже». Код в виде:
this.unload?.Invoke();

Развернется в:
IL_0001: ldsfld class [mscorlib]System.Action ThirtyNineEighty.Program::Event // считываем 1 раз
IL_0006: dup // дублируем значение
IL_0007: brtrue.s IL_000c
IL_0009: pop
IL_000a: br.s IL_0012
IL_000c: callvirt instance void [mscorlib]System.Action::Invoke()
IL_0011: nop
IL_0012: br.s IL_0014
IL_0014: ret

Что соответствует тому что я написал. За исключением того, что здесь нет дополнительной локальной переменной. А используется дублирование значения записанного на стек, после считывания поля. Но это уже детали, главное что поле считывается 1 раз, а дальше идет работа с локальным значением.
Таким образом, проверка события на null и вызов его обработчика будут выполнены в виде одной команды, что обеспечит безопасный вызов события.


Там не по этой причине nullRef не упадет. Это код будет преобразован в сохранение поля в локальную переменную, последующей проверкой локальной переменной и её же вызов. Т.к. это локальная переменная то у нас есть гарантия что ее никто не поменяет после проверки, в отличии от поля.
Интересная тема, я тоже написал чат работающий примерно по такой схеме.
Правда без STUN сервера, у меня публичный сервер и его функции выполняет. Связь клиент-сервер сделана по TCP, а клиент-клиент по UDP.
Исходники, кстати, в открытом доступе: GitHub
Фокусы начнутся при плохом интернет соединении и нетерпеливом пользователе, который быстро пошлет 2 команды, а у вас на сервере они соединятся в 1, так как TCP это поток данных, он не разделяет сообщения.

Либо на оборот получение одной команды разобьется на «2 разных сообщения».
Минимальная оболочка нужна была что бы найти правильные нормали сторон проекций многогранников. Далее которые я использую для проверки проекций на пересечение. Так как после поиска проекции (не МВО) я получаю какой то набор точек, и глядя на него непонятно как искать разделяющую ось.

Вообще, метод разделяющей оси в трёхмерном случае предполагает поиск оси, а не плоскости =) Если существует разделяющая плоскость, то проекция двух многогранников на нормаль к ней даст непересекающиеся отрезки (проверка непересечения в одномерном случае сильно проще). Количество претендентов на нормаль такой плоскости конечно: это нормали граней исходных многогранников + попарные векторные произведения сторон одного на сторону другого. Наконец, существуют эвристики, как найти эту нормаль эффективно.

Как я понял вы предлагаете увеличить кол-во плоскостей на которых следует проверять пересечения (Решение проблемы с тетраэдрами). При этом отказаться от промежуточного действия — построения проекций на плоскость. Вместо этого строить проекции сразу на нормаль проверяемой плоскости.

Единственное не понял что значит попарные векторные произведения сторон одного на сторону другого.

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

Метод, конечно, очень интересно называется)
Алгоритм работает только с выпуклыми моделями. Тор к ним не относится. Что бы работать с не выпуклыми фигурами их можно разбивать на выпуклые.
Как я ответил на комментарий выше, не могу себе представить случай, когда фигуры пересекаются, и все их стороны — нет.
Если они просто соприкасаются вершинами, то да, я не считаю это пересечением.
Не могу себе представить случая когда фигуры пересекаются, и при этом не пересекают сторон. А если стороны пересекаются, то мы найдем пересечение.
Беру первую попавшуюся. Я строю плоскость по нормали, а потом меняю направление Y и Z осей. (Z в данном случае нормаль плоскости)

    // Берем перпендикулярную плоскость.
    plane.swapZY();
Сработает, ведь мы строим проекции на плоскость, нормаль которой перпендикулярна нормали стороны. Смотрите на картинку с кубами, ситуация в принципе аналогичная.
IV оставлять константой не правильно. Он нужен для того что бы одинаковые данные зашифрованные тем же ключем выглядели по разному. А у вас тут уязвимость.
1

Information

Rating
Does not participate
Location
Харьков, Харьковская обл., Украина
Date of birth
Registered
Activity