diff options
author | Yiwei Zhang <zzyiwei@google.com> | 2019-06-28 10:16:49 -0700 |
---|---|---|
committer | Yiwei Zhang <zzyiwei@google.com> | 2019-06-28 10:33:58 -0700 |
commit | 3c74da9ede3a50335ea1a5237d5565bb472e3141 (patch) | |
tree | 90cce5099afa8550da40d200941212416a37b2c1 | |
parent | 5e3645666e00d21144865177e6e8b3b740b4a4f7 (diff) | |
download | native-3c74da9ede3a50335ea1a5237d5565bb472e3141.tar.gz |
GpuStats: move the stats send at Activity launch off UI thread
Prevously when App Activity launches, we send GpuStats on the main UI thread.
The async binder to send the stats only takes 30us. However, to get the
gpuservice, the sync binder takes around 1.5ms because of the massive binders
on CPU at Activity launch. Thus we just move the stats sending to a separate
thread off the main UI thread. Now it's just 50us cost on the main UI thread.
Bug: 136228448
Test: systrace and check
Change-Id: Iff47dbc6a26a9d62ad33e92f93c079ac74fb3ea2
-rw-r--r-- | libs/graphicsenv/GraphicsEnv.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp index 1c5fa52855..24b6c2d6de 100644 --- a/libs/graphicsenv/GraphicsEnv.cpp +++ b/libs/graphicsenv/GraphicsEnv.cpp @@ -37,6 +37,7 @@ #include <memory> #include <string> +#include <thread> // TODO(b/37049319) Get this from a header once one exists extern "C" { @@ -163,17 +164,20 @@ void GraphicsEnv::setDriverPathAndSphalLibraries(const std::string path, void GraphicsEnv::hintActivityLaunch() { ATRACE_CALL(); - // If there's already graphics driver preloaded in the process, just send - // the stats info to GpuStats directly through async binder. - std::lock_guard<std::mutex> lock(mStatsLock); - if (mGpuStats.glDriverToSend) { - mGpuStats.glDriverToSend = false; - sendGpuStatsLocked(GraphicsEnv::Api::API_GL, true, mGpuStats.glDriverLoadingTime); - } - if (mGpuStats.vkDriverToSend) { - mGpuStats.vkDriverToSend = false; - sendGpuStatsLocked(GraphicsEnv::Api::API_VK, true, mGpuStats.vkDriverLoadingTime); - } + std::thread trySendGpuStatsThread([this]() { + // If there's already graphics driver preloaded in the process, just send + // the stats info to GpuStats directly through async binder. + std::lock_guard<std::mutex> lock(mStatsLock); + if (mGpuStats.glDriverToSend) { + mGpuStats.glDriverToSend = false; + sendGpuStatsLocked(GraphicsEnv::Api::API_GL, true, mGpuStats.glDriverLoadingTime); + } + if (mGpuStats.vkDriverToSend) { + mGpuStats.vkDriverToSend = false; + sendGpuStatsLocked(GraphicsEnv::Api::API_VK, true, mGpuStats.vkDriverLoadingTime); + } + }); + trySendGpuStatsThread.detach(); } void GraphicsEnv::setGpuStats(const std::string& driverPackageName, |