mirror of
https://github.com/openharmony/windowmanager.git
synced 2026-07-22 04:55:33 -04:00
improve window snapshot performance
Signed-off-by: Klaus_q <wangqi175@huawei.com> Change-Id: I3362fabc84ed287c87a258c2ee6f79aeada22bac
This commit is contained in:
@@ -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!");
|
||||
|
||||
Reference in New Issue
Block a user