Я пишу игру для 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?
У меня включены слои проверки (и я знаю, что они работают), и они ничего не сообщают.
Дайте мне знать, если вам нужна дополнительная информация.Спасибо за вашу помощь.