从分屏到全屏后的幻像

问题描述 投票:1回答:1

我正在使用NDK为Android编写游戏。如果可用,我的游戏使用vulkan,否则使用OpenGL。

我有一个问题,如果你将游戏置于分屏模式,设备保持纵向,然后将游戏调整为全屏模式,旧视图上的游戏后图仍然可见。注意:使用游戏执行此操作会触发要调用的SurfaceHolder.Callback.surfaceDestroyed(在Java中),这反过来会在C ++中关闭我的渲染线程。我对surfaceDestroyed的回调告诉C ++渲染线程停止,然后加入它。

我可以通过调用任何颜色的glClearColor在OpenGL中解决这个问题,然后在渲染线程关闭之前调用eglSwapBuffers。

这是OpenGL的有效修复吗?还有什么我应该做的清理旧表面吗?我确认在退出渲染线程之前,我从ANativeWindow_fromSurface获取的窗口上调用了ANativeWindow_release。

然后我尝试在vulkan中做同样的事情并再次遇到问题...我使用vkCmdClearColorImage执行以下操作:

(1)vkQueueWaitIdle(presentQueue)

(2)vkAquireNextImageKHR

(3)初始化相应的命令缓冲区:

(3a)ImageMemoryBarrier VK_IMAGE_LAYOUT_UNDEFINED - > VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,0 - > VK_ACCESS_TRANSFER_WRITE_BIT

(3b)vkCmdClearColor VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL

(3c)ImageMemoryBarrier VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL - > VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,VK_ACCESS_TRANSFER_WRITE_BIT - > VK_ACCESS_MEMORY_READ_BIT

(4)vkQueueSubmit(graphicsQueue ...)

(5)vkQueuePresentKHR(presentQueue ...)

(6)vkQueueWaitIdle(presentQueue)

我得到3a,然后我在验证层中出现错误,说明图像不是用VK_IMAGE_USAGE_TRANSFER_DST_BIT使用标志创建的。如何使用此使用位创建交换链图像?

如果需要其他信息,请与我们联系。谢谢!

android opengl-es android-ndk vulkan
1个回答
1
投票

Vulkan部分非常自我解释;有一个imageUsage成员。我来给你代码:

VkSurfaceCapabilitiesKHR caps;
errco = vkGetPhysicalDeviceSurfaceCapabilitiesKHR( pdev, mySurface, &caps ); if(errco) panic();
if( !(caps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) ) panic();

VkSwapchainCreateInfoKHR sci = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
sci.surface = mySurface;
sci.imageUsage = VK_IMAGE_USAGE_TRANSFER_DST_BIT; // !
// etc

VkSwapchainKHR mySwapchain;
errco = vkCreateSwapchainKHR( dev, &sci, nullptr, &mySwapchain ); if(errco) panic();

虽然你可能不应该这样做。没有理由做vkCmdClearColorImage。在打算写入之前使用渲染过程来清除彩色图像(VkAttachmentDescription::loadOp)。它更有效,作为奖励,它算作渲染,不需要使用TRANSFER

假设您的应用程序无法及时提供新图像,那么windowBackgroundFallback似乎应该是此的一般解决方案。

摆脱幻影图像的最佳解决方案是告诉android如果屏幕调整大小,不要关闭应用程序。这样,可以通过重新创建交换链并重新绘制游戏来处理屏幕大小调整。这个article在清单文件中设置android:configChanges。当屏幕从分屏调整为全屏时,以下设置会阻止android关闭应用程序:

android:configChanges="screenSize|orientation|screenLayout"

© www.soinside.com 2019 - 2024. All rights reserved.