improve window snapshot performance

Signed-off-by: Klaus_q <wangqi175@huawei.com>
Change-Id: I3362fabc84ed287c87a258c2ee6f79aeada22bac
This commit is contained in:
Klaus_q
2022-03-22 16:25:13 +08:00
parent 0e392fefe0
commit 687fa976c6
2 changed files with 11 additions and 14 deletions
@@ -18,6 +18,7 @@
#include <snapshot.h>
#include <transaction/rs_interfaces.h>
#include "future.h"
#include "window_root.h"
#include "snapshot_stub.h"
#include "window_manager_hilog.h"
@@ -41,22 +42,27 @@ private:
WMError TakeSnapshot(const std::shared_ptr<RSSurfaceNode>& surfaceNode, AAFwk::Snapshot& snapshot);
class GetSurfaceCapture : public SurfaceCaptureCallback {
class GetSurfaceCapture : public SurfaceCaptureCallback, public Future<std::shared_ptr<Media::PixelMap>> {
public:
GetSurfaceCapture() = default;
~GetSurfaceCapture() {};
void OnSurfaceCapture(std::shared_ptr<Media::PixelMap> pixelmap) override
{
if (flag_ == false) {
FutureCall(pixelmap);
}
protected:
void Call(std::shared_ptr<Media::PixelMap> pixelmap) override
{
if (!flag_) {
pixelMap_ = pixelmap;
flag_ = true;
}
}
bool IsPixelMapOk()
bool IsReady() override
{
return flag_;
}
std::shared_ptr<Media::PixelMap> GetPixelMap()
std::shared_ptr<Media::PixelMap> FetchResult() override
{
return pixelMap_;
}
@@ -34,16 +34,7 @@ WMError SnapshotController::TakeSnapshot(const std::shared_ptr<RSSurfaceNode>& s
std::shared_ptr<GetSurfaceCapture> callback = std::make_shared<GetSurfaceCapture>();
rsInterface_.TakeSurfaceCapture(surfaceNode, callback, scaleW, scaleH);
int counter = 0;
while (!callback->IsPixelMapOk()) {
usleep(10000); // 10000us equals to 10ms
counter++;
if (counter >= 200) { // wait for 200 * 10ms = 2s
WLOGFE("Failed to get pixelmap, timeout");
return WMError::WM_ERROR_NULLPTR;
}
}
std::shared_ptr<Media::PixelMap> pixelMap = callback->GetPixelMap();
std::shared_ptr<Media::PixelMap> pixelMap = callback->GetResult(2000); // wait for 2000ms
if (pixelMap == nullptr) {
WLOGFE("Failed to get pixelmap, return nullptr!");