Pull to refresh
0
0
Send message

Трёхмерная графика с нуля. Часть 2: растеризация

Reading time47 min
Views58K
image


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

К сожалению, эта простота имеет свою цену: низкую производительность. Несмотря на то, что существует множество способов оптимизации и параллелизации трассировщиков лучей, они всё равно остаются слишком затратными с точки зрения вычислений для выполнения в реальном времени; и хотя оборудование продолжает развиваться и становится быстрее с каждым годом, в некоторых областях применения необходимы красивые, но в сотни раз быстрее создаваемые изображения уже сегодня. Из всех этих областей применения самыми требовательными являются игры: мы ожидаем рендеринга отличной картинки с частотой не менее 60 кадров в секунду. Трассировщики лучей просто с этим не справятся.

Тогда как это удаётся играм?

Ответ заключается в использовании совершенно иного семейства алгоритмов, которое мы исследуем во второй части статьи. В отличие от трассировки лучей, которая получалась из простых геометрических моделей формирования изображений в человеческом глазе или в камере, сейчас мы будем начинать с другого конца — зададимся вопросом, что мы можем отрисовать на экране, и как отрисовать это как можно быстрее. В результате мы получим совершенно другие алгоритмы, которые создают примерно похожие результаты.
Читать дальше →

Керниган и Пайк были правы: делай что-то одно и делай это хорошо

Level of difficultyEasy
Reading time11 min
Views29K
Роб Пайк и Брайан Керниган

В октябре 1984 года два идеолога опубликовали радикальный манифест… ну, или что-то вроде того.

Легенды computer science Брайан Керниган и Роб Пайк сформулировали в Program Design in the UNIX Environment паттерн архитектуры ПО, за сохранение которого оба боролись долгие годы.

Как и следовало ожидать от манифеста, в нём два этих канадских инженера максимально решительны. Самый резкий удар в статье — это запомнившаяся многим строчка из аннотации:

Старые программы покрываются коркой сомнительных фич.

Суть статьи часто сводят к аббревиатуре DOTADIW, или «Do One Thing And Do It Well» («Делайте что-то одно и делайте это хорошо»). В Unix и его потомках есть множество программ, в которых воплощена эта мантра: ls просто создаёт список файлов, cat просто выводит содержимое файлов, grep просто фильтрует данные, wc просто подсчитывает слова и так далее. У каждой программы есть несколько опций, меняющих её поведение, но не слишком сильно. Например: wc можно сконфигурировать для подсчёта строк или слов, но не для подсчёта количества абзацев или вхождений какой-то фразы.

Мощь Unix, защищаемая Керниганом и Пайком, заключалась в возможности соединения этих простых программ в цепочку для создания сложных поведений. Зачем добавлять сопоставление регулярных выражений в wc, если с этим уже способна справиться grep?
Читать дальше →

Как не ошибиться с конкурентностью в Go

Reading time12 min
Views39K

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


Мы берём Go, начинаем писать конкурентный код. Конечно, ожидаем, что легко сможем обуздать мощь каждого ядра нашего процессора. Так ли это?


Меня зовут Артемий. Этот пост — вольная расшифровка моего доклада с GopherCon Russia. Он появился как попытка дать толчок людям, которые хотят разобраться, как писать хороший, конкурентный код.



Видео с конференции GopherCon Russia

Сам написал, сам погонял: как я написал 3D-гонки «на жигулях» за неделю, полностью с нуля?

Level of difficultyMedium
Reading time28 min
Views38K
image

Статьи про инди-разработку игр — это всегда интересно и занимательно. Но статьи про разработку игр с нуля, без каких-либо игровых движков — ещё интереснее! У меня есть небольшой фетиш, заключающийся в разработке минимально играбельных 3D-демок, которые нормально работали бы даже на железе 20-летней давности. Полтора года назад, в мае 2022 года, я написал демку гоночной игры с очень знакомым всем нам сеттингом — жигули, девятки, десятки, и всё это даже с тюнингом! В этой статье я расскажу вам о разработке 3D-игр практически с нуля: рендерер, менеджер ресурсов, загрузка уровней и граф сцены, 3D-звук, ввод и интеграция физического движка. Интересна подробнейшая хаброторная статья о разработке игры с нуля? Тогда добро пожаловать!
Читать дальше →

Реверс бинарных файлов Golang с использование GHIDRA. Часть 2

Level of difficultyMedium
Reading time7 min
Views3.7K

Это вторая часть нашей серии о реверс-инжиниринге двоичных файлов Go с помощью Ghidra. В предыдущей статье мы обсуждали, как восстановить имена функций в удаленных файлах Go и как помочь Ghidra распознавать и определять строки в этих двоичных файлах. Мы сосредоточились на двоичных файлах ELF, лишь кратко упомянув различия между PE-файлами.

В этой статье будет обсуждаться новая тема - процесс извлечения информации о типе из двоичных файлов Go. Мы также более подробно объясним, как обращаться с файлами Windows PE. И, наконец, мы исследуем различия между различными версиями Go, включая изменения, произошедшие со времени нашей последней публикации в блоге.

Читать далее

Я бы не жил в Сочи в этих местах…

Level of difficultyEasy
Reading time6 min
Views31K

В этот раз спустимся южнее, в городской округ Сочи и Сириус! Найдем места где могут быть проблемы из-за близости к жилью не самых лучших мест для уютной жизни на побережье Черного Моря и в горах у Красной Поляны.

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

Читать далее

Файл дескриптор в Linux с примерами

Reading time14 min
Views122K
Однажды, на одном интервью меня спросили, что ты будешь делать, если обнаружишь неработающий сервис из-за того, что на диске закончилось место?

Конечно же я ответил, что посмотрю, чем занято это место и если возможно, то почищу место.
Тогда интервьюер спросил, а что если на разделе нет свободного места, но и файлов, которые бы занимали все место, ты тоже не видишь?

На это я сказал, что всегда можно посмотреть открытые файл дескрипторы, например командой lsof и понять какое приложение заняло все доступное место, а дальше можно действовать по обстоятельствам, в зависимости от того, нужны ли данные.

Интервьюер прервал меня на последнем слове, дополнив свой вопрос: «Предположим, что данные нам не нужны, это просто дебаг лог, но приложение не работает из-за того, что не может записать дебаг»?

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

«ну хорошо», сказал я, «если мы не можем перезапускать приложение и данные нам не важны, то мы можем просто очистить этот открытый файл через файл дескриптор, даже если мы его не видим в команде ls на файловой системе».

Интервьюер остался доволен, а я нет.

Тогда я подумал, почему человек, проверяющий мои знания, не копает глубже? А что, если данные все-таки важны? Что если мы не можем перезапускать процесс, и при этом этот процесс пишет на файловую систему в раздел, на котором нет свободного места? Что если мы не можем потерять не только уже записанные данные, но и те данные, что этот процесс пишет или пытается записать?
Читать дальше →

Принцип работы async/await в JavaScript

Level of difficultyMedium
Reading time8 min
Views35K


Если вам доводилось работать с JavaScript, то вы наверняка встречались с синтаксисом async/await. Эта функциональность позволяет прописывать асинхронную логику синхронным образом, упрощая тем самым её понимание. Некоторым ветеранам JS известно, что async/await – это просто синтаксический сахар для существующего Promises API. Это означает, что в JS должен быть способ реализации функциональности async/await без использования ключевых слов async и await, хоть и более громоздкий. Именно об этом и пойдёт речь в данной статье.

Видео от автора на ту же тему.
Читать дальше →

Немного о строках в Си, или несколько вариантов оптимизировать неоптимизируемое

Reading time9 min
Views203K
Хабра, привет!

Не так давно у со мной произошел довольно-таки интересный инцидент, в котором был замешан один из преподавателей одного колледжа информатики.

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

У меня был с собой ноутбук с Linux, на котором присутствовал джентльменский набор утилит для разработки на языке Си (gcc, vim, make, valgrind, gdb). Я уже не помню, какую цель мы тогда перед собой поставили, но через пару минут мой оппонент оказался за этим ноутбуком, полностью готовый решать задачу.

И буквально на первых же строках он допустил серьезную ошибку при аллоцировании памяти под… строку.

char *str = (char *)malloc(sizeof(char) * strlen(buffer));

buffer — стековая переменная, в которую заносились данные с клавиатуры.

Я думаю, определенно найдутся люди, которые спросят: «Разве что-то тут может быть не так?».
Поверьте, может.

А что именно — читайте по катом.
Читать дальше →

Создаём свою первую игру на Godot 3.5

Level of difficultyEasy
Reading time8 min
Views14K

Привет, Habr. Сегодня я поиграл в Brotato, давайте сделаем что-то подобное на Godot 3.5

В этой статье начнём разрабатывать свою собственную игру на игровом движке Godot 3.5. Начиная с самых основ. Научим персонажа ходить, создадим оружие и научим его стрелять, создадим сами снаряды для стрельбы, так-же создадим сцену врагов и дадим им базовый ИИ.

Читать далее

Смотрим любое кино мгновенно

Reading time2 min
Views161K

После ареста серверов Moonwalk жить стало в разы труднее. Лично я уже совсем отвык от торрентов. Нужно что-то качать, ждать, чем-то открывать, куда-то кликать, иногда еще и место на диске кончается. Как можно ждать час пока скачается фильм? За час можно жизнь прожить. Пришлось искать решение, которое позволит смотреть кино также просто, как и раньше. Норматив: от идеи посмотреть что-нибудь до начала просмотра - не более минуты.

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

Читать далее

Приборы и материалы для чистки зубов (какая щётка лучше, например)

Level of difficultyEasy
Reading time14 min
Views38K
Вот это южнокорейская зубная щётка. Она в два раза длиннее обычной, потому что корейцы привыкли получать максимум эффекта на каждую потраченную вону. Теперь простой вопрос: может, стоит тоже купить такую, раз она больше? Можно будет чистить зубы быстрее или эффективнее?

image

Нет, не стоит. Лучше купить щётку с большим количеством щетинок, хотя бы 5 тысячами штук.

Такие щётки стоят в Москве 500–900 рублей в аптеках. Вот с ними реально одно движение может быть эквивалентно по эффекту 4–5 движениям обычной щёткой.

Следующий вопрос: а, может, купить электрическую или ультразвуковую? Возможно, но вместе с налётом вы будете счищать часть эмали или греть зубы.

А, может, взять ионную, которая имеет заряд и лучше притягивает всякий мусор? Тоже есть пара исследований.

Давайте разбираться, как лучше чистить зубы с позиции девайсов и здравого смысла.
Читать дальше →

Вероятностные структуры данных и где они обитают

Level of difficultyMedium
Reading time3 min
Views11K

Под этим термином понимаются такие структуры данных или алгоритмы, результатом которых является не детерминированное «да» или «нет», а вероятностные ответы, например, «точно нет» и «возможно». Как правило, такие структуры позволяют существенно сэкономить вычислительные ресурсы в задачах, где допустимо получить примерный ответ.

В этой статье я сделаю обзор таких структур данных и расскажу, какую пользу они могут принести на практике. К базовым вероятностным структурам данных можно отнести фильтр Блума, HyperLogLog и Count-Min Sketch.

Читать далее

Как проводить кодревью?

Level of difficultyMedium
Reading time10 min
Views17K

На работе предложили прочитать доклад. Вуаля! Далее расскажу:

✓ Что такое кодревью?
✓ Зачем нужен?
✓ Что проверяем?
✓ Типовые проблемы & решения
БОНУС!!! Результаты опроса: «Как вы делаете кодревью?»

Читать далее

Недельный геймдев: #125 — 11 июня, 2023

Level of difficultyEasy
Reading time4 min
Views2.7K

Из новостей: Photon Quantum теперь бесплатен во время разработки, Fyrox Engine 0.30, тех. подробности Nau Engine, Apple упростила портирование Windows-игр на macOS — на Mac запустили Cyberpunk 2077 и «Ведьмака 3».

Из интересностей: жизнь и карьера Американа МакГи, разбор уровня Bioshock Infinite, воспоминания и уроки по разработке Baldur’s Gate 2: Shadows of Amn и Throne of Bhaal, анимация сборки набора LEGO в Blender, за кулисами LURE.

Читать далее

Как не наступать на грабли в Go

Reading time10 min
Views103K

Этот пост является версией моей же англоязычной статьи "How to avoid gotchas in Go", но слово gotcha не переводится на русский, поэтому я буду использовать это слово как без перевода, так и немного непрямой вариант — "наступать на грабли".


Gotcha — корректная конструкция системы, программы или языка программирования, которая работает, как описано, но, при этом, контринтуитивна и является причиной ошибок, поскольку её легко использовать неверно.

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


Но один вопрос меня мучал долгое время — почему я сам никогда не делал этих ошибок? Серьезно, самые популярные из них, вроде путаницы с nil-интерфейсом или непонятного результата при append()-е слайса — в моей практике никогда не были проблемой. Каким-то образом мне повезло обойти эти подводные камни с первых дней своей работы с Go. Что же мне помогло?


И ответ оказался довольно прост. Я просто очень вовремя прочёл несколько хороших статей о внутреннем устройстве структур данных в Go и прочих деталях реализации. И этого, вполне поверхностного на самом деле, знания было достаточно, чтобы выработать некоторую интуицию и избегать этих подводных камней.

Читать дальше →

Как Factorio умудряется работать без лагов с таким числом элементов на экране

Level of difficultyEasy
Reading time2 min
Views45K

Немного магии, бережная работа с объектами/компонентами. В посте также рассмотрена ECS и то, почему в Factorio не так просто использовать такой подход.

Читать далее

5 антипаттернов при написании кода на функциональном ЯП

Level of difficultyMedium
Reading time7 min
Views14K

Антипаттерны в функциональных языках программирования могут показаться непривычными в силу отличия этих языков от других их видов, в связи с чем разработчики нередко пишут не самые удачные реализации, склонные к ошибкам и трудные в обслуживании. В статье мы разберём пять наиболее типичных антипаттернов, избегая которые вы сможете создавать более удобный в работе код при меньшем количестве ошибок.
Читать дальше →

Анатомия игры. Кооперативное отступление

Level of difficultyMedium
Reading time17 min
Views3.6K


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

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

Поднимаем Kubernetes с нуля

Level of difficultyMedium
Reading time10 min
Views69K

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

Читать далее

Information

Rating
Does not participate
Registered
Activity