Обновить
128K+

C++ *

Типизированный язык программирования

221,94
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Что можно сделать с массивом массивов

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

На одном из проектов (4Х историческая стратегия) появилась задача убрать часть логики в потоки, отдав им снапшот игрового состояния, чтобы пока основной поток считает свой тик, остальные (AI, поиск пути, UI и др) могли крутить свою логику, вроде "кто стоит в этой локации" и делать это без блокировок или риска увидеть половину чужой записи. Чтобы реализовать такую систему, надо придумать как получить обратный индекс полка по локации, причем сделать поиск дешевым для потоков, т.е. у потока должен быть свой снапшот состояния некоторой части игрового мира на момент старта апдейта (кадра, тика логики, дня, месяца и т.д)

Общепринятая практика - это сделать данные иммутабельными на время кадра, и построить нужный индекс один раз на старте, а дальше дать читателям возможность работать с ним. И вообщем от ребят, которые делали эту задачу на ревью прилетел вот такой код (выделю тут только основную часть):

std::vector<std::vector<unsigned int>> regiments(location_count);

Такая структура называется jagged array, массив массивов (зачем она и как с ней работать я показывал в книге Game++), или, если вам ближе академическая терминология, CSR (compressed sparse row) немного другая форма записи таких массивов, либо разреженные матрицы. И такие стуктуры довольно частое явление в играх, если у вас много локаций и вам надо узнать какой лут разложен в каждой локации, какие армии принадлежат каждой области, или какие монстры живут в локации, какие локации входят в область, какие области в регион, или почекать соседей локации на карте, adjacency region, на чем строится весь поиск путей и вся заливка областей в глобальных стратегих;

Читать далее

Новости

Я собрала ретрофутуристичную «Виселицу»

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

Оверинжиниринг — это прошлый век. Я работаю в жанре «эпатажный инжиниринг»: у девайса ровно одна функция, а выглядит он как пульт управления инопланетным кораблем. Я обожаю игривую ретрофутуристичную эстетику и в этом проекте выкрутила её на максимум.

Ну и я люблю играть в «Виселицу».

Читать далее

YOLO‑JSON: знание [на этапе компиляции] — сила

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели11K

Мы рассмотрим новые возможности рефлекС++ии для проектирования сверхбыстрого JSON. Вашему вниманию представляется библиотека yolo-json, позволяющая интегрировать знания о прибывающих JSON (порядок полей, размеры и т.д.) в удобной манере для достижения высокой скорости парсинга.

Как полусырой код может обойти simdjson? Давайте разберемся.

Читать далее

Как программа для записи ужимается в 40 МБ ОЗУ, пока OBS ест полгига

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели7.6K

На Windows для захвата экрана есть два классических пути: GDI (медленно и печально) и DXGI Desktop Duplication API. HomRec использует второй вариант.

Смысл DXGI Desktop Duplication в том, что видеокарта сама отдаёт вам текстуру рабочего стола — не нужно постранично вычитывать пиксели через GDI. Вызов AcquireNextFrame возвращает GPU‑текстуру с очередным кадром, а если на экране ничего не изменилось — честно говорит «нечего отдавать» (таймаут), и можно просто повторно использовать прошлый кадр вместо лишней работы.

Проблема в том, что эта GPU‑текстура недоступна напрямую из CPU‑памяти — её сначала нужно скопировать в «staging‑текстуру» и замапить. А вот тут прячется первая интересная деталь.

Читать далее

WinUI 3 без XAML: как написать декларативный GUI на чистом C++23, сжав проекцию WinRT в 50 раз

Уровень сложностиСложный
Время на прочтение18 мин
Охват и читатели5.9K

Microsoft рекомендует современный WinUI 3 в качестве официального фундамента для будущих Windows‑приложений. Однако, стандартный стек C++/WinRT + XAML встречает разработчика чудовищным временем компиляции, миксиновым адом вместо нативного наследования, тоннами шаблонной рутины и плохочитаемым кодом.

В этой статье мы разберем архитектуру wxl— тонкой надстройки, которая позволяет описывать GUI на чистом C++23 декларативно (как во Flutter или SwiftUI). Вы узнаете, как сжать заголовочные файлы проекции в 50 раз, сократить время пересборки с полуминуты до 4 секунд, победить накладные расходы QueryInterface с помощью ленивого кэширования интерфейсов на базе STA‑потока и превратить написание нативного GUI в чистое удовольствие.

Заглянуть под капот

Компактная кросс‑платформенная open source C++ библиотека для разработки приложений с графическим интерфейсом — Frenchie

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели11K

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

Читать далее

От Qt5Multimedia до QtAVPlayer

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели8.1K

Во времена, когда Nokia владела Qt, инженеры были отважнее. Они разработали и релизнули QMediaPlayer в Qt5Multimedia для проигрывания медиа файлов на основе подгружаемых плагинов. Архитектура позволяла сначала выпустить API, а реализацию конкретного бекенда добавить позже. Поэтому API уже существовал даже там, где полноценного воспроизведения видео ещё не было.

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

Этот подход породил интерфейсы, часть функционала которых не так работала или полностью отсутствовала на некоторых платформах.

Читать далее

Упаковщик наносит ответный удар: ZA как машина транспонирования

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели6.3K

В этой части мы вернёмся к работе, которую предыдущие главы принимали как готовую: упаковке. Сначала найдём скалярную ловушку в упаковке B, затем используем ZA как машину транспонирования, после этого разберём 128-битный случай для комплексных чисел и правило корректности для общего PACKM_KER. В финале соберём весь цикл одной дугой: от FMOPA до работающей субконфигурации BLIS для Apple SME.

Читать далее

Шаблоны против статической рефлексии в C++: пять операций, две реализации и дедупликация, которая не стоит памяти

Уровень сложностиСложный
Время на прочтение26 мин
Охват и читатели8.7K

Одна и та же операция — дедупликация списка типов — написана двумя способами: на шаблонах и на статической рефлексии из C++26. Обе реализации живут в одном дереве и проверены на идентичность результата, поэтому их можно честно вычесть друг из друга. Получилось так: шаблонная версия съедает 7,9 ГиБ памяти компилятора там, где рефлексивная не съедает ничего измеримого — ±21 МиБ на 32-кратном диапазоне размеров. А по времени обе квадратичны, и рефлексия выигрывает всего пятую часть. Разбираю, откуда берётся такая асимметрия, и заодно пять компиляторных стен, в которые упираешься по дороге, — включая sizeof…, который молча возвращает неверное число.

Читать далее

Эти пчелы делают неправильный с++

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

В 2016 году EA закрывает свой последний оплот разработки в Питере, и народ начал разбредаться по разным студиям и командам. Тогда мировой игрострой ещё благосклонно смотрел на обладателей красных паспортов, и несколько моих бывших коллег "со связями" организовали мини-галеру и умудрились получить контракт на поддержку движка для прототипа новой игры Arkane. Причем схема взаимодействия была достаточно мутная, из-за нежелания Остинцев работать напрямую с пост-СНГ конторами, поэтому основной контракт у них был через каких-то корейцев за три рубля, которые делегировали часть работы французкой конторе за рубль, а те наняли каких-то ребят за десять копеек из восточной Европы, ну вы поняли каких:)

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

С этого момента и началось моё знакомство с идеями, которые мы внутри команды прозвали "арканутым C++", и с их реальным применением в разработке игр. Я и раньше сталкивался с жёсткими требованиями к разработке на плюсах на своей доигростростроевской работе, но за шесть лет как-то раздобрел и перестал сильно жестить с оптимизацией, так что знакомство с командой из Остина вызвало стойкое дежавю разработки начала нулевых.

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

Читать далее

QML и CSS не нужны. Использование QStyle (QStyleFactory) для изменения дизайна Qt приложения с выбором для пользователя

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

В статье рассказывается о функционале, о котором забыли даже разработчики Qt. Дело в том, что этот функционал даёт уникальные возможности стилизации. В отличие от QML и CSS, использование QStyleFactory позволяет предоставить пользователю широкий выбор QStyle-дизайнов виджетов без затрат времени на настройку QML и CSS. Я много раз видел, как программисты тратят много времени на настройку дизайна через QML и CSS, хотя в Qt 5 и Qt 6 есть база уже готовых дизайнов, которую никто не предоставляет пользователю в качестве выбора. Считаю необходимым рассказать об этом очень удобном и даже ленивом способе настройки дизайна.

Читать далее

WUI три года спустя: C++ интерфейс на Windows, Linux, macOS и в браузере

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели13K

В октябре 2023 года я рассказывал на Хабре о WUI — небольшой UI-библиотеке на C++, которую начал делать для своего приложения. Тогда она работала на Windows и Linux, а macOS оставалась в списке задач.

Теперь у WUI есть бэкенды для macOS и WebAssembly. Можно открыть сайт и пощелкать тот же интерфейс, который собирается в desktop-приложение: кнопки, многострочный ввод, списки, меню, диалоги, разделители. Код контролов и логика демонстрации общие.

Читать далее

Гетерогенный lookup: как одна фича C++ сделала драйвер проще, чище и быстрее, чем на C

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели13K

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

Меня зовут Женя Ерохин, у меня около 15 лет опыта разработки драйверов на C++ под macOS. Сейчас я старший разработчик в Kaspersky Lab, занимаюсь операционной системой KasperskyOS. Много всего создал в ее микроядре, а теперь знакомлю нашу ось со всяким железом на мобильных устройствах.

Под катом я покажу, как мы использовали C++ при разработке драйвера для микроядерной ОС. В том числе разберу гетерогенный lookup — возможность выполнять поиск по разным типам аргументов без лишних преобразований. На практике такая фича хорошо показывает, почему C++ может быть полезен даже там, где обычно ждут C. Я расскажу, почему драйверы на C++ для микроядерной ОС — вполне рабочее инженерное решение. Покажу, где именно плюсы помогают писать более аккуратный и надежный код, как они упрощают работу со структурами данных и почему в нашей задаче такой выбор оказался естественным.

Читать далее

Ближайшие события

Анатомия граблей

Время на прочтение10 мин
Охват и читатели20K

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

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

Читать далее

Oblivion Mind: как я строю когнитивно‑символьный ИИ с проверяемым знанием

Время на прочтение20 мин
Охват и читатели8.6K

Я начал делать Oblivion не потому, что мне хотелось написать ещё один чат. Меня всё время беспокоил другой вопрос: что вообще остаётся внутри системы после того, как она дала ответ? Допустим, она прочитала книгу. Потом вторую. Потом тысячу документов. Мне мало того, что через месяц она сможет уверенно пересказать прочитанное. Я хочу открыть её состояние и увидеть: этот факт появился отсюда, вот здесь другой источник ему противоречит, здесь данных пока недостаточно, а этот старый вывод после появления новых данных нужно пересмотреть.

Из этого постепенно и вырос Oblivion Mind. Я строю его как когнитивно‑символьную систему. Для меня важен не сам ответ, а то, что система успела построить, связать и проверить до того, как этот ответ появился. Позже этот вопрос пришлось проверять уже не на условном примере: один из больших прогонов прошёл по 3000 книг. Ниже я отдельно покажу, что именно этот тест проверил — и чего он не доказывает.

Читать далее

Кроссплатформенный мониторинг аппаратных ресурсов на C++ и Python: библиотека hardware_monitor_cpp

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

После того как мой пет-проект случайно «выстрелил» на Reddit, я решил, что пора поделиться так же и своей кроссплатформенной библиотекой на C++20 для мониторинга железа, с нативной поддержкой Python.

Рассказываю историю создания hardware_monitor_cpp: как избавиться от лишних зависимостей, получить адекватную статистику swap-файла под Windows и macOS, упаковать все в удобное C++ API, а заодно получить готовую консольную утилиту с визуализацией графиков прямо в терминале.

Читать далее

Ускоряем eMMC в 5 раз для процессора AllWinner H6 на примере Repka Pi 4

Уровень сложностиСложный
Время на прочтение40 мин
Охват и читатели9.5K

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

Читать далее

Комплексный GEMM: четыре вещественных внешних произведения в одном флаконе

Время на прочтение8 мин
Охват и читатели6.7K

В этой части мы сначала отделим прямой комплексный путь от готового метода 1m; затем покажем конфликт между чередующимся форматом памяти и раздельной арифметикой внешних произведений; после этого разберём четыре вещественных внешних произведения, расслоение через svuzp, эпилог с комплексными alpha и beta, а в конце — почему сопряжение остаётся работой упаковщика. Следующая часть вернёт нас к упаковке и к тому месту, где эта граница ответственности особенно важна.

Читать далее

Как я писал сервер и нечаянно пробил 1М RPS

Уровень сложностиСложный
Время на прочтение4 мин
Охват и читатели7.2K

История об асинхронном серверном EAV‑движке, epoll'е, битовых полях и шардинге, который не смог.

Это должен был быть очередной вялотекущий рутинный проект TCP сервера, listen socket, пул потоков, пул соединений, СУБД и синхронизация всего этого добра. Сказать, что скучно — ничего не сказать.

Но у меня было несколько интересных мыслей и желание реализовать что‑то достойное. Писать чистый и изящный код, чтобы каждая деталь была на своём месте, все структурировано и ничего лишнего. Ресурсы позволяли писать код для удовольствия.

Этот сервер не стоит миллион рублей. Это обычная облачная виртуалка: 4 vCPU, 4.5 ГБ RAM, AlmaLinux 8. И она выдала 1М+ RPS на пакетах по 4 байта. Сервер стоял на 40% CPU.

Я прогнал тесты ещё несколько раз — результат не менялся. Сравнил счетчик сервера со счетчиками эмуляторов. Сервер стабильно держал 1М с копейками. Запросил информацию по производительности NGINX. Да ладно!?

Читать далее

Долго запускается qt creator, долго переходит между вкладками (проект, отладка, редактор), не работает масштабирование

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

В этой статье рассматривается одна из причин такого поведения IDE Qt Creator и приводится решение этой проблемы. Актуальность:

1. В интернете нет описания и решения данной проблемы (я искал).

2. Некоторые решения данной проблемы, которые может выполнить пользователь, вредоносны.

3. ИИ не предлагает верного решения.

4. У ide Qt Creator нет лога ошибки данной проблемы (QT_DEBUG_PLUGINS=1 и gdb бесполезны).

Читать далее
1
23 ...