diff options
| author | 2021-06-15 18:33:38 +0000 | |
|---|---|---|
| committer | 2021-06-15 18:33:38 +0000 | |
| commit | 54fbff341ee51126c88a135a6a639e8bf3febee4 (patch) | |
| tree | 3ddaab6db3d8dd30b5c586806e27a0ada8868317 /libs | |
| parent | 1e40e4068d4a030f12e2bb7df94fa3518131863d (diff) | |
| parent | dd1fcab19a5d02eefd2b38baa680ab4dcef65071 (diff) | |
Merge "Add logic to clean up resources more frequently" into sc-dev
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/hwui/renderthread/CacheManager.cpp | 8 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CacheManager.h | 3 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 16 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 1 |
4 files changed, 28 insertions, 0 deletions
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp index 46e806081c0c..ded2b06fb3cf 100644 --- a/libs/hwui/renderthread/CacheManager.cpp +++ b/libs/hwui/renderthread/CacheManager.cpp @@ -210,6 +210,14 @@ void CacheManager::onFrameCompleted() { } } +void CacheManager::performDeferredCleanup(nsecs_t cleanupOlderThanMillis) { + if (mGrContext) { + mGrContext->performDeferredCleanup( + std::chrono::milliseconds(cleanupOlderThanMillis), + /* scratchResourcesOnly */true); + } +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/CacheManager.h b/libs/hwui/renderthread/CacheManager.h index 713ea990ff23..af82672c6f23 100644 --- a/libs/hwui/renderthread/CacheManager.h +++ b/libs/hwui/renderthread/CacheManager.h @@ -23,6 +23,7 @@ #include <SkSurface.h> #include <utils/String8.h> #include <vector> +#include "utils/TimeUtils.h" namespace android { @@ -53,6 +54,8 @@ public: size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; } void onFrameCompleted(); + void performDeferredCleanup(nsecs_t cleanupOlderThanMillis); + private: friend class RenderThread; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index a0d93e928876..8bfc2c14ad7c 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -461,6 +461,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy } void CanvasContext::stopDrawing() { + cleanupResources(); mRenderThread.removeFrameCallback(this); mAnimationContext->pauseAnimators(); mGenerationID++; @@ -619,10 +620,25 @@ nsecs_t CanvasContext::draw() { } } + cleanupResources(); mRenderThread.cacheManager().onFrameCompleted(); return mCurrentFrameInfo->get(FrameInfoIndex::DequeueBufferDuration); } +void CanvasContext::cleanupResources() { + auto& tracker = mJankTracker.frames(); + auto size = tracker.size(); + auto capacity = tracker.capacity(); + if (size == capacity) { + nsecs_t nowNanos = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t frameCompleteNanos = + tracker[0].get(FrameInfoIndex::FrameCompleted); + nsecs_t frameDiffNanos = nowNanos - frameCompleteNanos; + nsecs_t cleanupMillis = ns2ms(std::max(frameDiffNanos, 10_s)); + mRenderThread.cacheManager().performDeferredCleanup(cleanupMillis); + } +} + void CanvasContext::reportMetricsWithPresentTime() { if (mFrameMetricsReporter == nullptr) { return; diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 6f90e81e51b0..4bdc2514db8c 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -312,6 +312,7 @@ private: bool mExpectSurfaceStats = false; std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback; + void cleanupResources(); }; } /* namespace renderthread */ |