Telegram Web
Пишите non-alloc методы.

Мы часто пишем подобные методы:

List<int> GetItems() {
var items = new List<int>();
...
return items;
}


В этом методе мы просто собираем элементы и возвращаем.
При этом создаем список, создание которого мы не можем запретить извне. Для этого лучше писать таким образом:

void GetItems(List<int> items) {
...
}


Таким образом контроль над списком может быть таким:

var list = GetFromPool();
GetItems(list);
...
ReturnToPool(list);


#gc #code #allocations
👍27🔥6🗿3👎2
Ссылка на запись последнего евента про мультиплеер:
https://youtu.be/nImCndj3F6U

Все, кто хотят меня поддержать, могут это сделать тут:
Евро: NL19 BUNQ 2070 8912 32
Доллары: GB45 TCCL 0414 0434 4305 90

#event #record
🔥34👍10❤‍🔥81🌚1
В субботу будет тема про джобы, будем разбираться как работают, что там внутри и всякое такое :) Приходите, будет интересно!

https://unsafecsharp.timepad.ru/event/2474487/

#event
🔥29👌3🤓2
Floodfill

Алгоритм заливки. На самом деле ничего нового в нем нет, мы выбираем элемент массива, читаем из него данные и рекурсивно (https://www.tgoop.com/unsafecsharp/115) обращаемся к элементу сверху, снизу, справа и слева. Таким образом мы обойдем все элементы, но нам нужно обойти лишь те, которые имеют те же данные, что и наш начальный элемент.

Пример:
77777
77555
75557
75577
77775


Если мы возьмем центральную 5, то результат заливки числом 6 будет таким:

77777
77666
76667
76677
77775

Алгоритм используется в различных областях. Например, в графах поиска пути (https://www.tgoop.com/unsafecsharp/69) заливка используется для формирования «закрытых областей», чтобы можно было рано выйти при построении пути, если дойти до точки невозможно (области начальной точки не совпадают с конечной).

#floodfill #algorithms
👍9🔥1
Ленивый if

Условие всегда ленивое и хочет побыстрее выйти.
Если v1 будет true, то что там дальше его не будет интересовать:

if (v1 == true || v2 == true) {...}

Таким образом, если у нас есть такой код:

var v1 = CalcV1();
var v2 = CalcV2();
if (v1 == true || v2 == true) {...}

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

if (CalcV1() == true || CalcV2() == true) {...}

Естественнно нужно понимать, что CalcV2 вызываться не будет, если CalcV1 вернет true, поэтому не нужно на это расчитывать. Но я надеюсь, что вы это знаете :)

#code #performance #basics
👍27🥱13🔥8
💾 Хоткей дня
Ctrl/Cmd + Shift + P
Нажать на кнопку паузы. Довольно часто мышку использовать не получается (например, если нужно отловить состояние до потери фокуса).

#hotkey #editor
👍22🥱6
Catmull rom - это такая кривая, для построения которой нужно знать 4 точки. Особенность заключается в том, что кривая будет проходить через все 4 точки.

На практике мы такое часто используем, т.к. для построения, например, Безье требуются тангенты, расчет которых иногда затруднителен.

#splines #curve #math #catmullrom
🔥15👍4
У нас на интервью был вот такой вопрос одним из последних. Он показывает именно желание думать, если человек не знает на него ответ, конечно.

У вас есть односвязный список и указатель на один из его элементов (не последний), как удалить этот элемент из списка, оставив список целостным? Возможно ли решение за О(1)?

#interview
👍18👎4👌2
Довольно долго эта картинка висела у нас в офисе на стене. И да, в целом так оно и было;)

#meme
😁27👍9🤪3
У Vector2/Vector3/Vector4 переопределен оператор ==.
Он сравнивает не точное значение, а приблизительное, с учетом погрешности:

var v = new Vector3(0f, 0f, 0f);
var v2 = Vector3.one - Vector3.one;

v == v2


#basics #floats
👍29🥱8
Запись с последнего урока по Unity Jobs:

https://www.youtube.com/watch?v=Abp_9x8pX-E

Все, кто хотят меня поддержать, могут это сделать тут:
Евро: NL19 BUNQ 2070 8912 32
Доллары: GB45 TCCL 0414 0434 4305 90

#event #record
🔥51👍42👏1
Следующий евент пройдет в субботу в 16:00 по мск. Будем обсуждать вёрстку, как верстаются интерфейсы, на что обращать внимание.
Регайтесь, будет интересно :)

https://unsafecsharp.timepad.ru/event/2482334/

#event
🔥342👍2🤔1
В чем отличие Generic.List<> от массива?

Такой вопрос мы задавали на собесах. Он помогал нам отсеить и закончить собес на словах "ну лист - это такая штука, где элементы ссылаются друг на друга". Но если человек проходил эту часть успешно (да, такие бывали), то в основном большинстве мы приходили к следующим утверждениям:
- List<> это такой массив, но с более удобными методами;
- При расширении листа - увеличивается массив x2, а данные копируются;

Но был еще дополнительный вопрос:

Vector3[] arr = ; // 1 элемент или больше
List<Vector3> list = ; // 1 элемент или больше
arr[0].x = 123f;
list[0].x = 123f;

Где сломается такой код?
- Нигде
- arr[0].x
- list[0].x
- В обоих случаях

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

#interview
👍21👎2🥱21🔥1
Попадает ли точка в радиус?

Довольно простой вопрос, который решается банальной проверкой (v2.sqrMagnitude <= radius * radius). Мы такой вопрос часто задаем на собесах, но не только для того, чтобы выяснить считает ли человек через квадрат радиуса, а скорее для того, чтобы задать второй вопрос: "а в эллипс?". И вот на этом вопросе люди начинают сами себя закапывать. Кто-то придумывает несуществующие правила и теоремы, кто-то говорит, что мол "да я это не помню, там высшая математика, кому это вообще надо", ну а кто-то предлагает решение.

А самое интересное, что решение довольно простое, которое не требует никаких знаний и формул:
Изменяем Y проверяемой точки на фактор соотношения Rx к Ry, а дальше проверяем на попадание в радиус Rx. То есть мы вытягиваем эллипс таким образом, чтобы он стал кругом и считаем уже относительно круга.

#basics #ellipse #math #lifehack
🔥17🆒5👍21
2025/10/23 06:44:03
Back to Top
HTML Embed Code: