Add logic to clean up resources more frequently
Added call to Skia's performDeferredCleanup method to free resources that were not referenced within the last 100 frames or 10 seconds whichever is furthest away Bug: 188450217 Test: manual Change-Id: I3f37e1b5bd01330dbbc2da4a84b1259d56be2768
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -312,6 +312,7 @@ private:
|
||||
bool mExpectSurfaceStats = false;
|
||||
|
||||
std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
|
||||
void cleanupResources();
|
||||
};
|
||||
|
||||
} /* namespace renderthread */
|
||||
|
||||
Reference in New Issue
Block a user