Для написания эффективных и корректных многопоточных приложений очень важно знать какие существуют механизмы синхронизации памяти между потоками исполнения, какие гарантии предоставляют элементы многопоточного программирования, такие как мьютекс, join потока и другие. Особенно это касается модели памяти C++, которая была создана сложной таковой, чтобы обеспечивать оптимальный многопоточный код под множество архитектур процессоров. Кстати, язык программирования Rust, будучи построенным на LLVM, использует модель памяти такую же, как в C++. Поэтому материал в этой статье будет полезен программистам на обоих языках. Но все примеры будут на языке C++. Я буду рассказывать про std::atomic, std::memory_order и на каких трех слонах стоят атомики.
User
DirectX raytracing — всплываем
В 2018 году компания Microsoft анонсировала raytracing API (DXR) как часть DirectX 12. Подход рейтрейсинга заставляет полностью переосмыслить способ ренедринга трехмерных сцен, смещающий классический подход растеризации на второй план. АПИ модернизируются, разрабатываются более производительные GPU, разработчики пакетов визуализации пробуют новые возможности. Однако даже на наиболее производительных видеокартах мощности хватает на генерирование всего нескольких лучей на пиксель для обеспечения стабильной частоты смены кадров. К тому же, производительность во многом зависит от сложности материалов и сцены. Но уже сегодня продвинутые алгоритмы шумоподавления и аккумуляции результата освещенности позволяют достичь высокой степени реализма. Все это мотивирует к экспериментам в данной области.
Помоги компилятору помочь тебе
Предисловие
Современные компиляторы обладают огромным количеством диагностик. И удивительно, что очень малая их часть включена по умолчанию.
Огромное количество претензий, которые предъявляют к языку C++ в этих ваших интернетах, — про сложность, небезопасность, стрельбу по ногам и т.п., — относятся как раз к тем случаям, когда люди просто не знают о том, что можно решить эти проблемы лёгким движением пальцев по клавиатуре.
Давайте же исправим эту вопиющую несправедливость, и прольём свет истины на возможности компилятора по предотвращению ошибок.
Вражеский ИИ: преследование игрока без Navigation2D и поиска пути A*
Чтобы решить эту проблему, можно использовать встроенные в Godot ноды Navigation2D или AStar (вот туториал GDQuest, посвящённый обоим нодам). Но в Helms of Fury мы использовали другой способ, который отлично подошёл нашей игре, и мы хотим поделиться им в этом туториале. Вот как это выглядит:

Приступаем к работе
Будем считать, что вы создаёте врагов как объекты KinematicBody2D и используете для управления их состояниями конечный автомат. Не знаете, что такое конечный автомат? Мне нравится эта статья с объяснением конечных автоматов, а также способов их использования. Вот ещё одна статья о реализации простых конечных автоматов в Godot.
Сказ о том, как я автоматизировал квартиру с помощью Node-RED. Часть II

Сверхсовременные иммутабельные структуры данных

Иммутабельные структуры данных не меняют своих значений. Чтобы что-то с ними сделать, нужно создавать новые значения. Старые же значения остаются на прежнем месте, поэтому их можно без проблем и блокировок читать из разных потоков. В итоге ресурсы можно совместно использовать более рационально и упорядоченно, ведь старые и новые значения могут использовать общие данные. Благодаря этому их куда быстрей сравнить между собой и компактно хранить историю операций с возможностью отмены. Все это отлично ложится на многопоточные и интерактивные системы: такие структуры данных упрощают архитектуру десктопных приложений и позволяют сервисам лучше масштабироваться. Иммутабельные структуры — секрет успеха Clojure и Scala, и даже сообщество JavaScript теперь пользуется их преимуществами, ведь у них есть библиотека Immutable.js, написанная в недрах компании Facebook.
Под катом — видео и перевод доклада Juan Puente с конференции C++ Russia 2019 Moscow. Хуан рассказывает про Immer — библиотеку иммутабельных структур для C++. В посте:
- архитектурные преимущества иммутабельности;
- создание эффективного персистентного векторного типа на основе RRB-деревьев;
- разбор архитектуры на примере простого текстового редактора.
do {Yoga} while (болит спина)
Вступление
Это обыкновенная история про самого обыкновенного IT-шника, которая, тем не менее, может быть интересна людям различных профессий. Статья не про то, как я добился успеха в той или иной IT-дисциплине, будь то программирование, администрирование или дизайн. Моя история про то, как я угробил свою спину за 10 лет работы в IT, и как потом ее вылечил.

Цель моего текста — не популяризация йоги как образа жизни, мышления или философии, это всего лишь мой личный опыт, который, я надеюсь, может стать кому-то очень полезен. Также хочу заметить, что статья не призывает вас к самолечению или к отрицанию традиционной медицины, но призывает к самоорганизации и более внимательному отношению к себе, то есть НЕигнорированию проблем и их корней.
Перед написанием текста я изучил публикации моих коллег по цеху, например, вот эту, и не хочу повторяться, но, на мой взгляд, моя статья имеет несколько другое направление, хотя и рассказывает о том же предмете. Плюс, я надеюсь, что кого-то может зацепить или, говоря научно, мотивировать, тот эмоциональный фон, на подъеме которого я эту статью сочиняю. То, что описано ниже, пожалуй, самое значительное мое достижение на данном этапе моей жизни. Я только сейчас это осознал и просто не могу не рассказать об этом окружающим.
С чего все началось и чем закончилось
Итак, все началось давным давно и довольно банально, как и у большинства моих соотечественников. А именно: 10 лет сидячий жизни в школе = проблемы с осанкой, + 7 лет сидячей жизни в университете = проблемы с осанкой (уже видимо начались непосредственно проблемы с позвоночником) + 10 лет сидячей работы в IT = проблемы с осанкой (уже совершенно точно серьезные проблемы с позвоночником). Я периодически занимался какими-то физическими упражнениями типа игры в футбол, катания на сноуборде или нерегулярных походов на тхэквандо, но, насколько мне кажется теперь, это скорее негативно, чем позитивно отражалось на состоянии моей спины.
Вентиляция с рекуперацией в квартире. Без воздуховодов и СМС

Это
Итак, всё началось с духоты. Точнее, с утепления квартиры слоем экструзионного пенополистирола по всему периметру (панельная 9-этажка родом из 80-х, с кучей сквозящих углов). В результате чего, квартира стала условно герметичной и вопрос свежего воздуха встал в полный рост.
Как я чуть не выкинул 150к на ветер или история установки приточной вентиляции в квартире
Как я пришел к покупке приточной вентиляции для квартиры с готовым ремонтом. Как купил ее за 150к и чуть не потратил деньги зря. Статья будет полезна тем, кто планирует купить очиститель воздуха, бризер или приточку.
Неформальные отношения в команде: зачем и как ими управлять

Много лет назад я пришёл на должность разработчика в одну компанию и вскоре стал свидетелем необычной сцены. Тимлид соседнего отдела подозвал своего подчинённого посреди рабочего дня и довольно громко и развязно сказал ему: «Слышь, на вот тебе денег. Сгоняй в магазин, купи вискаря и закуски».
Я подумал: «Да ладно! Странно всё это...». Но ситуация повторялась ещё несколько раз. Проработав в компании какое-то время, я понял, что подобное поведение там было нормой. Одни команды дружили против других, процветала подковёрщина, а топ-менеджмент абсолютно никак не реагировал на это. Я ушёл оттуда, несмотря на то, что и задачи были интересные, и условия неплохие. Но моральный климат был невыносим.
Так считал не только я: сейчас этой компании уже нет. Но в тот момент я понял, насколько важно работать с неформальными отношениями, насколько существенное влияние они могут оказать на бизнес в целом. Причём работать с ними должны прежде всего линейные руководители, а не HR-менеджеры или штатные психологи, потому что именно руководители ежедневно находятся в контакте со своими подчинёнными.
Но тимлиды в IT-сфере, как правило, сами выросли из разработчиков, инженеров и не имеют специального образования в областях психологии и методологии управления. Из-за этого зачастую менеджеры понимают свои задачи довольно узко: решать проблемы бизнеса, выполнять план и т. п. А зачем нянчиться со взрослыми людьми, им непонятно.
В последние десять лет я занимаюсь тем, что руковожу командами разработки, семь из них — в Badoo. Эта статья написана по мотивам моего выступления на Saint TeamLead Conf 2019: в ней я попытаюсь объяснить, как и зачем нужно работать над неформальными отношениями в коллективе.
Тяжела ли работа программиста — взгляд с точки зрения психофизиологии
— Работа программистом-разработчиком — тяжелый труд, сравнимый с валкой леса топором. И проблематика данного труда сильно недооценена в общественном сознании.Сейчас я обосную этот тезис с научной точки зрения.

Король разработки

Я знаю одного человека — он хороший разработчик, но полнейшая скотина. Когда он начинает говорить, хочется набить ему морду, заткнуть как угодно, лишь бы не слышать, насколько он прав. И эту сумасбродную самоуверенную сволочь еще кто-то слушает, ему поддакивают. Видимо, люди любят сволочей, и им стоит как следует поразмыслить почему.
Полбеды, если он просто шутит, вроде, «разработка приносит мне столько бабок, что поработаю два часа и найму трех нищих врачей стричь мне лужайку». Хуже, когда говорит серьезно: «Ты зря стал писать код. Вся ирония этой индустрии в том, что став хорошим разработчиком, ты обретаешь навыки, которые приводят тебя к выводу, что разработчиком быть плохо».
Недавно у него дела пошли в гору, и там где нормальные люди радуются и расцветают, этот парень, кажется, совсем съехал с катушек. Мы с ним как следует выпили, и он рассказал мне много искреннего дерьма, которое, честно, я бы хотел расслышать обратно.
Создание сеток шестиугольников

Сетки из шестиугольников (гексагональные сетки) используются в некоторых играх, но они не так просты и распространены, как сетки прямоугольников. Я коллекционирую ресурсы о сетках шестиугольников уже почти 20 лет, и написал это руководство по самым элегантным подходам, реализуемым в простейшем коде. В статье часто используются руководства Чарльза Фу (Charles Fu) и Кларка Вербрюгге (Clark Verbrugge). Я опишу различные способы создания сеток шестиугольников, их взаимосвязь, а также самые общие алгоритмы. Многие части этой статьи интерактивны: выбор типа сетки изменяет соответствующие схемы, код и тексты. (Прим. пер.: это относится только к оригиналу, советую его изучить. В переводе вся информация оригинала сохранена, но без интерактивности.).
Коллапс волновой функции: алгоритм, вдохновлённый квантовой механикой

Алгоритм Wave Function Collapse генерирует битовые изображения, локально подобные входному битовому изображению.
Локальное подобие означает, что
- (C1) Каждый паттерн NxN пикселей в выходных данных должен хотя бы раз встречаться во входных данных.
- (Слабое условие C2) Распределение паттернов NxN во входных данных должно быть подобным распределению паттернов NxN в значительно большом количестве наборов выходных данных. Другими словами, вероятность встречи определённого паттерна в выходных данных должна быть близка к плотности таких паттернов во входных данных.
Введение в октодеревья

Что такое октодеревья? Если вам совершенно неизвестно это понятие, то рекомендую прочитать статью в Википедии (это займёт около пяти минут). Она даёт достаточное представление, но едва ли её будет достаточно, чтобы понять, для чего они используются и как их реализовать.
В этой статье я постараюсь рассказать обо всех этапах, необходимых для создания структуры данных октодеревьев, на примере объяснения концепций, иллюстраций и кода. Также я опишу свои решения, которые принимал на каждом из этапов. Не думайте, что эта статья будет единственно верным руководством к реализации октодеревьев, но она должна дать вам хороший фундамент и её можно использовать для справки.
Приемы при проектировании архитектуры игр
Для примеров будет использоваться популярный движок Unity3D. Рассматриваются подходы, применимые в больших играх. Написано из моего личного опыта и из того, как я это понимаю. Конечно, где-то я могу быть не прав, где-то можно лучше сделать. Я тоже все еще в процессе набирания опыта и набивания новых шишек.
В публикации рассматриваются следующие темы:
- Наследование VS компоненты
- Сложные иерархии классов юнитов, предметов и прочего
- Машины состояний, деревья поведений
- Абстракции игровых объектов
- Упрощение доступа к другим компонентам в объекте, сцене
- Сложные составные игровые объекты
- Характеристики объектов в игре
- Модификаторы (баффы/дебаффы)
- Сериализация данных
Senior Engineer в поисках работы. Как я прошел 20 собеседований с HR и что я об этом думаю
Этой статьей я хочу начать цикл рассказов о том, как я на протяжении нескольких месяцев проходил собеседования в примерно 20-и разных компаниях на разные должности. Тут будут мои мысли о рынке труда, процессе найма, советы а так же несколько самых интересных историй. Цикл будет состоять из нескольких частей — HR собеседования, технические собеседования, финальные собеседования. Итак, первая часть.
Немного о себе. Программирую со школьного возраста, за деньги работаю 10 с хвостиком лет. Работал админом, программистом, тимлидом, РМ-ом, линейным менеджером. Выполнял обязанности SRE/DevOps, архитекта, HR, офис-менеджера, эникейщика.
Работал в кровавом энтерпрайзе, в стартапе, в аутсорсе. В основном занимался формошлёпством и крудами, имел дело с Java и бэкендом. За последние несколько лет пересел на фуллстек микс из Java, Ruby/RoR, Python, Node.js.
На собеседованиях я позиционировал себя как Senior и выше разработчика, поэтому все ниженаписанное будет актуально для такого уровня и выше. На других позициях опыт может отличаться.
Всего я прошел примерно 20 собеседований с рекрутерами: половина из которых были из агенств и половина — штатные рекрутеры/HR компаний. Так что, могу сказать что некоторая статистика у меня есть.
Случайное распределение урона в RPG

Для вычисления урона от атаки в таких настольных ролевых играх, как Dungeons & Dragons, используются броски урона. Это логично для игры, чей процесс основан на бросках кубиков. Во многих компьютерных RPG урон и другие атрибуты (сила, очки магии, ловкость и т.д.) вычисляются по похожей системе.
Обычно сначала пишется код вызова
random()
, а затем результаты корректируются и подстраиваются под нужное игре поведение. В этой статье будут рассмотрены три темы:- Простые корректировки — среднее значение и дисперсия
- Добавление асимметрии — отбрасывание результатов или добавление критических попаданий
- Полная свобода в настройке случайных чисел, неограниченная возможностями кубиков
Глобальное освещение с использованием трассировки вокселей конусами


Рендер сцены без глобального освещения, и с использованием VCT:
Цвет: от шестнадцатеричных кодов до глаза

Почему мы воспринимаем
background-color: #9B51E0
как этот конкретный фиолетовый цвет?
Долгое время я думал, что знаю ответ на этот вопрос. Но хорошенько поразмыслив, осознал значительные пробелы в своих знаниях.
Information
- Rating
- 3,883-rd
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity