From 6ef6e012bd81b17da20d1b83c62f8fb4a585988e Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Wed, 24 Dec 2025 21:01:14 +0800 Subject: [PATCH] save code --- app/src/main/cpp/main.cpp | 2 ++ vulkan/Application.cpp | 32 +++++++++++++++++++++++++++++++- vulkan/Application.h | 3 ++- vulkan/FaceApp.cpp | 17 +++++++++++++---- vulkan/FaceApp.h | 4 +++- vulkan/main.cpp | 3 ++- 6 files changed, 53 insertions(+), 8 deletions(-) diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp index 41f45fc..54d346b 100644 --- a/app/src/main/cpp/main.cpp +++ b/app/src/main/cpp/main.cpp @@ -93,6 +93,8 @@ void android_main(struct android_app *pApp) { } } while (!pApp->destroyRequested); //application.cleanup(); + g_Application->cleanupSecondInit(); + g_Application->clearnSecondFaceApp(); } } diff --git a/vulkan/Application.cpp b/vulkan/Application.cpp index ca5eb8a..2a5c871 100644 --- a/vulkan/Application.cpp +++ b/vulkan/Application.cpp @@ -75,12 +75,42 @@ void Application::initVulkan() } if (!_sceondInited) { - vkDestroySurfaceKHR(instance, surface, nullptr); + createSurface(); + createSwapChain(); // 创建交换链 + createImageViews(); // 创建交换链图像视图 + createRenderPass(); // 创建渲染流程 + createPipelineLayout(); // 在这里调用 + createGraphicsPipeline(); // 创建图形管线 + createFramebuffers(); // 创建帧缓冲区 _sceondInited = true; } } +void Application::cleanupSecondInit() +{ + vkDestroySwapchainKHR(device, swapChain, nullptr); + vkDestroySurfaceKHR(instance, surface, nullptr); + vkDestroyPipeline(device, graphicsPipeline, nullptr); + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); + vkDestroyRenderPass(device, renderPass, nullptr); + for (auto imageView : swapChainImageViews) { + vkDestroyImageView(device, imageView, nullptr); + } + for (auto framebuffer : swapChainFramebuffers) + { + if (framebuffer != VK_NULL_HANDLE) + { + vkDestroyFramebuffer(device, framebuffer, nullptr); + } + } + swapChainFramebuffers.clear(); + + _sceondInited = false; +} + + + void Application::createImageViews() { swapChainImageViews.resize(swapChainImages.size()); diff --git a/vulkan/Application.h b/vulkan/Application.h index d7d6472..0b29baf 100644 --- a/vulkan/Application.h +++ b/vulkan/Application.h @@ -66,6 +66,7 @@ protected: VkPipeline graphicsPipeline; // 图形管线 std::vector swapChainFramebuffers; // 帧缓冲区 VkQueue presentQueue; // 呈现队列 + bool _sceondInited = true; public: VkCommandPool commandPool; @@ -78,8 +79,8 @@ public: int currentFrame = 0; int MAX_FRAMES_IN_FLIGHT = 2; bool _applicationInited = false; + void cleanupSecondInit(); - bool _sceondInited = true; protected: void loadTexture(std::string path, Texture& tex, bool srgb, VkCommandPool pool); diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index 9a21d36..0ccb824 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -741,7 +741,7 @@ void FaceApp::render(VkCommandBuffer commandBuffer, long long frameTime) #ifdef _WIN32 vkCmdDrawIndexed(commandBuffer, obj_indices.size(), 1, 0, 0, 0); #else - //if (getCurrentTimeMillis() - last_update_time < 2000) + if (getCurrentTimeMillis() - last_update_time < 2000) { vkCmdDrawIndexed(commandBuffer, obj_indices.size(), 1, 0, 0, 0); } @@ -836,6 +836,18 @@ void FaceApp::initVulkan() #endif } + + if (!_secondfaceAppInited) + { + Start(); + _playMotion = true; + _secondfaceAppInited = true; + } +} + +void FaceApp::clearnSecondFaceApp() +{ + _secondfaceAppInited = false; } void FaceApp::Start() @@ -912,9 +924,6 @@ void FaceApp::uploadVertexData() { void FaceApp::update_face_vertex_buffer(float* pos, int pointCount) { - if (pointCount == 0x33435342) { - return; - } if(!isInited()) { return; diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h index e11ba9f..8ee3ff8 100644 --- a/vulkan/FaceApp.h +++ b/vulkan/FaceApp.h @@ -161,8 +161,9 @@ private: VkDescriptorSetLayout m_descriptorSetLayout_bg = VK_NULL_HANDLE; VkDescriptorSet m_descriptor_set_bg = VK_NULL_HANDLE; - + bool _secondfaceAppInited = true; public: + void clearnSecondFaceApp(); void Start(); void Stop(); void loadMotionThread(); @@ -211,6 +212,7 @@ public: void ResumeMotion(); bool _faceAppInited = false; + }; #endif diff --git a/vulkan/main.cpp b/vulkan/main.cpp index 1d59a44..cdc5d42 100644 --- a/vulkan/main.cpp +++ b/vulkan/main.cpp @@ -179,7 +179,8 @@ int main() { //threadRun = true; //std::thread t(threadFunction); app.mainLoop(); - app._sceondInited = false; + app.cleanupSecondInit(); + //threadRun = false; //t.join(); //try {