Обновить
385.86

C++ *

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

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

QML и Widgets в одном проекте: решение без костылей

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

В проектах на Qt рано или поздно встаёт вопрос: делать интерфейс на Widgets или на Quick. Первый вариант даёт зрелый набор контролов и привычное поведение окон, второй — гибкость, анимации и GPU-рендеринг. Иногда нужно объединить эти подходы: например, когда в приложении на Qt Quick требуется окно, способное выходить за границы основного, как это делают всплывающие подсказки или выпадающие списки в классических десктопных программах.

В этой статье я разберу рабочий способ показывать окна Qt Widgets из приложений Qt Quick — без хака с QQuickPaintedItem и без потери преимуществ Scene Graph.

Читать далее

Вышел открытый игровой движок Godot 4.5 — подробный обзор нововведений

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

Godot — это 2D/3D игровой движок с открытым исходным кодом по лицензии MIT и большим сообществом, поддерживающий основные настольные и мобильные ОС, VR и веб (приставки с помощью сторонних компаний), ядро написано на C++, для скриптов поддерживается GDScript и C#, возможно подключение модулей практически на любом языке вплоть до Rust через GDExtension. Примеры игр — список раз, список два. Версия 4.5 вышла 15 сентября 2025. Главные нововведения: трафаретный буфер (stencil buffer), поддержка средств чтения с экрана, обратная трассировка скриптов и пользовательские логгеры, запекатель шейдеров (shader baker), живой предпросмотр интернационализации, поддержка Apple Vision, физика сегментированных тайловых карт (chunk tilemap physics), фовеальный рендеринг (foveated rendering) на Vulkan Mobile, поддержка WebAssembly SIMD в веб. Далее сделанный человеком перевод официального обзора нововведений с доступными объяснениями для новичков и ссылками на PR с исходным кодом на C++ для профессионалов.

Поддержка трафаретного буфера (stencil buffer). Как нам «прорезать дыру» в этой стене, чтобы посмотреть на игрока на другой стороне? Теперь вы можете сделать это с трафаретными буферами! Представьте невидимую сферу, которая окружает нашего персонажа. Даже если геометрия не отрисовывается на экране, мы вставляем ее форму в трафаретный буфер. Теперь сделаем так, чтобы наши шейдеры отрисовывались, только если целевой пиксель не покрыт трафаретом. Вот так! Трафаретный буфер — это специальный буфер, в который меши могут писать для последующего сравнения. Он похож на существующий буфер глубины, но в него можно записать произвольные значения и у вас больше контроля над тем, что можно сделать со сравнениями. Подробнее и код. Добавлено Apples.

Читать далее

Проблема, о которой вы наверняка не задумывались: print(.1+.2)

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

Как следует отображать на экране результат деления 3.0 на 10.0 ? Сколько цифр следует вывести, если пользователь не указал точность?

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

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

Это вторая статья из цикла «Санпросвет о плавающей точке»:

1. Компьютеры и числа

2. Вывод чисел с плавающей точкой на экран <- вы тут

Читать далее

Как мы внедряли Dynatrace в банке для мониторинга Kafka, БД и Java/C++ сервисов

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

Я работаю в одном крупном российском банке, где занимаюсь разработкой распределённых систем. За последние несколько лет наша архитектура заметно усложнилась — часть сервисов работает в OpenShift, часть на виртуалках, а кое-что до сих пор крутится на «железе».

Основная боль заключалась в том, что у нас не было единой системы мониторинга. Метрики мы собирали из разных источников: где-то стоял Prometheus, где-то — Zabbix, в Kafka писали свои дашборды, а для C++ приложений вообще не было нормального мониторинга. Каждый инцидент превращался в расследование: мы переключались между тремя-четырьмя консолями, сверяли логи, писали временные скрипты для выгрузки метрик. В среднем на поиск корневой причины (root cause analysis) у нас уходило от нескольких часов до пары дней.

Читать далее

Динамическая память и реализация динамического массива в C

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

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

Читать далее

Псевдо-3D движок за 150 строк кода или рейкастинг для чайников

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

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

Поэтому я решил подделится своим опытом в этом направлении

Читать далее

Санпросвет о плавающей точке, статья первая: компьютеры и числа

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

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

Оказалось, что форумы кишат людьми, которые не до конца понимают, как компьютеры манипулируют числами. Например, мемасик с КПДВ я стянул с реддита (перечеркнул его я). Кто-то настолько был напуган страшными ошибками округления чисел с плавающей точкой, что даже смешную картинку смастерил. Только вот проблема в том, что 0.5 + 0.5 в точности равно 1.0.

Таким образом, я решил засучить рукава, и изобрести велосипед. То есть, написать самую неоптимизированную C++ библиотеку для эмуляции IEEE754 32-битных чисел с плавающей точкой при помощи исключительно 32-битной целочисленной арифметики. Библиотека уложится в несколько сотен строк кода, и в ней не будет никакого битхакинга. Задача написать понятный код, а не быстрый. А заодно хорошенько его документировать серией статей.

Итак, этим полукреслом мастер Гамбс начинает новую партию мебели, или статья первая: поговорим о числах и компьютерах.

Читать далее

Я отклоняю комиты с использованием кучи и прошу коллег переписать такую логику

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

Хочу поделиться своим опытом разработки крупных игровых проектов на C++, где производительность и стабильность — это не просто приятные бонусы, а абсолютно естественные требования к разработке. За годы работы над движками и играми я понял, что подход к управлению памятью очень сильно влияет на весь проект. В отличие от многих приложений - игры, особенно большие, часто работают часами без прерываний и должны поддерживать стабильный фреймрейт и отзывчивость. Когда проседание fps или фриз происходит на глазах у сотен тысяч игроков, вам уже никто не поможет — ущерб уже нанесен, а в steam полетели отзывы о кривизне рук разработчиков.

Однажды моя команда закончила работу над довольно интересным проектом, который портировали больше двух лет на плойку. Движок старый, большой и мощный, но работа с памятью была ориентирована на ПК времен конца 2000-х, и что меня поразило, так это насколько сильно большая часть кодовой базы зависела от динамической памяти во время выполнения. На ограниченном железе (далеко не у всех есть PS5 pro) и в условиях жёстких требований к сертификации на консолях такие решения быстро превращаются в проблему.

В разработке для консолей (про мобильные устройства я молчу, потому что игра не влезает по памяти даже в восемь гигов) с ограниченными ресурсами, архитектура с частыми аллокациями не просто неэффективна — она становится реальной угрозой для стабильности проекта. Каждое выделение памяти в куче влечёт за собой накладные расходы: это дополнительные !миллисекунды! (в целом на кадре) задержки, риск большой фрагментации памяти, и непредсказуемое поведение в долгой игровой сессии. После двух часов игры постоянные операции с кучей буквально «сжигают» половину бюджета кадра.

Читать далее

Как построить открытую АСУТП. Настройка плагина протокола Modbus TCP/RTU Master/Slave

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

Добрый день! Меня зовут Евгений Ионенко, я — руководитель направления в ИТ-команде «Северстали», занимающейся разработкой компонентов для открытой автоматизированной системы управления технологическим процессом (АСУТП). В марте этого года мы начали выпуск статей, посвящённых разработке компонентов открытой АСУТП, с предыдущей статьёй этого цикла можно ознакомиться здесь: Статья №3.

В этой статье я расскажу, как настраивать плагин протокола Modbus TCP/RTU Master/Slave на примере небольшого проекта.

Читать далее

Как получить и использовать бесплатную лицензию PVS-Studio на практике. Часть 1: подготовка и начало работы

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

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

Читать далее

Многопоточности — да! Как работать с геометрическим ядром C3D в многопоточном приложении

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

Татьяна Митина, руководитель подразделения C3D Labs в Нижнем Новгороде, рассказывает, как устроена многопоточность ядра C3D, какими механизмами обеспечивается потокобезопасность ядра, какие параллельные вычисления происходят в самом ядре. Особое внимание уделяется правилам использования ядра C3D в нескольких потоках.

Многопоточность — отличный повод заглянуть в параллельные миры!

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

Читать далее

DIY Open Source принтер. Часть 0

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

Привет, Хабровчане! Этот цикл (надеюсь) статей будет посвящён моему пути в создании своего собственного решения по струйной печати. Это будет что-то вроде блога или дневника разработчика в котором постараюсь изучить как же всё таки работает печатающая головка у принтера и как ей можно управлять с помощью микроконтроллера. А также нас ждёт интригующий ответ на вопрос: "Если ли место DIY и OpenSourse в мире струйной печати".

Читать далее

Deferred Rendering: GBuffer

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

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

Этакий разбор полётов, что это такое, как этого добиться и как конфигурировать DX12 так, чтобы он рисовал то, что ты хочешь.

Читать далее

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

librats: новая библиотека для распределённых P2P-приложений

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

Всем привет! Я являюсь создателем распределённого поисковика rats-search на базе DHT ( GitHub ). Его принцип работы довольно прост: поисковик собирает торренты у всех участников сети и формирует большую распределённую базу для поиска, включая метаданные (например, описания и прочую информацию).

В этой статье я хочу рассказать о своей новой библиотеке для построения распределённых приложений (p2p), где знание IP-адресов участников не обязательно, а поиск ведётся через различные протоколы — DHT, mDNS, peer-exchange и другие. Думаю, с учётом постоянных неприятностей, которые происходят вокруг, это может оказаться полезным ;-).

Читать далее

Боремся с хедкрабами в исходниках Source SDK

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

GameDev тернист и неисповедим. Как и любой проект, он проходит испытания кровью и потом, сражаясь с тварями, тьмой порождёнными: барнаклы, пиявки, муравьиные львы. И это ещё не сказочка, это только смазочка. Больше всего стоит остерегаться жуков хедкрабов. Да, это те самые баги в коде. Если их вовремя не убить монтировкой, то ваша участь — стать отвратительным кадавром. Предлагаем читателю побывать в роли Гордона Фримена, погрузиться в недры Source SDK и побороться с хедкрабами. В качестве монтировки же выступит PVS-Studio.

Читать далее

Минимальный «эксплойт» на Си, который научил меня любить защиты

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

Я всегда считал, что взлом — это магия адресов и байтов. А потом я написал десять строчек на C и понял, что настоящая магия — это защиты компилятора и ОС. В этой статье я сознательно построю крохотный уязвимый пример, добьюсь управляемого падения (это и будет мой «эксплойт»), а затем превращу баг в безопасный и быстрый код. Ни одного шага против чужих систем — только локальная лаборатория и гигиена памяти.

Читать далее

Высокий слог. Язык программирования для аристократов. Почему LLM приучают нас к языку аристократов программирования

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

Он заговорил, и стрелок застыл, поражённый: к нему обращались Высоким Слогом Гилеада! — Сделай милость, стрелок‑сэй. Не пожалей золотой. Один золотой — это ж такая безделица. Высокий Слог. В первый миг разум стрелка отказался его воспринять. Прошло столько лет — Боже правый! — прошли века, тысячелетия; никакого Высокого Слога давно уже нет. Он — последний. Последний стрелок.

Стивен Кинг

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

Осторожно! В статье намеренно используются фрагменты сгенерированного текста!

Читать далее

Мультиплеер в Цивилизации 5

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

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

Читать далее

Демистификация unaligned access undefined behavior в C

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

Неопределённое поведение (Undefined Behavior, UB) в C и C++ — одна из причин, по которым разработчики всё чаще ищут языки с полностью определённой семантикой. Одним из самых коварных UB является unaligned access, с точки зрения стандарта C это, например, когда происходит попытка разыменовать указатель как uint32_t, а значение указателя (адрес) не кратно четырём. Один из частых сценариев использования, приводящих к такому UB - получение данных по сети и их интерпретация как чисел.

Читать далее

Что делать, если ваш слон думает, что он баг?

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

Мы окунулись в веб-разработку и нашли там необычное животное. Это был слон с повадками бага. Мы изучили код проекта PHP и поняли, в чём дело. Давайте вместе посмотрим на необычные случаи, которые могут привести к неожиданным результатам.

Читать далее