PowerVR 是Imagination公司生產(chǎn)的一種GPU系列。早期的蘋果A系列芯片優(yōu)秀的GPU性能大多是基于Power VR GPU實(shí)現(xiàn)的。從早期的游戲機(jī)實(shí)體建模到現(xiàn)在的移動終端設(shè)備圖形計(jì)算中都能夠見到它的身影,雖中間有多次動蕩,至今依舊在汽車HMI系統(tǒng)中占據(jù)著比較大的份額。
創(chuàng)新互聯(lián)建站于2013年開始,先為本溪等服務(wù)建站,本溪等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為本溪企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。如何獲取Power VR GPU數(shù)據(jù)雖然對于Power VR的GPU,近期已經(jīng)很難見到了。不過依舊還是有不少性價比手機(jī)內(nèi)部使用的是Power VR,而Imagination也很給力,把對應(yīng)的API全都開源了,所以相比Adreno和Mali就方便不少。我們可以直接從開源代碼中直接學(xué)習(xí)。
https://github.com/powervr-graphics/Native_SDKhttps://github.com/powervr-graphics/Native_SDK在這個PowerVR開源的SDK中,包含了多個Demo,這邊主要介紹的是如何獲取性能數(shù)據(jù)。
我們以vulkan為例,將該項(xiàng)目clone到本地之后,進(jìn)入到以下路徑“Native_SDK/examples/Vulkan/PVRScopeExample/”
這邊我們可以簡單地使用Android Studio打開build-android文件夾,就會直接加載對應(yīng)的庫內(nèi)容。其中可能存在這樣一些問題。
Android存在的問題1. Cmake路徑?jīng)]有指定(cmake沒有識別出來)
com.intellij.openapi.externalSystem.model.ExternalSystemException (no error message)
* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
com.intellij.openapi.externalSystem.model.ExternalSystemException:
at org.jetbrains.plugins.gradle.model.ProjectImportAction.addBuildModels(ProjectImportAction.java:258)
at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:116)
at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:41)
at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:64)
at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.runAction(ClientProvidedPhasedActionRunner.java:120)
at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.run(ClientProvidedPhasedActionRunner.java:110)
at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.buildFinished(ClientProvidedPhasedActionRunner.java:104)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
這個問題就是配置問題,可以在local.properties中設(shè)置cmake的路徑,在里面加上
cmake.dir=D\:\\SDK\\cmake\\3.18.1
具體路徑根據(jù)用戶計(jì)算機(jī)的cmake路徑和版本決定。
主要還是因?yàn)锳ndroid Studio上默認(rèn)安裝的cmake和配置要求的版本號不匹配。
2. NDK路徑問題
同樣的,在local.properties中設(shè)置ndk的路徑,在里面加上
ndk.dir=D\:\\SDK\\ndk\\21.4.7075529
具體的路徑依舊是根據(jù)用戶計(jì)算機(jī)中的ndk路徑配置。
加載完成正確加載Android Studio后,會在Gradle Scipts下面出現(xiàn)其他幾個module的build.gradle文件,這是因?yàn)榧幢闶呛唵蔚腜VRScope Example也是需要依賴于其他Module的。
這時候只需要點(diǎn)擊菜單欄 Build->Build Bundle(s)/APK(s)->Build APK(s)即可。
但是這時候感覺會有點(diǎn)懵逼,因?yàn)榇蜷_主要的Java文件中,我們只會看到一個簡單的Java文件,內(nèi)容也很簡單,如下:
package com.powervr.VulkanPVRScopeExample;
import android.app.NativeActivity;
import android.os.Bundle;
import android.widget.Toast;
import android.view.Gravity;
public class VulkanPVRScopeExample extends NativeActivity
{
public void displayExitMessage(final String text)
{
runOnUiThread(new Runnable() {
public void run() {
Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
});
}
}
那么這個APK的核心究竟在哪里呢?
這時候可以注意到,這個Class繼承的是NativeActivity,因此主要的代碼應(yīng)該是外圍的C源碼。
C++ Android 源碼該源碼主要指的是VulkanPVRScopeExample.cpp文件
包括initApplication, initView, releaseView, quitApplication和renderFrame,我們都能很清楚的看懂內(nèi)部邏輯,但是對于C/C++不太熟悉的就會比較困難了。
這個文件中主要是對于UI框架和顯示以及動作的一些描寫,如果要關(guān)注具體的值獲取可以跳過。
C++獲取圖形數(shù)據(jù)該源碼主要指的是PVRScopeGraph.h和PVRScopeGraph.cpp文件
在源碼中,構(gòu)建了
class PVRScopeGraph
用于直接獲取PVR的圖形數(shù)據(jù)。在里面封裝了如下方法,主要也是通過調(diào)用如下方法獲取所需的圖形圖像數(shù)據(jù)。
uint32_t getActiveGroup() const { return activeGroup; }
float getMaximumOfData(uint32_t nCounter);
float getMaximum(uint32_t nCounter);
void setMaximum(uint32_t nCounter, float fMaximum);
float getStandardFPS() const;
int32_t getStandardFPSIndex() const;
float getStandard2D() const;
int32_t getStandard2DIndex() const;
float getStandard3D() const;
int32_t getStandard3DIndex() const;
float getStandardTA() const;
int32_t getStandardTAIndex() const;
float getStandardCompute() const;
int32_t getStandardComputeIndex() const;
float getStandardShaderPixel() const;
int32_t getStandardShaderPixelIndex() const;
float getStandardShaderVertex() const;
int32_t getStandardShaderVertexIndex() const;
float getStandardShaderCompute() const;
int32_t getStandardShaderComputeIndex() const;
uint32_t getCounterNum() const { return numCounter; }
const char* getCounterName(const uint32_t i) const;
int getCounterGroup(const uint32_t i) const;
如果要開發(fā)對應(yīng)的C++應(yīng)用就很方便,但是如果要在Android使用Jni的方法編寫對應(yīng)的app就非常麻煩,需要在setting.gradle中將所有的模塊Include進(jìn)來,這多種依賴又是一個比較大的工程,容易牽一發(fā)而動全身,顯然不是一個非常方便的做法。
另辟蹊徑我這邊的目標(biāo)主要是通過APK或者app_process的方式獲取手機(jī)內(nèi)的Power VR的圖形圖像信息,最好還是能夠通過Java或者kotlin + Jni的方式實(shí)現(xiàn),比起include這么多module,如果能夠直接把需要的內(nèi)容剝離出來就好了。
https://github.com/powervr-graphics/PVRMonitorhttps://github.com/powervr-graphics/PVRMonitorPowerVR官方還提供了一個apk的項(xiàng)目,里面很簡單地將Scope內(nèi)容剝離出來,倒是可以直接小修小改用上。
該項(xiàng)目使用Jni的方式調(diào)用了PVRScopeGraph和CpuMetrics(順便),不過項(xiàng)目時間比較長,實(shí)際使用起來會發(fā)現(xiàn)在現(xiàn)在(date up to 2022)的一些設(shè)備,甚至是早期的Redmi 9A手機(jī),都不是很支持的樣子。這是因?yàn)閷?yīng)的內(nèi)容需要修改。
修改方式1. 更換.so文件
在上一節(jié)中說到了,最好是將各種Module直接剝離出來,這邊就是采取了這樣的思路,將各種需要的模塊編譯出libPVRScopeDeveloper.so,然后直接調(diào)用里面的方法,里面的方法在PVRScopeStats.h里面,可以進(jìn)行參考。
但是存在的問題在于,這個項(xiàng)目的so文件過于老舊,所以需要更換最新的,需要自己編譯出新版的libPVRScopeDeveloper.so文件,當(dāng)然也可以下載官方的PVRTune Developers,然后尋找對應(yīng)的so文件拷貝出來替換。
2. 添加初始化代碼
在PVRScopeHUD.cpp文件中的initialisePVRScope()方法中,本意是用來初始化PVR數(shù)據(jù)讀取的,但是在初始化的過程中獲取了一次Counter,而在PVRScopeStats.h中有說明,在獲取Counter數(shù)據(jù)前需要不時地調(diào)用PVRScopeReadCounters方法,所以在該方法的
//Initialise the counter data structures.
之前,最好加上一句
readCounters(true); // this method is defined in the class
直接調(diào)用了原項(xiàng)目已經(jīng)封裝好的readcounters,再獲取一次Counter數(shù)據(jù)就能夠不出問題了。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧