Pull to refresh
0
Денис @c0de4unread⁠-⁠only

Junior C++ Developer

Send message

Структуры данных для программистов игр: bulk data

Reading time19 min
Views17K
image

Любому программисту будет полезно понимание различных структур данных и способов анализа их производительности. Но на практике мне ни разу не пригождались АВЛ-деревья, красно-чёрные деревья, префиксные деревья, списки с пропусками, и т.д. Некоторые структуры данных я использую только для одного конкретного алгоритма и ни для чего больше (например, кучи для реализации очереди с приоритетом в алгоритме поиска пути A*).

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

  • Общие массивы данных (Bulk data) — способ эффективного хранения большого количества объектов.
  • Слабые ссылки (Weak reference) (или дескрипторы (handle)) — способ обращения к объектам в bulk data без сбоев программы в случае, если объект удалён.
  • Индексы — способ быстрого доступа к отдельным подмножествам в bulk data.
  • Массивы массивов — способ хранения объектов bulk data с динамическими размерами.

Я посвящу несколько статей тому, как я обычно реализую все эти структуры. Давайте начнём с простейшей и самой полезной — bulk data.
Читать дальше →
Total votes 28: ↑28 and ↓0+28
Comments14

Создаем на C++ выразительные умные указатели для удаленной памяти

Reading time10 min
Views10K
Привет, Хабр!

Сегодня мы публикуем перевод интересного исследования о работе с памятью и указателями в C++. Материал немного академический, но явно будет небезынтересен читателям книг Галовица и Уильямса.

Следите за рекламой!
Читать дальше →
Total votes 22: ↑22 and ↓0+22
Comments1

Перегрузка в C++. Часть III. Перегрузка операторов new/delete

Reading time11 min
Views22K

Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специальных. Эта статья посвящена перегрузке операторов new/delete. Это третья статья из серии, первая, посвященная перегрузке функций и шаблонов, находится здесь, вторая, посвященная перегрузке операторов, находится здесь. Статья завершает цикл из трех статей, посвященный перегрузке в C++.

Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments14

std::shared_ptr и кастомный аллокатор

Reading time6 min
Views19K

Кто из нас не любит рефакторинг? Думаю, что неоднократно каждый из нас при рефакторинге старого кода открывал для себя что-то новое или вспоминал что-то важное, но хорошо забытое. Совсем недавно, несколько освежив свои знания работы std::shared_ptr при использовании пользовательского аллокатора, я решил что больше забывать их не стоит. Всё что удалось освежилось собрал в этой статье.

Читать дальше →
Total votes 19: ↑18 and ↓1+17
Comments9

Альтернативные аллокаторы памяти

Reading time13 min
Views88K
Написал Стивен Тови в 2:29 утра по программированию (шутка юмора Google Translate)
Вступление от себя: эта заметка, прорекламированная Алёной C++, предназначена в основном разработчикам игр для консолей, но будет, наверное, полезна и всем, кому приходится сталкиваться с экстремальным аллоцированием динамической памяти. Возможно, любители посравнивать управление памятью в C++ и Java тоже найдут над чем задуматься.

Оригинал с небезынтересной дискуссией в комментариях: altdevblogaday.org/2011/02/12/alternatives-to-malloc-and-new


Обязательная вступительная басня

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

Сейчас объясню, почему...
Total votes 75: ↑72 and ↓3+69
Comments59

Менеджмент памяти или как реже стрелять себе в ногу

Reading time20 min
Views28K

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


Зачем это необходимо? Программа — это последовательность команд по обработке данных (в самом общем случае). Эти данные необходимо некоторым образом хранить, загружать, передавать и т.д. Все эти операции не происходят мгновенно, следовательно, они непосредственно влияют на скорость работы вашего конечного приложения. Умение оптимально управлять данными в процессе работы позволит вам создавать весьма нетривиальные и очень требовательные к ресурсам программы.


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



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

Читать дальше →
Total votes 63: ↑62 and ↓1+61
Comments49

Как настроить Continuous Deployment для своего проекта: личный опыт

Reading time3 min
Views17K


Перевели для вас статью Юлиуса Минмо о настройке непрерывного развертывания (Continuous Deployment) для своего проекта. Автоматизация позволяет сэкономить кучу времени и сил. Статья будет полезна, в первую очередь, начинающим программистам.

Непрерывное развертывание — отличная штука. Один раз коммитим проект и далее все происходит в автоматическом режиме, наблюдение за этим процессом просто гипнотизирует. В этой статье я покажу, как можно все настроить для домашнего проекта.
Читать дальше →
Total votes 35: ↑28 and ↓7+21
Comments8

Доклады с весенней конференции С++ Russia 2018

Reading time16 min
Views14K

С 19 по 21 апреля в Санкт-Петербурге прошла конференция С++ Russia 2018. Из года в год организация и проведение становится на уровень выше, что не может не радовать. Спасибо бессменному организатору С++ Russia Сергею Платонову за его вклад в развитие этого направления.
Читать дальше →
Total votes 49: ↑47 and ↓2+45
Comments3
Помните бесконечное «Давайте Dust 2!» в каждом CS-чате? Реиграбельность — важнейшая черта для онлайн-шутеров. Игрокам раз за разом приходится возвращаться на одни и те же локации, поэтому можно смело сказать, что работа левел-дизайнера не менее важна для проекта, чем код, на котором он написан. Нужно продумать баланс карты во всех ее точках; помнить о разных тактиках игроков и целых команд; расставить достаточное количество укрытий; не забыть о «снайперах»; провести ряд внутренних и внешних тестов; учесть пожелания игроков касательно сеттинга и визуала. И думаем, не только нам интересно, как можно решить все эти задачи.
Подробности – под катом
Total votes 45: ↑45 and ↓0+45
Comments20

Реализация быстрых 2D-теней в Unity с помощью 1D shadow mapping

Reading time7 min
Views12K

Введение


Недавно я приступил к реализации системы 2D-теней в Unity, которую можно было бы использовать в настоящей игре. Как известно профессиональным разработчикам, есть большая разница между тем, чего можно достичь в техническом демо и тем, что применимо для интеграции в полную игру, где реализованная возможность является лишь одной из множества. Влияние на ЦП, видеопроцессор и память должны находиться в балансе со всем остальным в игре. На практике у разных проектов возникают различные ограничения, но я решил создать систему, занимающую не больше пары миллисекунд времени обработки и не больше нескольких мегабайт в памяти.

Таким ограничением я отбрасывал множество уже существовавших способов расчёта теней, которые мне удалось найти. Популярной была пара техник. В одной применялась реализуемая на ЦП трассировка лучей, определяющая границы силуэтов блокирующей свет геометрии. В другой все препятствия для света рендерились в текстуру, а затем для неё выполнялся алгоритм типа ray-stepping с несколькими проходами для создания карты теней. Эти техники обычно используются не более чем с парой источников света и точно не позволили бы мне работать с десятками источников света в соответствии с выбранными мной ограничениями.
Читать дальше →
Total votes 23: ↑22 and ↓1+21
Comments6

Как написать собственный игровой движок на C++

Reading time11 min
Views127K

Перевод статьи Джеффа Прешинга (Jeff Preshing) How to Write Your Own C++ Game Engine.


Как написать собственный игровой движок на C++


В последнее время я занят тем, что пишу игровой движок на C++. Я пользуюсь им для создания небольшой мобильной игры Hop Out. Вот ролик, записанный с моего iPhone 6. (Можете включить звук!)



Hop Out — та игра, в которую мне хочется играть самому: ретро-аркада с мультяшной 3D-графикой. Цель игры — перекрасить каждую из платформ, как в Q*Bert.


Hop Out всё ещё в разработке, но движок, который приводит её в действие, начинает принимать зрелые очертания, так что я решил поделиться здесь несколькими советами о разработке движка.


С чего бы кому-то хотеть написать игровой движок? Возможных причин много:

Total votes 39: ↑39 and ↓0+39
Comments17

Learn OpenGL. Урок 4.4 — Отсечение граней

Reading time5 min
Views17K
OGL3

Отсечение граней


Попробуйте представить куб и подсчитать максимальное число его граней, которое вы можете увидеть с любого направления. Если ваше воображение не излишне живое, то, верней всего, вы придете к выводу, что это число 3. Из какой бы точки или с какого бы направления вы не смотрели на куб, вы никогда не сможете увидеть больше чем три грани. Так к чему же тратить вычислительные мощности на отрисовку оставшихся трех граней, если их не будет видно? Если бы мы могли отбросить их обработку каким-то образом, то сэкономили более чем половину выполнений фрагментного шейдера!
Читать дальше →
Total votes 9: ↑9 and ↓0+9
Comments0

А вы не программируете себе burnout?

Reading time9 min
Views19K
image

Подвержены программисты эмоциональному выгоранию больше чем представители других профессий? Если да — какие факторы риска сушествуют и как с ними бороться?
Читать дальше →
Total votes 33: ↑30 and ↓3+27
Comments36

Объёмное атмосферное рассеяние света

Reading time31 min
Views29K
image

Если вы прожили на планете Земля достаточно долго, то наверно задавались вопросом, почему небо обычно синее, но краснеет на закате. Оптическое явление, которое стало (основной) причиной этого, называется рэлеевским рассеянием. В этой статье я расскажу, как смоделировать атмосферное рассеяние, чтобы имитировать многие визуальные эффекты, которые проявляются на планетах. Если вы хотите научиться рендерить физически точные изображения чужих планет, то этот туториал определённо стоит изучить.

GIF

Статья разбита на следующие части:

  • Часть 1. Объёмное атмосферное рассеяние
  • Часть 2. Теория атмосферного рассеяния
  • Часть 3. Математика рэлеевского рассеяния
  • Часть 4. Путешествие сквозь атмосферу
  • Часть 5. Атмосферный шейдер
  • Часть 6. Пересечение атмосферы
  • Часть 7. Шейдер атмосферного рассеяния
Читать дальше →
Total votes 50: ↑50 and ↓0+50
Comments14

Learn OpenGL. Урок 4.1 — Тест глубины

Reading time10 min
Views35K
OGL3

Буфер глубины


В уроке, посвящённом системам координат, мы выполнили рендер трехмерного контейнера с использованием буфера глубины, что позволило предотвратить ошибочный вывод граней, находящихся позади других. В этом уроке мы пристальнее взглянем на буфер глубины (или z-буфер) и хранимые в нем значения, а также узнаем как конкретно проходит проверка находится ли фрагмент позади других.
Читать дальше →
Total votes 18: ↑18 and ↓0+18
Comments3

Загрузка PNG и JPEG картинок в Android NDK

Reading time14 min
Views16K
Приветствую всех читателей!
В этой статье речь пойдет о том, как в Android NDK загрузить PNG и JPEG картинки из файла или из памяти, а также немного полезного кода для скармливания этих картинок OpenGL.
Читать дальше →
Total votes 13: ↑8 and ↓5+3
Comments10

Mastering Android NDK

Reading time1 min
Views8.3K
В конце прошлого года вышла наша вторая книга про нативную разработку под Android с использованием Android NDK и C++ (про первую уже было рассказано на Хабре).

image

www.packtpub.com/application-development/mastering-android-ndk

Читать дальше →
Total votes 9: ↑8 and ↓1+7
Comments5

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity