android device monitor命令行窗口在哪里_Vulkan在Android使用Compute shader
oeip 相關(guān)功能只能運行在window平臺,想移植到android平臺,暫時選擇vulkan做為圖像處理,主要一是里面有單獨的計算管線且支持好,二是熟悉下最新的渲染技術(shù)思路。
這個 demo(git地址) 的功能很簡單,在android下,利用vulkan的compute shader對輸入圖進(jìn)行1-x的運行后,把計算結(jié)果復(fù)制到當(dāng)前交換鏈里正在渲染的圖像上顯示出來。
本文主要記錄其中一些過程,因為第一次嘗試類似開發(fā),所以有誤的地方歡迎大家指出。
前期準(zhǔn)備工作主要如下,VSCode C++環(huán)境配置,熟悉CMake。
為什么選擇vscode,而不是visual studio/android studio,主要是基于如下考慮,首先在win平臺方便調(diào)試與測試,在win平臺完成demo后再移植到android下就方便了,而visual studio/android studio分別在開發(fā)原生win/android下方便,而vscode+cmake的組合很方便在win平臺調(diào)試測試,然后平穩(wěn)生成相應(yīng)的android studio項目方案,然后在android studio里進(jìn)行調(diào)試封裝,并且最新android studio首選cmake構(gòu)建,更方便集成。VSCode必需的C++插件主要是如下幾個 C/C++ for Visual Studio Code/Cmake/Cmake tools.
然后我花了一些時間在vscode里編譯了ogre-next,并把它的cmake文件跟了一遍,大致了解了cmake的用法,總結(jié)了下 CMake常用命令 。
vulkan結(jié)合github上二個vulkan 的demo方案,初步了解vulkan API與渲染流程。vulkan網(wǎng)上說的二千多行代碼畫個三角形確實一點也不夸張,Vulkan API粒度細(xì),控制度高,以及為多線程渲染設(shè)計的渲染隊列,渲染命令及同步,所以代碼量看著就上去了,但是你根據(jù)你的需求簡單封裝下,如交換鏈,渲染管線,UBO,buffer等,再寫也就大部分業(yè)務(wù)邏輯代碼。簡單來說,先根據(jù)demo熟悉流程與API,再手動寫個2K多行的簡單demo,在這過程,通過比較以前opengl/dx的API流程熟悉與加深思路,然后根據(jù)你的需求確定一些參數(shù),封裝一些類,最后開始你的需求并反向不斷完善更新你的封裝庫。
知乎上各位大佬已經(jīng)把Vulkan API/Demo講解的非常清晰,這里就說下這個DEMO的流程,供大家參考,歡迎大家指出理解有誤的部分。
首先窗口初始化相關(guān),這部分也是android/window平臺區(qū)別最大的部分,注意這里有個大坑,不同win32下,在創(chuàng)建窗口的線程下可以直接創(chuàng)建surface,在android下需要等到窗口的消息APP_CMD_INIT_WINDOW里才能創(chuàng)建surface,android里的native activity初始化過程可以參考 Android——NativeActivity - C/C++ Apk開發(fā),創(chuàng)建surface過程,選擇呈現(xiàn)/渲染通道以及同步呈現(xiàn)與渲染的對象,創(chuàng)建renderpass,然后根據(jù)surface創(chuàng)建交換鏈,根據(jù)交換鏈得到呈現(xiàn)image列表,根據(jù)image列表得到fbo列表用于附著到RenderPass上用于渲染,這里選擇一種比較簡單的CommandBuffer記錄方式,就是有交換鏈有幾個image,就創(chuàng)建幾個對應(yīng)的CommandBuffer記錄.
然后創(chuàng)建邏輯設(shè)備,加載需要參與計算的輸入圖像資源,一般來說,圖像資源要使用compute shader,usage肯定要有VK_IMAGE_USAGE_STORAGE_BIT,而現(xiàn)在大部分硬件來說,線性 features不支持VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT,用于CPU 可以訪問的資源需要linera_tiling.簡單來說,compute shader要求的紋理,現(xiàn)在硬件上,CPU大部分不能直接訪問,這就要求一個中轉(zhuǎn),先創(chuàng)建一個CPU可以訪問的資源如vkbuffer,然后把數(shù)據(jù)導(dǎo)入這個資源中,然后通過設(shè)備資源間vkCmdCopyBufferToImage復(fù)制到原CPU不能訪問的GPU紋理上。然后創(chuàng)建一個compute shader要求的輸出紋理,對應(yīng)一個UBO結(jié)構(gòu),這個UBO對應(yīng)compute shader輸入輸出。加載轉(zhuǎn)化的spv文件,生成對應(yīng)的compute pipeline.
在這個需求里,渲染命令不會每楨修改,所以我們完全可以在開始楨渲染前就填充CommandBuffer。
注意,這里只是保存了動作,相當(dāng)于把action放入隊列中,并沒執(zhí)行隊列,在這里,所有在每楨運行前的邏輯已經(jīng)處理完。
然后到每楨渲染,如上先等計算管線的fences來信號,這表明GPU隊列中已經(jīng)執(zhí)行完成CommandBuffer,如下代碼的computerCmd又變成可執(zhí)行狀態(tài)。注意創(chuàng)建fences時需要先給信號,不然第一次進(jìn)入就會一起等待,并且fences需要手動reset.然后根據(jù)vkAcquireNextImageKHR得到的索引拿到呈現(xiàn)渲染的CommandBuffer,執(zhí)行完成呈現(xiàn)出來,呈現(xiàn)與渲染的同步都在設(shè)備GPU內(nèi),一般用VkSemaphore來同步,不同于vkFence,他用于gpu-gpu間的同步,自動reset.
void onPreDraw() {auto device = context->logicalDevice.device;vkWaitForFences(device, 1, &computerFence, VK_TRUE, UINT64_MAX);vkResetFences(device, 1, &computerFence);VkSubmitInfo submitInfo = {};submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;submitInfo.commandBufferCount = 1;submitInfo.pCommandBuffers = &context->computerCmd;VK_CHECK_RESULT(vkQueueSubmit(context->computeQueue, 1, &submitInfo, computerFence)); }在window平臺測試完,參照vulkan的demo,新建一個android文件夾,設(shè)置其中的setings.gragle.
主build.gradle就和一般的一樣,在vkcs1目錄下的build.gradle添加externalNativeBuild的cmake路徑,設(shè)置好AndroidManifest.xml,如下圖。
然后就可以用android studio打開這個文件夾,然后Sync Project with Gradle Files,就會補起成余下內(nèi)容,最后應(yīng)該是如下結(jié)構(gòu)。
正常來說,應(yīng)該就可以在android studio安裝及調(diào)試了。
最后說下在移植到android下遇到的一些坑。
參考:
https://github.com/LunarG/VulkanSamples vulkan基本API用法實例
https://github.com/SaschaWillems/Vulkan vulkan進(jìn)階demo.
https://www.zhihu.com/people/xiao-peng-you-38-21/posts 上面vulkan demo的講解。
Android——NativeActivity - C/C++ Apk開發(fā)
總結(jié)
以上是生活随笔為你收集整理的android device monitor命令行窗口在哪里_Vulkan在Android使用Compute shader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arp 项删除失败: 请求的操作需要提升
- 下一篇: taro引入f2图表_Package -