Обновить
1959
207.7

Переводчик-фрилансер

Отправить сообщение

5 способов нарисовать обводку

Уровень сложностиПростой
Время на прочтение13 мин
Просмотры7.8K

Рендеринг обводки (контуров) — это техника, часто используемая в играх или из эстетических, или из геймплейных соображений. Например, в игре Sable контуры применяются для создания стиля, напоминающего комиксы, а в The Last of Us контуры используются для выделения врагов, когда игрок переходит в режим скрытности.

В этом посте мы расскажем о пяти способах рендеринга контура вокруг объекта.

Читать далее

Избавляемся от UB в memcpy

Уровень сложностиСредний
Время на прочтение5 мин
Просмотры5.7K

Неопределённое поведение (undefined behavior, UB) в языке программирования C — постоянный источник жарких споров между программистами. С одной стороны, UB может быть важным для оптимизаций компилятора. С другой стороны, оно упрощает появление багов, которые приводят к проблемам безопасности.

Хорошая новость: N3322 был принят для C2y, что позволит устранить неопределённое поведение из этого конкретного участка языка C и сделать всё показанное ниже чётко определённым:

memcpy(NULL, NULL, 0);
memcmp(NULL, NULL, 0);
(int *)NULL + 0;
(int *)NULL - 0;
(int *)NULL - (int *)NULL;

Читать далее

Порталы: как устроен расчёт видимости в Quake, часть 2

Уровень сложностиПростой
Время на прочтение16 мин
Просмотры2.5K

Часть 1

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

«Это просто задача отсечения»

Свет внезапно выключается. Вы сидите в огромном конференц-зале. Кто-то включает проектор. На экране сам Майкл Абраш! Похоже, это знаменитый доклад Quake Postmortem с GDC 1997.

Он говорит о порталах.

Мы берём плоскости отсечения, ограничивающие максимальный объём видимого, и отсекаем их по всё более дальним порталам, пока они не пропадут.

Читать далее

Оптимизация 3D-текстурирования для мобильных игр при помощи градиентов

Уровень сложностиПростой
Время на прочтение8 мин
Просмотры4K

Градиентное текстурирование — это методика оптимизации 3D-текстурирования, в первую очередь предназначенная для мобильных видеоигр. В ней используются текстурные карты низкого разрешения и градиентные цвета, позволяющие снизить ресурсную нагрузку на игровые без ущерба качеству графики. Благодаря применению градиентов в низкополигональных 3D-моделях симулируются такие эффекты, как освещение, тени и глубина, позволяя избавиться от необходимости в текстурах высокого разрешения, потребляющих больше ресурсов.

Эта методика обеспечивает эффективный баланс между производительностью и визуальным качеством, оптимизирует время загрузки и улучшает игровой процесс. Кроме того, она позволяет гибко менять цветовые палитры и может адаптироваться под разные 3D-модели, снижая размеры файлов и оптимизируя использование памяти.

Читать далее

Анализ DeepSeek R1-Zero и R1

Уровень сложностиСредний
Время на прочтение7 мин
Просмотры4K

Цель ARC Prize Foundation — определять и измерять потенциал идей, делающих вклад в создание AGI. Для этого мы стремимся создавать самую надёжную международную среду для инноваций.

Пока у нас нет сильного искусственного интеллекта (AGI), а инновации по-прежнему ограничены: увеличение масштабов чистого предварительного обучения LLM — ошибочный путь, хоть он и остаётся доминирующим в отрасли ИИ и в глазах широкой публики.

Такие нарративы важны, потому что они влияют на экономическую активность, например, на инвестиции, темы исследований, финансирование, геополитику и так далее. Например, в 2023-2024 годах в новые LLM-стартапы инвестировали примерно 20 миллиардов долларов. Для сравнения: в новые AGI-стартапы инвестировали всего около 200 миллионов долларов.

Мы создали в июне премию ARC 2024, чтобы привлечь внимание к ограничениям масштабирования LLM и повысить популярность полезного бенчмарка ARC-AGI-1 при движении в новом направлении, требующем от ИИ-систем адаптации к новым, неизвестным им задачам, а не полагаться только на запоминание.

Читать далее

День 4-й проекта объёмом «закончу до обеда»

Уровень сложностиПростой
Время на прочтение9 мин
Просмотры4.2K

TLDR: ИИ — это не ваш помощник, а разработчик-джун, имитирующий профессионализм. Доверяйте ему на свой страх и риск.

Я уже четыре дня занимаюсь своим хобби-проектом. Я был уверен, что реализую его. У меня был хороший план и большой интерес к проекту. Позвольте мне познакомить вас с Deskthang. Это настольный уведомлятор. Во время работы я хочу оставлять свой телефон в другой комнате и получать только важные уведомления. В случае сбоя конвейера развёртывания я хочу, чтобы устройство на моём столе загоралось красным и показывало мне логотип gitlab. Я не хочу, чтобы мне приходилось проверять телефон, почту или другие источники, которые могут отвлечь от работы.

Читать далее

Порталы: как устроен расчёт видимости в Quake

Уровень сложностиПростой
Время на прочтение10 мин
Просмотры7.1K

Вы когда-нибудь хотели узнать, как работала предварительно вычисленная видимость в Quake? Я хотел, поэтому написал программу vis.py, воссоздающую этот алгоритм на Python. В этой статье представлена вся информация, необходимая для понимания vis, — инструмента, применявшегося в Quake, Half-Life и играх на Source Engine.

В процессе разработки Quake возникла проблема перерисовки (overdraw), то есть многократной записи одного и того же пикселя во время рендеринга кадра. Видимым остаётся лишь последний цвет, а все предыдущие записи оказываются лишней тратой ресурсов. Это плохо, если в вашей игре используется программный рендеринг, и так выжимающий последние соки из компьютера середины 90-х годов.

Как снизить объём перерисовки? Давайте начнём с высокоуровневого обзора возможных решений.

Читать далее

Убивают ли LLM сайт StackOverflow?

Уровень сложностиПростой
Время на прочтение4 мин
Просмотры5.4K

После выпуска ChatGPT в ноябре 2022 года количество задаваемых на StackOverflow вопросов стало быстро снижаться, и в 2025 году падение продолжается с угрожающей скоростью. Свежие данные, представленные разработчиком ПО Теодором Смитом из 1% лучших контрибьюторов StackOverflow, показывают, насколько плоха ситуация.

Читать далее

Почему государственные британские сервисы не работают по ночам

Уровень сложностиПростой
Время на прочтение4 мин
Просмотры6.7K

Примерно раз в месяц в соцсетях появляется вопрос о том, почему цифровой сервис DVLA на ночь отключается. Почему в 21-м веке достаточно новый онлайн-сервис работает только в определённые часы суток? Чтобы каждый раз не отвечать на этот вопрос, я решил написать пост, на который смогу давать ссылку в будущем.

Кроме того, это отличный пример, демонстрирующий, почему превращение государственных сервисов в нативно цифровые может быть достаточно сложным процессом. Если только вы не стартап, вам редко приходится вести разработку с нуля и приходится считаться с легаси-технологиями и старыми практиками работы. Преобразование государственных сервисов — не такая простая задача, как пытаются представить технологические компании и миллиардеры.

Читать далее

Шейдер береговой линии для Unity

Уровень сложностиПростой
Время на прочтение9 мин
Просмотры4.2K

В своей работе я больше склоняюсь к стилизованной картинке, однако полученный в статье результат можно будет адаптировать и для реалистичного стиля/PBR. В этом посте мы поговорим о шейдере воды, относящемся к береговой линии, не касаясь материала песка и других деталей воды, например, преломления и каустики (о них можно прочитать в Water Shader Breakdown или по другим ссылкам в разделе Water на странице Resources). Впрочем, шейдер выполняет и смешение прозрачности/альфы, чтобы затенить материал под ним для симуляции мокрого песка.

Мы поговорим о двух способах наложения волн в сцене: при помощи текстуры глубин и ручных UV. Ниже я перечислю замечания, плюсы и минусы каждого способа. В последующих разделах мы поработаем над ними по очереди.

Читать далее

Ошибки инженеров в больших кодовых базах

Уровень сложностиПростой
Время на прочтение6 мин
Просмотры9.6K

Работа с крупными устоявшимися кодовыми базами — один из самых сложных навыков, осваиваемых разработчиком ПО. Его невозможно практиковать заранее (нет, опенсорс не даст вам этого опыта). Личные проекты не научат этому, потому что они по определению маленькие и реализуются с нуля. Нужно уточнить, что когда я говорю «крупные устоявшиеся кодовые базы», то имею в виду следующее:

- От одного до десятка миллионов строк кода (допустим, примерно пять миллионов)

- Примерно от 100 до 1000 разработчиков, работающих над одной кодовой базой

- Первая работающая версия кодовой базы была выпущена как минимум десять лет назад

Я уже больше десятка лет работают с такими кодовыми базами. В статье я поделюсь теми знаниями, которые бы мне очень пригодилось в начале.

Читать далее

Создание прототипов игр на LÖVE

Уровень сложностиПростой
Время на прочтение7 мин
Просмотры4.4K

Одна из моих целей на 2025 год — создание завершённой игры. Завершённой, то есть её можно будет купить в Steam или App Store за $2,99 или около того. Я уже делал маленькие игры, но завершение и выпуск игры, вероятно, будет самым крупным моим проектом (если не считать блога).

В зимние каникулы я какое-то время писал прототипы игр на LÖVE — фреймворке для создания 2D-игр на Lua. Таким образом я хотел изучить инструменты разработки игр, подходящие к моему набору навыков, и определить свои сильные стороны, чтобы в 2025 году распоряжаться временем эффективно.

До работы над этими прототипами я написал примерно двести строк кода на Lua, но у меня не возникло никаких проблем в освоении нужного мне синтаксиса.

Оказалось, что API LÖVE простой и мощный. Одно из преимуществ использования фреймворка вместо игрового движка в том, что я могу показать вам полный пример всего в десяти строках кода (в отличие от игрового движка, где пришлось бы определять объекты сцены, прикреплять скрипты и так далее).

Читать далее

Шахматный движок на 84688 регулярных выражениях

Уровень сложностиСредний
Время на прочтение21 мин
Просмотры17K

В праздничные выходные мне пришло в голову, что я давно не занимался чем-то бессмысленным. Представляю вашем вниманию... Regex Chess: набор из 84688 регулярных выражений, которые при выполнении по порядку генерируют ход (валидный, то есть не совсем ужасный) для переданного в качестве входных данных состояния шахматной доски. [Прим. переводчика: здесь в оригинале статьи есть интерактивный виджет, позволяющий сыграть с движком.]

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

let regex_list = [/* очень длинный список регулярных выражений */]
let board = "rnbqkbnr / pppppppp / 8 / 8 / 8 / 8 / PPPPPPPP / RNBQKBNR w KQkq - 0 1";
for (regex of regex_list) {
board = re.replace(regex.pattern, regex.target)
}
display(board)

Прочитав этот пост, вы поймёте (надеюсь), как возможна эта последовательность регулярных* выражений, а также что делают конкретные регулярные выражения.

* Снобы могут заявить что-то типа «Вы сказали, что будете использовать регулярные выражения, но они не регулярные!" Но меня это не волнует.

Как всегда, код проекта выложен на GitHub.

Читать далее

Как линейная алгебра помогла мне в разработке интерактивного редактора диаграмм

Уровень сложностиПростой
Время на прочтение9 мин
Просмотры12K

Ах, матрицы — одна из тех базовых концепций линейной алгебры, с которыми мы встречались в школе. Несмотря на их важность, мне за мою карьеру ни разу не доводилось с ними работать, и из-за этого я забыл, насколько они мощны и универсальны. Подходящий момент, чтобы вспомнить их, настал, когда я работал над моим интерактивным редактором диаграмм Schemio. В этой статье я расскажу, как использовал матрицы для решения сложных задач.

Читать далее

Как устроен эффект ядерного взрыва в Fallout 4

Уровень сложностиПростой
Время на прочтение7 мин
Просмотры20K

Давайте исследуем одну загадку: как Bethesda смогла сделать такие грибообразные облака ядерных взрывов?

Читать далее

Бенчмарки JavaScript — это полный хаос

Уровень сложностиПростой
Время на прочтение7 мин
Просмотры3.8K

Я ненавижу код бенчмаркинга, как и любой другой человек. Гораздо веселее притвориться, что твоё кэширование значения увеличило производительность на 1000%, чем проверять это тестами. Увы, бенчмаркинг JavaScript по-прежнему необходим, особенно потому, что JavaScript используется (когда не должен?) во всё более чувствительных к производительности приложениях. К сожалению, из-за множества базовых архитектурных решений языка, JavaScript никак не упрощает выполнение бенчмаркинга.

Читать далее

Деление беззнаковых 8-битных чисел

Уровень сложностиСредний
Время на прочтение13 мин
Просмотры6.6K

Деление — достаточно затратная операция. Например, на CPU Cannon Lake задержки 32-битного деления находятся в интервале 10-15 тактов, а на Zen4 — 9-14 тактов. Задержки 32-битного умножения на обоих CPU составляют 3-4 такта.

Ни в одном из популярных ISA SIMD (SSE, AVX, AVX-512, ARM Neon, ARM SVE) нет целочисленного деления, оно есть только в RISC-V Vector Extension. Однако во всех этих ISA есть деление с плавающей запятой.

В этой статье мы представим два подхода к реализации SIMD-деления 8-битных беззнаковых чисел.

Читать далее

Программа, которая падала на первой команде

Время на прочтение9 мин
Просмотры13K

Нашего клиента донимали отчёты о вылетах, показывавшие, что его программа ломается на самой первой команде.

Я открыл один из дампов вылета, он оказался настолько странным, что отладчик даже не мог понять, что пошло не так.

Читать далее

Миф о RAM

Уровень сложностиСредний
Время на прочтение5 мин
Просмотры19K

Миф о RAM — это верование о том, что память современного компьютера напоминает идеальную память с произвольным доступом. Кэш люди считают оптимизацией для малых данных: если они умещаются в L2, то будут обрабатываться быстрее; если нет, то тут уж ничего не поделаешь.

Вероятнее всего, что самым быстрым разбиения данных будет такой код (я использую в качестве псевдокода Python; можете представить, что я пишу это на вашем любимом низкоуровневом языке):

groups = [[] for _ in range(n_groups)]

for element in elements:

groups[element.group].append(element)

Он и в самом деле линеен (то есть асимптотически оптимален), и мы всё равно должны выполнять доступ к произвольным индексам, так что кэш здесь нам ни в чём бы не помог.

В реальности, когда количество групп высоко, такой код не задействует большую часть производительности, а некоторые асимптотически более медленные алгоритмы могут выполнять сегментирование гораздо быстрее. В основном они применяются в базах данных на диске, но, как ни странно, полезны даже в случае данных в RAM.

Читать далее

Пишем скрипты и маленькие программы на Java

Уровень сложностиПростой
Время на прочтение10 мин
Просмотры14K

У Java есть много возможностей, благодаря которым она хорошо подходит для больших и долгих проектов. Но я обнаружил, что она на удивление неплохо справляется и с небольшими задачами. Благодаря новым возможности языка это становится ещё удобнее. Киллер-фичи — это типизация во время компиляции и отличная поддержка инструментов.

В моей работе писателя и преподавателя есть множество повторяющихся задач, например, перемещение файлов и скучное преобразование их содержимого. Берясь за автоматизацию рутины, я обычно смотрю на задачу и думаю: «Никаких проблем, напишу шелл-скрипт». А затем происходит неизбежное: с появлением новых особых случаев скрипт превращается в ужасный хаос bash-кода. И я начинаю жалеть, что не написал его на настоящем языке программирования.

«Очевидный» выбор для этой задачи — Python, но Python API не так уж чудесен, а из-за динамической типизации мне понадобится слишком много времени на отладку. Поэтому я попробовал Java. Я знаю её API назубок; по крайней мере, то, что касается коллекций, файлов, regex и так далее. Java статистически типизируемая, поэтому я защищён от глупостей ещё на ранних этапах кодинга. А её среды разработки просто потрясающие.

Что вы говорите? Действительно ли я хочу создавать отдельный файл POM и иерархию src/main/java для каждого скрипта? Хм.

Нет, я этого не делаю. К счастью, современная Java и её инструменты этого не требуют. Давайте разбираться!

Читать далее

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность