Loading libs/hwui/renderthread/CacheManager.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -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 */ libs/hwui/renderthread/CacheManager.h +3 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <SkSurface.h> #include <utils/String8.h> #include <vector> #include "utils/TimeUtils.h" namespace android { Loading Loading @@ -53,6 +54,8 @@ public: size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; } void onFrameCompleted(); void performDeferredCleanup(nsecs_t cleanupOlderThanMillis); private: friend class RenderThread; Loading libs/hwui/renderthread/CanvasContext.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -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++; Loading Loading @@ -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; Loading libs/hwui/renderthread/CanvasContext.h +1 −0 Original line number Diff line number Diff line Loading @@ -312,6 +312,7 @@ private: bool mExpectSurfaceStats = false; std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback; void cleanupResources(); }; } /* namespace renderthread */ Loading Loading
libs/hwui/renderthread/CacheManager.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -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 */
libs/hwui/renderthread/CacheManager.h +3 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <SkSurface.h> #include <utils/String8.h> #include <vector> #include "utils/TimeUtils.h" namespace android { Loading Loading @@ -53,6 +54,8 @@ public: size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; } void onFrameCompleted(); void performDeferredCleanup(nsecs_t cleanupOlderThanMillis); private: friend class RenderThread; Loading
libs/hwui/renderthread/CanvasContext.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -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++; Loading Loading @@ -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; Loading
libs/hwui/renderthread/CanvasContext.h +1 −0 Original line number Diff line number Diff line Loading @@ -312,6 +312,7 @@ private: bool mExpectSurfaceStats = false; std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback; void cleanupResources(); }; } /* namespace renderthread */ Loading