Улучшение поведения изменения размера окна, возможно, путем ручной установки большего размера фреймбуфера

Я рассматривал возможность использования glfw в своем приложении, при разработке на mac

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

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

Я использую GLFW 3.

Не могли бы вы также помочь мне с включением High DPI для отображения сетчатки. Не удалось найти что-то в документах на этом, но оно поддерживается в версии 3.

Ответ 1

Получение большего фреймбуфера

Попробуйте получить большой начальный буфер-буфер, вызвав glfwCreateWindow() с большими значениями для width и height и сразу же переключится на отображение меньшего окна с помощью glfwSetWindowSize() с желаемым фактическим размером окна.

В качестве альтернативы зарегистрируйте собственную функцию обратного вызова размера фреймбуфера, используя glfwSetFramebufferSizeCallback() и установите фреймбуфер в большой размер согласно вашему требованию:

void custom_fbsize_callback(GLFWwindow* window, int width, int height)
{
    /* use system width,height */
    /* glViewport(0, 0, width, height); */

    /* use custom width,height */
    glViewport(0, 0, <CUSTOM_WIDTH>, <CUSTOM_HEIGHT>);
}

ОБНОВЛЕНИЕ:
визуализировать конвейер, наблюдаемый во время операции изменения размера окна (и перетаскивания окна) из-за поведения блокировки, реализованного в диспетчере окон.

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


Поддержка большого DPI

В документации GLFW говорится:

GLFW теперь поддерживает мониторы с высоким разрешением DPI как на Windows, так и на OS X, что дает окна с полным разрешением фреймбуферов, где другие элементы пользовательского интерфейса масштабируется до. Чтобы достичь этого, glfwGetFramebufferSize() и glfwSetFramebufferSizeCallback(). Эти работы пикселей, тогда как остальная часть GLFW API работает с координатами экрана.

AFAIK, похоже, почти все о высоком DPI в документации.

Просматривая код, мы видим, что в Windows glfw перехватывает в SetProcessDPIAware() и вызывает его во время platformInit. В настоящее время я не могу найти какой-либо аналогичный код для поддержки высокого DPI на Mac.