Android 在 Vulkan 中失去焦点处理
Posted
技术标签:
【中文标题】Android 在 Vulkan 中失去焦点处理【英文标题】:Android lost focus handling in Vulkan 【发布时间】:2017-05-02 06:11:56 【问题描述】:我在 android 中使用 Vulkan,每当我触摸 Overview button
(方形的那个)并返回我的应用程序时,它都会崩溃。
失败的解决方案 1:
我在失去焦点时尝试停止渲染,然后在重新获得焦点时恢复渲染,但它不起作用,我在 vkAcquireNextImageKHR 崩溃。
失败的解决方案 2:
我尝试从地面到地面重新启动所有 Vulkan 对象,但可悲的是第一次失去焦点并获得焦点一切正常,但两次之后,它在同一点崩溃。
【问题讨论】:
它至少应该在崩溃之前给你一个丢失的设备。直接崩溃是一个错误 IMO 也许你是对的,也许不是,我不确定。但是在 vkAcquireNextImageKHR 上出现错误是有意义的,我仍在研究其他解决方案。 您使用的是 NativeActivity 还是混合 java/native 代码? vkAcquireNextImageKHR 真的会崩溃还是只是返回一个告诉您重新创建表面的值(例如 VK_ERROR_SURFACE_LOST_KHR)?如果发生这种情况,您需要重新创建交换链以及与其连接的所有资源。 没错!崩溃是一个愚蠢的词,实际上我得到了错误。我已经重新创建了交换链及其所有相关资源,但它仍然出现相同的错误,我想,我错过了一些东西,它需要大量时间来跟踪它。我更新了深度、模板、render_pass、pileline(不是缓存和布局)和绘制命令。 【参考方案1】:正如我的评论中所暗示的,检查 vkAcquireNextImageKHR 的结果以确定是否需要重新创建资源。如果它类似于 VK_ERROR_SURFACE_LOST_KHR,您需要重新创建表面和连接到它的所有资源,如交换链等。作为参考,请查看我的示例基类的 window resize function,如果 vkAcquireNextImageKHR 发出表面信号,该基类也被调用需要重新创建。
至于错误跟踪(根据您实际需要重新创建的内容)启用验证层。只需将它们与应用程序的 lib (.so) 一起放置,启用验证(请注意,您需要手动选择所有层,因为在 android 上没有像 VK_LAYER_LUNARG_standard_validation 这样的元层)并将验证消息输出到例如日志猫。你可以看到我的debug unit as a reference。
【讨论】:
以上是关于Android 在 Vulkan 中失去焦点处理的主要内容,如果未能解决你的问题,请参考以下文章
Android开发中EditText的点击Enter键焦点改变处理(获取焦点和失去焦点交互变化)