Интерактивное приложение для вычисления, построения и исследования фрактала Мандельброта, разработанное на C++23 с использованием современного подхода к асинхронному программированию (NVIDIA stdexec
) и графической библиотеки SFML.
Приложение позволяет визуализировать знаменитый фрактал Мандельброта — множество точек на комплексной плоскости, обладающее свойством самоподобия. Пользователь может интерактивно исследовать фрактал, приближая и отдаляя его участки с помощью мыши.
Основная цель проекта — продемонстрировать применение модели Sender/Receiver для построения гибкого и производительного асинхронного конвейера операций: от обработки пользовательского ввода до параллельного вычисления и финальной отрисовки кадра.
- Архитектура
- Используемые технологии
- Начало работы
- Сборка проекта
- Настройка и подключение внешнего дисплея (Windows/Linux)
- Кейсы использования
- Тестирование
Архитектура приложения построена вокруг асинхронного пайплайна, который итеративно выполняется в главном цикле. Каждая операция в пайплайне представлена в виде сендера (sender
), который по завершении передает результат следующему звену — ресиверу (receiver
). Это позволяет декларативно описывать сложную логику, разделяя ее на независимые компоненты.
Вычисления производятся параллельно с использованием пула потоков exec::static_thread_pool
для максимальной производительности.
Диаграмма ниже иллюстрирует последовательность операций в главном цикле приложения.
flowchart LR
subgraph "main"
A[Start Frame] --> B{Обработка событий SFML};
B --> C{Нужна перерисовка?};
C -- Да --> D[Асинхронный рендеринг фрактала];
C -- Нет --> E[Пропуск рендеринга];
D --> F[Отрисовка в окне SFML];
E --> F;
F --> G[Ограничение FPS];
G --> H[End Frame];
end
- Язык: C++23
- Асинхронность: NVIDIA
stdexec
(реализация P2300 Sender/Receiver) - Графика: SFML (Simple and Fast Multimedia Library)
- Система сборки: CMake
- Менеджеры зависимостей: Conan, CPM.cmake
- Тестирование: Google Test (GTest)
- Среда разработки: VS Code Dev Containers (Docker)
Проект использует Dev Containers в VS Code, что позволяет развернуть полностью настроенное окружение для разработки одной командой.
- Настройка переменных окружения: Для корректной работы контейнера добавьте в ваш
~/.bashrc
(или аналог) следующие переменные:echo -e '\nexport USER_UID=$(id -u)\nexport USER_GID=$(id -g)' >> ~/.bashrc source ~/.bashrc
- Клонирование репозитория: Склонируйте репозиторий на ваш локальный компьютер.
- Открытие в VS Code: Откройте папку с проектом в Visual Studio Code.
- Запуск в контейнере: VS Code автоматически предложит открыть проект в Dev-контейнере. Нажмите Reopen in Container.
-
Автоматическая сборка (рекомендуется):
- Нажмите F5 в VS Code. Это автоматически запустит сборку проекта, установит все зависимости и запустит приложение в режиме отладки.
-
Ручная сборка из терминала:
# Создать директорию для сборки cmake -S . -B build
# Собрать проект cmake --build build
Для отображения графического окна из Docker-контейнера необходимо настроить X11 Forwarding.
- Установите X Server: Установите и запустите VcXsrv или X410.
- Настройте X Server: При первом запуске VcXsrv убедитесь, что вы отключили контроль доступа (Disable access control).
- Узнайте IP-адрес хоста: Откройте PowerShell или CMD и выполните команду
ipconfig
. Найдите IPv4-адрес вашего основного сетевого адаптера (например,192.168.1.10
). - Настройте devcontainer.json: Откройте файл
.devcontainer/devcontainer.json
и в секцииrunArgs
замените<IP адрес хоста с XLaunch>
на ваш IP-адрес:"--env", "DISPLAY=192.168.1.10:0",
- Пересоберите контейнер: Нажмите F1 и выполните команду
Dev Containers: Rebuild Container
.
- Разрешите локальные подключения: Выполните в терминале на хост-машине:
xhost +local:
- Узнайте IP-адрес хоста: Выполните команду
hostname -I
илиifconfig
и скопируйте ваш IP-адрес. - Настройте devcontainer.json: Аналогично Windows, укажите ваш IP-адрес в файле
.devcontainer/devcontainer.json
. - Пересоберите контейнер.
- Просмотр фрактала: При запуске на экране отображается фрактал Мандельброта.
- Приближение (Zoom In): Зажмите левую кнопку мыши, чтобы приблизить участок фрактала под курсором.
- Отдаление (Zoom Out): Зажмите правую кнопку мыши для отдаления.
- Сброс вида: Нажмите клавишу
R
, чтобы вернуться к исходному масштабу и положению. - Выход: Нажмите клавишу
Esc
или закройте окно.
Проект включает в себя набор unit-тестов и интеграционных тестов с использованием фреймворка Google Test. Тесты проверяют корректность работы как отдельных компонентов (сендеров, утилит), так и их взаимодействия в рамках всего пайплайна.
Запуск тестов из терминала:
# Соберите проект, если еще не сделали этого
cmake --build build
# Перейдите в директорию сборки
cd build
# Запустите исполняемый файл тестов
./MandelbrotFractal_tests