Изменение размера экрана: предыдущая ширина и высота экрана в текущем экстенте возвращаются из vkGetPhysicalDeviceSurfaceCapabilitiesKHR - PullRequest
2 голосов
/ 28 марта 2019

Я пишу игру для Android , используя Java для пользовательского интерфейса и C ++ с NDK для потока рендеринга.Он использует Vulkan , если доступно, и использует OpenGL ES .Эта ошибка возникает только в Vulkan .

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

Когда размер поверхности изменяется, я получаю вызов SurfaceHolder.Callback.surfaceChanged.Я передаю событие в мой поток визуализации C ++.Поток рендеринга ожидает, пока устройство перейдет в режим ожидания (путем вызова vkDeviceWaitIdle), затем уничтожает команды swapchain, глубины изображения, прохода рендеринга, графический конвейер, буферы кадров и команды swapchain.Когда он воссоздает swapchain, он вызывает: vkGetPhysicalDeviceSurfaceCapabilitiesKHR, чтобы получить текущий экстент для поверхности, и передает текущий экстент в vkCreateSwapchainKHR через VkSwapchainCreateInfoKHR.imageExtent.Сразу после воссоздания swapchain, обновления матрицы перспективы и т. Д. Я рисую рамку.

Моя проблема в том, что VkSurfaceCapabilitiesKHR.currentExtent возвращается из vkGetPhysicalDeviceSurfaceCapabilitiesKHR с предыдущим размером поверхности.Эта проблема возникает, только если в игре ничего не происходит, и новый кадр некоторое время не рисуется.

Я могу решить эту проблему, передав значения ширины и высоты, полученные SurfaceHolder.Callback.surfaceChanged, врендеринг потока, а затем вниз к воссозданию свопчейн.Но я думаю, что это неправильное решение.Почему размер currentExtent не такой, как в документах?SurfaceHolder.Callback.surfaceChanged должен вызываться после того, как произошли все изменения на поверхности.

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

У меня включены слои проверки (и я знаю, что они работают), и они ничего не сообщают.

Дайте мне знать, если вам нужна дополнительная информация.Спасибо за вашу помощь.

...