From 57b7c40835ded0b170f13f126af874ddc8f4859d Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Sun, 26 Oct 2025 21:54:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=EF=BC=8C=E8=B5=84=E6=BA=90=E4=B9=9F=E6=94=B9=E4=B8=BA=E8=8B=B1?= =?UTF-8?q?=E6=96=87=E5=90=8D=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/main.cpp | 16 ++++++--- .../base_makeup/press2/area/pic0.png} | Bin .../base_makeup/press2/area/pic0_thick.png} | Bin .../base_makeup/press2/direction/demo0.png | Bin 0 -> 20859 bytes .../press2/direction/demo0_thick.png | Bin 0 -> 26410 bytes .../base_makeup/press2/direction}/pic0.png | Bin .../press2/direction}/pic0_thick.png | Bin .../base_makeup/press2/direction}/pic1.png | Bin .../press2/direction}/pic1_thick.png | Bin .../base_makeup/press2/direction}/pic2.png | Bin .../press2/direction}/pic2_thick.png | Bin vulkan/Application.cpp | 16 +++++---- vulkan/Application.h | 6 ++-- vulkan/FaceApp.cpp | 32 +++++++++++++++--- vulkan/FaceApp.h | 4 +-- vulkan/main.cpp | 29 ++++++++-------- 16 files changed, 66 insertions(+), 37 deletions(-) rename example/src/main/assets/{底妆/基础上妆/2按压/区域/demo0.png => bottom_makeup/base_makeup/press2/area/pic0.png} (100%) rename example/src/main/assets/{底妆/基础上妆/2按压/区域/demo0_ex.png => bottom_makeup/base_makeup/press2/area/pic0_thick.png} (100%) create mode 100644 example/src/main/assets/bottom_makeup/base_makeup/press2/direction/demo0.png create mode 100644 example/src/main/assets/bottom_makeup/base_makeup/press2/direction/demo0_thick.png rename example/src/main/assets/{底妆/基础上妆/2按压/方向 => bottom_makeup/base_makeup/press2/direction}/pic0.png (100%) rename example/src/main/assets/{底妆/基础上妆/2按压/方向 => bottom_makeup/base_makeup/press2/direction}/pic0_thick.png (100%) rename example/src/main/assets/{底妆/基础上妆/2按压/方向 => bottom_makeup/base_makeup/press2/direction}/pic1.png (100%) rename example/src/main/assets/{底妆/基础上妆/2按压/方向 => bottom_makeup/base_makeup/press2/direction}/pic1_thick.png (100%) rename example/src/main/assets/{底妆/基础上妆/2按压/方向 => bottom_makeup/base_makeup/press2/direction}/pic2.png (100%) rename example/src/main/assets/{底妆/基础上妆/2按压/方向 => bottom_makeup/base_makeup/press2/direction}/pic2_thick.png (100%) diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp index 4bd32da..c7e260c 100644 --- a/app/src/main/cpp/main.cpp +++ b/app/src/main/cpp/main.cpp @@ -42,9 +42,9 @@ void android_main(struct android_app *pApp) { pApp->onAppCmd = handle_cmd; android_app_set_motion_event_filter(pApp, nullptr); - + long long _lastDrawFrameTime = chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); do { - auto ms = chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); + auto start_time = chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); // Process all pending events before running game logic. bool done = false; while (!done) { @@ -72,10 +72,16 @@ void android_main(struct android_app *pApp) { } if(application.isInited()) { - application.drawFrame(); + auto frameTime = (start_time - _lastDrawFrameTime); + _lastDrawFrameTime = chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); + application.drawFrame(frameTime); + } + auto end_time = chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); + auto function_time = (end_time - start_time); + if(function_time < 20) + { + this_thread::sleep_for(chrono::milliseconds((20-function_time))); } - auto end_ms = chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); - this_thread::sleep_for(chrono::milliseconds((end_ms-ms))); } while (!pApp->destroyRequested); application.cleanup(); } diff --git a/example/src/main/assets/底妆/基础上妆/2按压/区域/demo0.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/area/pic0.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/区域/demo0.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/area/pic0.png diff --git a/example/src/main/assets/底妆/基础上妆/2按压/区域/demo0_ex.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/area/pic0_thick.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/区域/demo0_ex.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/area/pic0_thick.png diff --git a/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/demo0.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/demo0.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e52443f8fcd210ff2bd54ba4460ef55c65e1bd GIT binary patch literal 20859 zcmeFYhf@?y)Hk|;paLS2ge6DGAUTT?c11uzaug&<&KVX_B*+p}a!?o%$q16e8emb9 zEIF@4m%Nhmo#%bOs#|sI{t4ey&34aB&*|Qt?h}6JocIU&Iy6^UuRtIW8Wd8~5CVaL zRT$(F1z79`4x1=N`|9i^s z6IY)(tpSpIAdJ$~cob~2F%y)_uhn!x@_Id#7Q=<|eZ$7^07?h9$Cj78gB9KkmEtjF zV5By!%&bhfBwToXn6r=!&Xu5~>YWM-L1L8(xowZKRbd*prm6I2kY*%BX- zwpmg7)FQIVys8my7eW3gjVYt<4Y0%~hOm|3bBzVo%1V#jA`8rOpeM*)960Z7+fqAq-0y%^p31KJp8xH78mq_BoN88RCW0M&H&w3>Ot4)*2hN*A-g6O`XTl1k?Pt{G10#GD*VyCmNok{1rK|D(wCsFP24EAjqvk9cDZ6~n?{Bf6 zvG5S9TlXm{A(7lP!Qg4p@PdPK7JFid9l$$W&wbqR4P27ox$qob^#H?=W5$ZqRLDkA(CeSg^YXLE%4!*p7 zlzCf5v4H|xn=c02f$A=eozN(}KWwsjz2Kw=7rh=d4q^VWP_7MOO1S)75GvniZ@6j9 z;Un$FVmG4D)Dps_L{fOq_iM=Of#7d}RlXqh!yyy)1Vt|p?Qc)VGP`Gqx{c4*| zo?IkIr~~KtgOY&{~gkFj^ zh2#Xqdt5pd;b07>8~;2N&Mlq8g;l~v`v_j-s662u7@32tlb0KJWmAt={B2y%1qr~y z z^;WG$VrUC9FP)w@Hg*3@;DG9r+oa7oJ4IX@U`ZCqpL$yfQBy0+!p2aTiNqQ~0|$I+ z1>zHzEYW?w)on0md165q?ak~Nl`(JloynGEOcIV%kQ%s@R zx8rNu{cKx|z))&tAMRi$tV>sgWBg+e@O8@GW}x**)#)xYQ~sad7~ zQdp&(3$!eM1_=h6DzQ|?&HkHjS`WS(8j#TioCZ5Y4ot_*T(X7bTAixqV=4^#D6Us4 zdxt&z7@tU(3Jp0(^tZ_HV*r#>S!=aB{$8?TZDFd+>&c`cCoH9=AA}Mju+Q(05-EsU z$k#10H@VJKG71o>uIs16$XR%+c!n%O2Ahx?*fKj-7#LXfnViQ1y^GB7`*MEBf^R;G zpyyYDS<~}Fcb3L_ErjHVS=-9ztoT)=4zKFq2RbM*63AD{NzSEkF4p$B;w@ACRNPCh z8@+^1hR8GToxN?EHsg*^$}1b=nXwGNki@?~%kPkuxBme00bJ-=$q)DG&foh`EGL?I zCD`ak+WTZ2dAqwL$Ni*V(4#g7#;ArLs)#Pm3iv)-u3i}nrQoIPZp zI9$5aV${}mBw!U9Go7puA2us*GQv=%kCgRCNsoAdF7nvNOiWc)TuhoX; z7sS@&$GwV73f+vY6U4J?-QDKGYaj=n`rF?m86WMX#(ltC7_Zy@9>;Mx(F^^f7*@8u zPVW#l>x#j_)b-deY`IlM*8XZHVk& zAa}*vo_;aAyM%$xIR}dByWk#WuNiV~GC3d2yf#*=<0T7#pX`k`oHZaiX@-$D2_b~8 z^<$~M%>4aaUXwq9_0VuA-;%pcYLt9T@Kg-x)wdK1Rgm1U27ieGult*ndZhH}mPTlp_?QT` zA(3K@)o#VAt5=&MlPny5XsNyoe=|=aeA2Qc-N3guS-t*|&)u@SKo@UrTGKOD+-CKC ziWa%0k!_Lt`{RLd{6IOx>(%hbIm+~3pd63`3;<2LIgk1Nci3m00(Wsq0VB^R;

} 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 literal 0 HcmV?d00001 diff --git a/example/src/main/assets/底妆/基础上妆/2按压/方向/pic0.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic0.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/方向/pic0.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic0.png diff --git a/example/src/main/assets/底妆/基础上妆/2按压/方向/pic0_thick.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic0_thick.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/方向/pic0_thick.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic0_thick.png diff --git a/example/src/main/assets/底妆/基础上妆/2按压/方向/pic1.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic1.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/方向/pic1.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic1.png diff --git a/example/src/main/assets/底妆/基础上妆/2按压/方向/pic1_thick.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic1_thick.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/方向/pic1_thick.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic1_thick.png diff --git a/example/src/main/assets/底妆/基础上妆/2按压/方向/pic2.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic2.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/方向/pic2.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic2.png diff --git a/example/src/main/assets/底妆/基础上妆/2按压/方向/pic2_thick.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic2_thick.png similarity index 100% rename from example/src/main/assets/底妆/基础上妆/2按压/方向/pic2_thick.png rename to example/src/main/assets/bottom_makeup/base_makeup/press2/direction/pic2_thick.png diff --git a/vulkan/Application.cpp b/vulkan/Application.cpp index 39e3400..b49e22d 100644 --- a/vulkan/Application.cpp +++ b/vulkan/Application.cpp @@ -127,8 +127,11 @@ void Application::mainLoop() #ifdef _WIN32 while (!glfwWindowShouldClose(window)) { + auto cur_time = getCurrentTimeMillis(); glfwPollEvents(); - drawFrame(); // 在这里调用 + auto functionTime = (cur_time - _lastDrawFrameTime); + _lastDrawFrameTime = getCurrentTimeMillis(); + drawFrame(functionTime); // 在这里调用 } #else @@ -448,7 +451,7 @@ void Application::createSyncObjects() } } -void Application::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) +void Application::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex, long long frameTime) { VkCommandBufferBeginInfo beginInfo{}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; @@ -473,7 +476,7 @@ void Application::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t im vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - render(commandBuffer); + render(commandBuffer, frameTime); // 结束渲染流程 vkCmdEndRenderPass(commandBuffer); @@ -483,7 +486,7 @@ void Application::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t im } } -void Application::render(VkCommandBuffer commandBuffer) +void Application::render(VkCommandBuffer commandBuffer, long long frameTime) { // 绑定图形管线 vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); @@ -492,7 +495,7 @@ void Application::render(VkCommandBuffer commandBuffer) vkCmdDraw(commandBuffer, 3, 1, 0, 0); } -void Application::drawFrame() +void Application::drawFrame(long long frameTime) { // 1. 等待前一帧完成 vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX); @@ -517,7 +520,7 @@ void Application::drawFrame() // 5. 记录命令缓冲区 vkResetCommandBuffer(commandBuffers[currentFrame], 0); - recordCommandBuffer(commandBuffers[currentFrame], imageIndex); + recordCommandBuffer(commandBuffers[currentFrame], imageIndex, frameTime); // 6. 提交命令缓冲区 VkSubmitInfo submitInfo{}; @@ -561,7 +564,6 @@ void Application::drawFrame() // 8. 前进到下一帧 currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT; - _lastDrawFrameTime = } void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator) { diff --git a/vulkan/Application.h b/vulkan/Application.h index 5f28180..a316774 100644 --- a/vulkan/Application.h +++ b/vulkan/Application.h @@ -37,10 +37,10 @@ public: void createPipelineLayout(); void createGraphicsPipeline(); void createRenderPass(); - void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); + void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex, long long frameTime); void createSyncObjects(); - void drawFrame(); - virtual void render(VkCommandBuffer commandBuffer); + void drawFrame(long long frameTime); + virtual void render(VkCommandBuffer commandBuffer, long long frameTime); virtual bool isInited() { return inited; } void processWithVulkan(uint8_t* data, int width, int height, int rowStride, size_t dataSize, Texture& out_texture, bool srgb); diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index 7374b9d..555ca00 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -4,7 +4,6 @@ - FaceApp* FaceApp::faceIns = nullptr; FaceApp::FaceApp(/* args */) @@ -515,8 +514,21 @@ void FaceApp::setup_descriptor_set() } -void FaceApp::render(VkCommandBuffer commandBuffer) +void FaceApp::render(VkCommandBuffer commandBuffer, long long frameTime) { + static long long game_time = 0; + game_time += frameTime; + long long actionTime = (1000 / _initArg.action_fps); + if (game_time > actionTime) + { + _curTexIndex++; + if (_curTexIndex >= _curMotion.png_num) + { + _curTexIndex = 0; + } + game_time = game_time - actionTime; + } + std::unique_lock lock(mtx); std::unique_lock lock_point(mtx_point); //Application::render(commandBuffer); @@ -527,7 +539,8 @@ void FaceApp::render(VkCommandBuffer commandBuffer) vkCmdPushConstants(commandBuffer, m_pipelineLayout_bg, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue); - //vkCmdDraw(commandBuffer, 6, 1, 0, 0); + vkCmdDraw(commandBuffer, 6, 1, 0, 0); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_sets[_curTexIndex], 0, NULL); @@ -604,8 +617,9 @@ void FaceApp::initVulkan() uploadVertexData(); last_update_time = getCurrentTimeMillis(); - faceAppInited = true; + changeMotion(_initArg.motion); + faceAppInited = true; #if _WIN32 std::vector floatArray; std::string& str = HardCodeData::Get().face_result_point_str; @@ -616,6 +630,7 @@ void FaceApp::initVulkan() } //ReceiveFacePoint(floatArray.data(), floatArray.size() / 3, 480, 480); + #endif } @@ -1003,8 +1018,15 @@ void FaceApp::changeMotion(Motion& motion) { string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type; string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png"; - loadTexture(path_name, m_texs[i], true); string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png"; +#ifdef _WIN32 + loadTextureExample(path_name, m_texs[i], true); + loadTextureExample(path_name_ex, m_texs_ex[i], true); +#else loadTexture(path_name, m_texs[i], true); + loadTexture(path_name, path_name_ex[i], true); +#endif // _WIN32 + + } } \ No newline at end of file diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h index 572f625..47b9021 100644 --- a/vulkan/FaceApp.h +++ b/vulkan/FaceApp.h @@ -29,7 +29,7 @@ struct InitArg int action_fps; float zoom; Motion motion; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(InitArg, action_fps, zoom) + NLOHMANN_DEFINE_TYPE_INTRUSIVE(InitArg, action_fps, zoom, motion); }; @@ -56,7 +56,7 @@ public: void initVulkan() override; - void render(VkCommandBuffer commandBuffer) override; + void render(VkCommandBuffer commandBuffer, long long frameTime) override; static FaceApp* Get() { return faceIns; } void update_face_vertex_buffer(float* pos, int pointCount); diff --git a/vulkan/main.cpp b/vulkan/main.cpp index bbd9be6..ee04497 100644 --- a/vulkan/main.cpp +++ b/vulkan/main.cpp @@ -2,16 +2,16 @@ #include "FaceApp.h" - int main() { InitArg init_arg; Motion motion; - motion.type = "底妆"; - motion.technique = "基础上妆"; - motion.step = "2按压"; - motion.show_type = "方向"; - motion.png_name = "pic"; - motion.png_num = 3; + motion.type = "bottom_makeup"; + motion.technique = "base_makeup"; + motion.step = "press2"; + motion.show_type = "direction"; + motion.png_name = "demo"; + motion.png_num = 1; +# init_arg.motion = motion; @@ -22,8 +22,6 @@ int main() { //motion.png_name = "pic"; //motion.png_num = 1; - //init_arg.motions.push_back(motion); - init_arg.action_fps = 3; init_arg.zoom = 1.5f; @@ -32,12 +30,13 @@ int main() { FaceApp app; app.SetInitArg(json_str.c_str()); app.initVulkan(); - try { - app.mainLoop(); - } catch (const std::exception& e) { - std::cerr << e.what() << std::endl; - return EXIT_FAILURE; - } + app.mainLoop(); + //try { + // app.mainLoop(); + //} catch (const std::exception& e) { + // std::cerr << e.what() << std::endl; + // return EXIT_FAILURE; + //} app.cleanup(); return EXIT_SUCCESS; } \ No newline at end of file