note11g/flutter_naver_map

[Android] `MapController`를 통한 지도에 변경이 이루어지는 경우 지도 뷰의 첫 프레임이 복사되지 않음

note11g opened this issue · 2 comments

ko: [Android] MapController를 통한 지도에 변경이 이루어지는 경우 지도 뷰의 첫 프레임이 복사되지 않음
en(general): [Android] Only One Start Frame from Android TextureView Doesn't Copied to Flutter Platform View(TLHC)

About issue

ko

controller.addOverlay메서드나, controller.updateCamera 같은 메서드를 활용할 때,
변경으로 인한 해당 시퀀스(프레임의 연속)가 시작되는 첫 프레임에서 copy가 정상적으로 이루어지지 않음.

오버레이를 추가하는 addOverlay메서드의 경우, 오버레이가 지도에 바로 보여지지 않고, 강제로 다른 프레임을 만들어야 정상적으로 보여짐. (Frame Copy Failed)

카메라의 이동을 시작하는 controller.updateCamera 같은 메서드의 경우, 시작되는 프레임들이 끊겨서 보이게 됨. (jank)

이런 문제는 해결할 수 있는 방법이 있는지 아직까지는 찾지 못함.

시도해본 방법은 두가지인데,

  1. setState() : 당연하게도, 위젯 상태에 변경이 없을 때 호출한다고 해서 프레임이 다시 그려지지는 않으므로, 효과가 없음.
  2. SchedulerBinding.instance.scheduleForcedFrame() : 강제로 프레임을 렌더하려 하였으나, 플랫폼뷰가 이미 frame을 처리했다고 간주하는 것으로 보임.

en

When utilizing methods like controller.addOverlay or controller.updateCamera, the copy isn't properly executed in the first frame where the sequence (continuous frames) starts due to the changes.

For the addOverlay method that adds an overlay, the overlay does not immediately appear on the map, and a separate frame must be forcibly created for it to appear correctly (Frame Copy Failed).

In the case of methods like controller.updateCamera that start moving the camera, the starting frames appear to be interrupted (jank).

I have yet to find a solution to these problems.

I tried two methods,

  1. setState(): As expected, it doesn't redraw the frame when called with no changes in the widget state, so it has no effect.
  2. SchedulerBinding.instance.scheduleForcedFrame(): I tried to forcibly render the frame, but it seems to be considered that the platform view has already processed the frame.

Reproduce Steps

Environment: TLHC + TextureView
(In flutter_naver_map, using that combination in SDK 23~29, SDK 33~34.
30~32: TLHC+GLSurfaceView, this issue not produced)

Produced with SDK 23~29, 33~34 android emulator, Samsung Galaxy S23 Ultra(SDK 34)
Flutter 3.19.0(Stable), 3.19.1(Stable), 3.19.2(Stable), Flutter 3.20.0-16.0.pre.54(Main Channel)

(Not Produced at HC or GLSurfaceView)

all modes can be re-produced : debug mode, profile mode, release mode

Using This Sample Repository: https://github.com/note11g/flutter_naver_map_pure_example/tree/tlhc_copy_issue
(if you want test on flutter sdk main channel, please use flutter_naver_map: git: url: https://github.com/note11g/flutter_naver_map.git ref: migrate_3.20)

  1. turn on app
  2. tab FloatingActionButton. then, addMarker method will be launched.
  3. see the result and scroll the map view.

Video

Issue (Android 14)

IMG_0017.2.MOV

Non-Issue (iOS)

20240302_133939.mp4

Logs

[NaverMapSdk] SDK Initialized! (android, SDK 33)
I/PlatformViewsController(15894): Hosting view in view hierarchy for platform view: 0
I/PlatformViewsController(15894): PlatformView is using ImageReader backend
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
W/Parcel  (15894): Expecting binder but got null!
D/EGL_emulation(15894): app_time_stats: avg=105529.19ms min=12.30ms max=633095.62ms count=6
D/HostConnection(15894): createUnique: call
D/HostConnection(15894): HostConnection::get() New Host Connection established 0xb40000773e4d81d0, tid 16446
D/HostConnection(15894): HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_vulkan_queue_submit_with_commands ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 
D/EGL_emulation(15894): eglCreateContext: 0xb40000773e4d93d0: maj 3 min 0 rcv 3
D/EGL_emulation(15894): eglMakeCurrent: 0xb40000773e4d93d0: ver 3 0 (tinfo 0x79651d1280) (first time)
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/ImageTextureRegistryEntry(15894): Dropping PlatformView Frame
D/EGL_emulation(15894): app_time_stats: avg=506.45ms min=62.32ms max=950.58ms count=2
D/TrafficStats(15894): tagSocket(437) with statsTag=0xffffffff, statsUid=-1
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/ImageTextureRegistryEntry(15894): Dropping PlatformView Frame
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/ImageTextureRegistryEntry(15894): Dropping PlatformView Frame
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/ImageTextureRegistryEntry(15894): Dropping PlatformView Frame
D/EGL_emulation(15894): app_time_stats: avg=35.70ms min=13.41ms max=114.73ms count=28
D/EGL_emulation(15894): app_time_stats: avg=14.32ms min=0.85ms max=186.05ms count=75
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=38.09ms min=13.75ms max=183.25ms count=30
D/EGL_emulation(15894): app_time_stats: avg=37.29ms min=14.42ms max=183.44ms count=29
D/EGL_emulation(15894): app_time_stats: avg=65.31ms min=5.98ms max=735.52ms count=17
D/EGL_emulation(15894): app_time_stats: avg=1008.57ms min=1008.57ms max=1008.57ms count=1
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=1015.25ms min=1015.25ms max=1015.25ms count=1
D/EGL_emulation(15894): app_time_stats: avg=1015.28ms min=1015.28ms max=1015.28ms count=1
D/EGL_emulation(15894): app_time_stats: avg=795.71ms min=8.55ms max=11713.45ms count=15
D/EGL_emulation(15894): app_time_stats: avg=11924.84ms min=11924.84ms max=11924.84ms count=1
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=11918.29ms min=11918.29ms max=11918.29ms count=1
D/EGL_emulation(15894): app_time_stats: avg=11918.89ms min=11918.89ms max=11918.89ms count=1
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=9824.10ms min=9824.10ms max=9824.10ms count=1
D/EGL_emulation(15894): app_time_stats: avg=9844.43ms min=9844.43ms max=9844.43ms count=1
D/EGL_emulation(15894): app_time_stats: avg=9832.04ms min=9832.04ms max=9832.04ms count=1
D/EGL_emulation(15894): app_time_stats: avg=821.64ms min=11.43ms max=9689.68ms count=12
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=190.02ms min=9.98ms max=5078.30ms count=29
D/EGL_emulation(15894): app_time_stats: avg=64.44ms min=2.80ms max=5103.51ms count=86
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=192.21ms min=12.18ms max=5116.44ms count=29
D/EGL_emulation(15894): app_time_stats: avg=180.84ms min=3.61ms max=5106.51ms count=29
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
D/EGL_emulation(15894): app_time_stats: avg=3726.57ms min=3726.57ms max=3726.57ms count=1
D/EGL_emulation(15894): app_time_stats: avg=3750.95ms min=3750.95ms max=3750.95ms count=1
D/EGL_emulation(15894): app_time_stats: avg=3730.44ms min=3730.44ms max=3730.44ms count=1
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/ImageTextureRegistryEntry(15894): Dropping PlatformView Frame
D/EGL_emulation(15894): app_time_stats: avg=269.19ms min=5.21ms max=3567.93ms count=14
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.
E/FrameEvents(15894): updateAcquireFence: Did not find frame.

Potentially related issue: flutter/flutter#142153

1.2.2 stable에서 수정됩니다.
해당버전은 오늘 중으로 PR이 올라갑니다. 감사합니다.