XinLingzinn 2024-07-24 13:41 采纳率: 0%
浏览 5

vulkan项目移植到Android平台不断闪屏

vulkan项目移植到Android平台不断闪屏

vulkan项目在Windows平台上运行正常,但是移植到Android平台之后界面会在有画面与黑屏之间快速闪屏
求提供求解决思路!
发现的的可能有用的调试信息:
1、swapChain.imageCount在Windows平台下为3,Android平台下为6。
2、画面对着物体的时候帧数为30帧数左右,画面移开物体帧数为80帧左右,闪屏的速度也随之增加。

开发工具:Android studio
开发环境:Windows 10 (Nvidia GeForce RTX 3050 Laptop)
运行测试设备:小米MI 10s (骁龙870)

一部分代码如下:prepare()

    void prepare() override
    {
        VulkanExampleBase::prepare();
        compute.commandBuffers.resize(swapChain.imageCount);
        frameObjects.resize(swapChain.imageCount);
        timestamps.resize(numTimestamps * frameObjects.size());
        computeTimestamps.resize(numComputeTimestamps * frameObjects.size());
        for (auto &frame : frameObjects) {
            createBaseFrameObjects(frame);
        }
        loadAssets();
        setupQueryPool();
        prepareOffscreenFramebuffers();
        prepareUniformBuffers();
        setupDescriptorPool();
        prepareCompute();
        setupLayoutsAndDescriptors();
        updateCamera(0);
        preparePipelines();

        // Semaphore for compute & graphics sync
        VkSemaphoreCreateInfo semaphoreCreateInfo = vks::initializers::semaphoreCreateInfo();
        VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphore));

        // Signal the semaphore
        VkSubmitInfo submitInfo = vks::initializers::submitInfo();
        submitInfo.signalSemaphoreCount = 1;
        submitInfo.pSignalSemaphores = &semaphore;
        VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
        VK_CHECK_RESULT(vkQueueWaitIdle(queue));

        prepared = true;
    }

Windows下正常运行不闪屏:

img

移植到Android平台下在有画面与黑屏之间快速闪屏:

img

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 13:41
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码和问题描述,闪屏问题可能与图像交换链(swap chain)的同步、资源加载或渲染流程有关。以下是一些可能的解决方案和调试步骤:

    1. 检查Swap Chain配置

    • 确保Android平台上的swapChain.imageCount设置是合适的。通常,这个值应该与您的Vulkan应用程序的刷新率和缓冲策略相匹配。在Android上,较高的值可能有助于减少撕裂,但也可能增加闪屏的风险。

    2. 同步机制检查

    • 检查您的同步机制是否正确实现。在Vulkan中,正确使用信号量(semaphores)和栅栏(fences)对于避免渲染问题至关重要。
    • 您的代码中创建了信号量,但没有立即使用它来同步命令缓冲区。确保在提交命令缓冲区时使用信号量。

    3. 资源加载和初始化

    • 确保所有资源在Android上正确加载和初始化。不同的平台可能需要不同的资源路径或加载方式。

    4. 调试和日志记录

    • 在关键的渲染步骤添加日志记录,这有助于识别问题发生的位置。例如,在prepare()函数中添加日志输出,记录信号量创建、命令提交和队列等待的状态。

    5. 性能分析

    • 根据您提供的帧率信息,考虑是否需要优化渲染流程。例如,当帧率变化时,可能需要调整渲染策略以保持性能稳定。

    6. 检查Android特定的问题

    • 检查是否有Android平台特有的问题,如Surface的创建和配置,以及与Android窗口系统交互的部分。

    7. 更新和适配

    • 确保您的Vulkan代码是最新的,并且已经适配了Android平台的特性。有时,平台特定的API调用或扩展是必要的。

    示例代码修改

    以下是对您提供的代码的修改建议,以增加日志输出和检查同步机制:

    void prepare() override {
        // ... 省略其他代码 ...
    
        // 创建信号量后立即检查其状态
        VkSemaphoreCreateInfo semaphoreCreateInfo = vks::initializers::semaphoreCreateInfo();
        VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphore));
        if (semaphore == VK_NULL_HANDLE) {
            std::cerr << "Failed to create semaphore." << std::endl;
            return;
        }
    
        // 提交命令缓冲区时使用信号量
        for (auto &commandBuffer : compute.commandBuffers) {
            VkSubmitInfo submitInfo = vks::initializers::submitInfo();
            submitInfo.waitSemaphoreCount = 1;
            submitInfo.pWaitSemaphores = &semaphore;
            submitInfo.commandBufferCount = 1;
            submitInfo.pCommandBuffers = &commandBuffer;
            submitInfo.signalSemaphoreCount = 1;
            submitInfo.pSignalSemaphores = &semaphore;
    
            VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
        }
    
        // 等待队列空闲,确保所有命令都已完成
        VK_CHECK_RESULT(vkQueueWaitIdle(queue));
    
        prepared = true;
    }
    

    总结

    解决闪屏问题可能需要您对代码进行细致的调试和分析。上述建议提供了一些可能的解决方案和调试步骤,希望能够帮助您解决问题。如果问题仍然存在,可能需要更深入地分析您的渲染流程和Android平台的特定行为。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月24日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见