From 19a78997af2e2faa824848e4e2b925e5094924d3 Mon Sep 17 00:00:00 2001 From: zhouliang3 Date: Thu, 4 Jun 2020 11:00:01 +0800 Subject: [PATCH 1/2] Image.asset will block UI thread when load large image #58572 --- .../window/platform_message_response_dart.cc | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/ui/window/platform_message_response_dart.cc b/lib/ui/window/platform_message_response_dart.cc index dca1ab74f9d58..851fea6a55643 100644 --- a/lib/ui/window/platform_message_response_dart.cc +++ b/lib/ui/window/platform_message_response_dart.cc @@ -19,30 +19,44 @@ namespace { // Avoid copying the contents of messages beyond a certain size. const int kMessageCopyThreshold = 1000; +class DataWrapper { + public: + DataWrapper(void* data) { + data_ = data; + } + + ~DataWrapper() { + free(data_); + } + + private: + void* data_; +}; + void MessageDataFinalizer(void* isolate_callback_data, Dart_WeakPersistentHandle handle, void* peer) { - std::vector* data = reinterpret_cast*>(peer); + DataWrapper* data = reinterpret_cast(peer); delete data; } -Dart_Handle WrapByteData(std::vector data) { - if (data.size() < kMessageCopyThreshold) { +Dart_Handle WrapByteData(std::unique_ptr mapping) { + size_t size = mapping->GetSize(); + if (size < kMessageCopyThreshold) { + std::vector data(size); + memcpy(data.data(), mapping->GetMapping(), size); return ToByteData(data); } else { - std::vector* heap_data = new std::vector(std::move(data)); + void* data = malloc(size); + memset(data, 0, size); + memcpy(data, mapping->GetMapping(), size); + DataWrapper* wrapper = new DataWrapper(data); return Dart_NewExternalTypedDataWithFinalizer( - Dart_TypedData_kByteData, heap_data->data(), heap_data->size(), - heap_data, heap_data->size(), MessageDataFinalizer); + Dart_TypedData_kByteData, data, size, wrapper, size, + MessageDataFinalizer); } } -Dart_Handle WrapByteData(std::unique_ptr mapping) { - std::vector data(mapping->GetSize()); - memcpy(data.data(), mapping->GetMapping(), mapping->GetSize()); - return WrapByteData(std::move(data)); -} - } // anonymous namespace PlatformMessageResponseDart::PlatformMessageResponseDart( From b077e7b21274b847e759bbe5398b4f7e6cc7e1a1 Mon Sep 17 00:00:00 2001 From: zhouliang3 Date: Thu, 4 Jun 2020 14:40:24 +0800 Subject: [PATCH 2/2] Image.asset will block UI thread when load large image #58572 clear format --- lib/ui/window/platform_message_response_dart.cc | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/ui/window/platform_message_response_dart.cc b/lib/ui/window/platform_message_response_dart.cc index 851fea6a55643..38bb75cebbe31 100644 --- a/lib/ui/window/platform_message_response_dart.cc +++ b/lib/ui/window/platform_message_response_dart.cc @@ -21,13 +21,9 @@ const int kMessageCopyThreshold = 1000; class DataWrapper { public: - DataWrapper(void* data) { - data_ = data; - } + DataWrapper(void* data) { data_ = data; } - ~DataWrapper() { - free(data_); - } + ~DataWrapper() { free(data_); } private: void* data_; @@ -51,9 +47,9 @@ Dart_Handle WrapByteData(std::unique_ptr mapping) { memset(data, 0, size); memcpy(data, mapping->GetMapping(), size); DataWrapper* wrapper = new DataWrapper(data); - return Dart_NewExternalTypedDataWithFinalizer( - Dart_TypedData_kByteData, data, size, wrapper, size, - MessageDataFinalizer); + return Dart_NewExternalTypedDataWithFinalizer(Dart_TypedData_kByteData, + data, size, wrapper, size, + MessageDataFinalizer); } }