Пользовательский интерфейс будет состоять из двух столбцов: слева пользователь может вводить код C++, а справа находится окно предварительного просмотра, в котором отображается изображение/текстура/набор пикселей. Цель — создать что-то похожее на редактор p5.js.
Пример эскиза, который напишет пользователь:
Код: Выделить всё
// sketch.cpp
// global state...
// setup() runs once
void setup();
// draw() runs once per "tick", e.g., 30 times a second
void draw();
Код: Выделить всё
void create_canvas(uint32_t width, uint32_t height);
Когда пользователь нажимает кнопку Выполнить, я хочу взять код из редактора, скомпилировать его и «встроить» в внутренний механизм, который вызывает setup() один раз, а затем повторно вызывает draw() в каждом кадре.
Примерно, как я это делаю представление работы системы:
- Основное приложение предоставляет редактор и окно рендеринга, написанное на C++ и использующее, например, GLFW/SDL и ImGUI для окон и пользовательского интерфейса соответственно.
- Когда пользователь нажимает Выполнить, программа сохраняет пользовательский код во временный файл .cpp.
- Этот код компилируется в файл общая библиотека (в Linux/macOS, .dll в Windows).
Код: Выделить всё
.so - Затем основное приложение загружает эту общую библиотеку во время выполнения.
- Приложение находит и вызывает setup() и draw() из этой библиотеки.
- Когда пользователь снова редактирует код и нажимает Выполнить, приложение выгружает старую библиотеку и загружает новую, фактически давая «живой» update».
Более конкретно, я не уверен в том, как правильно и безопасно справиться с этой живой перезагрузкой:
- Как я могу безопасно выгрузить и перезагрузить общую библиотеку, которая используется в каждом кадре?
- Есть ли там рекомендуемые шаблоны для сохранения некоторого состояния (например, определяемых пользователем глобальных переменных или содержимого холста) между перезагрузками? Я не думаю, что на самом деле хочу сохранить какое-либо состояние, поскольку считаю приемлемым просто перезагрузить все для будущего использования. Я по-прежнему спрашиваю об этом в основном из соображений производительности, например, потенциально может быть полезно избежать перераспределения памяти между перезагрузками, если пользовательский код сложный и «тяжелый». Мне любопытно, вот и все.
- Лучше ли запускать пользовательский код в отдельном процессе и взаимодействовать через межпроцессное взаимодействие (IPC), чем загружать/выгружать общие библиотеки в одном и том же процессе?
- Существуют ли какие-либо фреймворки, движки или примеры, которые уже реализуют подобную перезагрузку живого кода C++?
Любые указатели, шаблоны проектирования или реальные примеры (игровые движки, плагины и т. д.), которые делают это, будут очень полезны.
РЕДАКТИРОВАТЬ: Программа должна использоваться только мной в изолированной автономной среде. Код может редактироваться только одним человеком одновременно, а именно человеком, который запускает программу в своей изолированной автономной среде. Таким образом, проблемы безопасности, которые естественным образом возникают, когда речь идет о внедрении и запуске кода в приложение, которое вы запускаете, в моем конкретном случае по сути не являются проблемой.
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-hot-relo
Мобильная версия