Flutter Moments Performance Test
May 26, 2026 ยท View on GitHub
๐ Project Status
A WeChat Moments-style Flutter application for performance and power consumption testing, supporting Flutter 3.19, 3.27, and 3.29 version comparison with 13 load types for comprehensive performance testing.
Quick Start
# Build APKs (requires FVM)
./build_release.sh
# Install to device
./install_apks.sh
# Quick launch (interactive menu)
./quick_launch.sh
Flutter Version Differences
This project includes 3 Flutter versions, each with significant architectural changes:
Version Comparison
| Feature | Flutter 3.19 | Flutter 3.27 | Flutter 3.29 |
|---|---|---|---|
| Rendering Engine | Skia | Impeller | Impeller |
| Main Thread Merger | No | No | Yes |
| UI Thread | Separate 1.ui thread | Separate 1.ui thread | Merged into main thread |
| GPU Submission | queueBuffer/dequeueBuffer | QueueSubmit | QueueSubmit |
| Dart Version | 3.3.0 | 3.6.0 | 3.7.0 |
Detailed Description
Flutter 3.19 - Skia Renderer
- Rendering Engine: Uses traditional Skia renderer
- Thread Model: Flutter UI thread (
1.ui) is separate from Android main thread - GPU Communication: Communicates with SurfaceFlinger via
queueBuffer/dequeueBuffer
Flutter 3.27 - Impeller Renderer
- Rendering Engine: Impeller becomes the default renderer
- Thread Model: Flutter UI thread (
1.ui) remains separate from Android main thread - GPU Communication: Switches to
QueueSubmitAPI, reducing GPU communication latency
Flutter 3.29 - Main Thread Merger
- Rendering Engine: Impeller renderer (further optimized)
- Thread Model: Flutter UI thread merged with Android main thread
- Impact: No separate
1.uithread, all UI operations execute on main thread
Perfetto Trace Analysis
Thread Structure Differences
Flutter 3.19 / 3.27 (Non-Merged Mode)
In Perfetto, you can see the following threads:
| Thread Name | Description |
|---|---|
main | Android main thread (Java/Kotlin) |
1.ui | Flutter UI thread (Dart) running independently |
1.raster | Flutter rasterization thread |
1.io | Flutter IO thread |
gpu_completion | GPU completion thread |
Trace Characteristics:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ main (Android) โ
โ โโ Activity lifecycle, JNI calls โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ 1.ui (Flutter UI Thread) โ
โ โโ Dart execution, Layout, Paint โ
โ โโ BuildFrame โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ 1.raster (Raster Thread) โ
โ โโ Skia/Impeller rasterization โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Flutter 3.29 (Main Thread Merged Mode)
In Perfetto, you can see the following threads:
| Thread Name | Description |
|---|---|
main | Android main thread + Flutter UI thread (merged) |
1.raster | Flutter rasterization thread |
1.io | Flutter IO thread |
gpu_completion | GPU completion thread |
Trace Characteristics:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ main (Android + Flutter UI Merged) โ
โ โโ Activity lifecycle, JNI calls โ
โ โโ Dart execution, Layout, Paint (directly on main) โ
โ โโ BuildFrame โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ 1.raster (Raster Thread) โ
โ โโ Impeller rasterization โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GPU Communication Differences
Skia (3.19) - SurfaceView Mode
Architecture: Dual Pipeline (ๅ็ฎก้ๅนถ่ก)
SurfaceView creates two independent rendering pipelines:
- Pipeline A (Flutter): Renders actual content
- Pipeline B (Android App): Renders window chrome (Status Bar, Nav Bar) + defines SurfaceView position
Phase 1: Production (Flutter Raster Thread) - Independent Path
Vsync Signal
โ
[1.raster] LayerTree rasterization โ GraphicBuffer
โ
BufferQueue::queueBuffer()
(Flutter's ANativeWindow maps directly to a SurfaceFlinger Layer)
โ
*** Direct Submission ***
(No Android Main Thread or RenderThread involvement)
โ
Shared Memory โ SurfaceFlinger receives "Frame Available" directly
Phase 2: Hole Punching (Android RenderThread)
Vsync-App Signal (Parallel, non-blocking)
โ
[RenderThread] Draw App Window UI
โ
At SurfaceView region: Draw transparent pixels
(This creates a "hole" in the app window)
โ
Z-Order: SurfaceView (Z=-1) behind App Window (Z=0)
โ
BufferQueue::queueBuffer() (App Window with transparent hole)
Phase 3: System Composition (SurfaceFlinger & HWC - ZERO-COPY)
[SurfaceFlinger]
โ
Collect multiple layers in one Vsync period:
โโ App Window Buffer (with transparent hole at SurfaceView position)
โโ Flutter Surface Buffer (actual content)
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ *** ZERO-COPY / HARDWARE OVERLAY *** โ
โ SF โ HWC: "Set Layer 1 (App Window, Z=0)" โ
โ "Set Layer 2 (SurfaceView, Z=-1)" โ
โ HWC: Hardware Overlay composition โ
โ NO GPU synthesis - Direct Display Processor scanout โ
โ Cost: Zero copy, GPU may stay idle โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Sequence Diagram:
โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโ
โ Vsync โ โ Flutter โ โBuffer โ โ Android โ โ Surface โ โ Display โ
โ Signal โ โ Raster โ โ Queue โ โ Render โ โFlinger โ โ (HWC) โ
โโโโโโฌโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ
โ โ โ โ โ โ
โ Vsync โ โ โ Vsync โ โ
โโโโโโโโโโโโโโ>โ โ โโโโโโโโโโโโโโ>โ โ
โ โ โ โ โ โ
โ *** Pipeline A: Flutter Content *** โ โ โ โ
โ โ Rasterize โ โ โ โ
โ โ to GraphicBuf โ โ โ โ
โ โโโโโโโโโโโโโโโ>โ โ โ โ
โ โ โ queueBuffer()โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ โ
โ โ โ โ (Direct to SF)โ โ
โ โ โ โ โ โ
โ *** Pipeline B: Window Hole Punch *** (Parallel) โ โ โ
โ โ โ โ Draw App UI โ โ
โ โ โ โโโโโโโโโโโโโโโ> โ
โ โ โ โ Draw transparentโ โ
โ โ โ โ at SurfaceViewโ โ
โ โ โ โ โ โ
โ โ โ โ queueBuffer()โ โ
โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ
โ โ โ โ โ โ
โ โ โ โ โ acquireBuf()โ
โ โ โ โ โ<โโโโโโโโโโโโโโ
โ โ โ โ โ acquireBuf()โ
โ โ โ โ โ<โโโโโโโโโโโโโโ
โ โ โ โ โ โ
โ โ โ โ โ *** HWC Overlay***
โ โ โ โ โ Layer 1: App โ
โ โ โ โ โ Layer 2: Flutter
โ โ โ โ โโโโโโโโโโโโโโ>โ
โ โ โ โ โ Scanout โ
Key Differences from TextureView:
- No GPU Copy: Flutter content bypasses App's RenderThread entirely
- Independent Layer: Flutter Surface is a separate SurfaceFlinger layer
- Hole Punching: App window has transparent region revealing Flutter beneath
- Hardware Overlay: HWC combines layers without GPU synthesis
Trace Characteristics:
queueBufferon1.rasterthread โ Flutter content to SF (direct)queueBufferon RenderThread โ App window with transparent holedequeueBufferin SurfaceFlinger โ acquires both buffersBLASTBufferQueue_*symbols visible- No
updateTexImageor GPU copy operations
TextureView Mode (All Flutter Versions)
TextureView mode has significant overhead due to the GPU copy process. Here's the complete flow:
Phase 1: Production (Flutter Raster Thread)
Vsync Signal
โ
[1.raster] Skia/Impeller rasterization โ GraphicBuffer
โ
BufferQueue::queueBuffer()
(Buffer enters QUEUED state in SurfaceTexture's BufferQueue)
โ
onFrameAvailable() callback โ Main Thread Handler
(Only marks TextureView as dirty, no immediate draw)
Phase 2: Scheduling (Android Main Thread - Next Vsync)
Vsync-App Signal (T+16.6ms)
โ
[Main Thread] performTraversals()
โโ Measure
โโ Layout
โโ Draw
โโ TextureView.draw() โ Creates DisplayList RenderNode
(Command: "RenderThread, draw SurfaceTexture content at these coordinates")
โ
SyncFrame โ Send DisplayList to RenderThread
Phase 3: Composition & GPU Copy (Android RenderThread - THE PERFORMANCE HOTSPOT)
[RenderThread]
โ
BufferQueue::acquireBuffer() (Lock latest available frame)
โ
SurfaceTexture.updateTexImage()
(Bind GraphicBuffer as GL_TEXTURE_EXTERNAL_OES)
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ *** CRITICAL PERFORMANCE POINT *** โ
โ drawTexture() โ GPU Fragment Shader โ
โ Input: Flutter OES texture โ
โ Output: App window FrameBuffer โ
โ Process: GPU samples from OES texture โ Color conversion (YUVโRGB) โ
โ โ Writes to window Buffer โ
โ Cost: GPU ALU + Memory Bandwidth ("Extra GPU Copy") โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Phase 4: System Composition (SurfaceFlinger)
[RenderThread] queueBuffer() (Complete App Window)
โ
[SurfaceFlinger]
โ
BufferQueueConsumer::acquireBuffer() (App window as Layer)
โ
[SF Main Thread] Layer composition (includes TextureView layer)
โ
[HWComposer / WHC] Present to Display
Sequence Diagram:
โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโโ
โ Vsync โ โ Flutter โ โBuffer โ โ Android โ โ Android โ โ Surface โ โ Display โ
โ Signal โ โ Raster โ โ Queue โ โ Main โ โ Render โ โFlinger โ โ โ
โโโโโโฌโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ
โ โ โ โ โ โ โ
โ Vsync-App โ โ โ โ โ โ
โโโโโโโโโโโโโโ>โ โ โ โ โ โ
โ โ โ โ Vsync โ โ โ
โ โ โ โโโโโโโโโโโโโโ>โ โ โ
โ โ Rasterize โ โ โ โ โ
โ โ to GraphicBuf โ โ โ โ โ
โ โโโโโโโโโโโโโโโ>โ โ โ โ โ
โ โ โ queueBuffer()โ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ โ โ
โ โ โ โ (dirty flag) โ โ โ
โ โ โ โ<โโโโโโโโโโโโโโโ โ โ
โ โ โ โ onFrameAvail โ โ โ
โ โ โ โ โ โ โ
โ Next Vsync (T+16.6ms) โ โ โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ โ โ โ โ
โ โ โ โ โ โ โ
โ โ โ โperformTrav. โ โ โ
โ โ โ โโโโโโโโโโโโโโโ>โ โ โ
โ โ โ โ โ โ โ
โ โ โ โ Build โ โ โ
โ โ โ โ DisplayList โ โ โ
โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ โ
โ โ โ โ โ โ โ
โ โ โ โ โ acquireBuf()โ โ
โ โ โ โ โ<โโโโโโโโโโโโโโ โ
โ โ โ โ โ โ โ
โ โ โ โ โ updateTexImageโ โ
โ โ โ โ โโโโโโโโโโโโโโโ> โ
โ โ โ โ โ โ โ
โ โ โ โ โ *** GPU COPY ***โ โ
โ โ โ โ โ OES โ WindowBufโ โ
โ โ โ โ โ โ โ
โ โ โ โ โ queueBuffer()โ โ
โ โ โ โ โโโโโโโโโโโโโโ>โ โ
โ โ โ โ โ โ โ
โ โ โ โ โ โ acquireBuf()โ
โ โ โ โ โ โ<โโโโโโโโโโโโโโ
โ โ โ โ โ โ โ
โ โ โ โ โ โ HWC Compose โ
โ โ โ โ โ โโโโโโโโโโโโโ>โ
Trace Characteristics:
onFrameAvailableon Main Thread โ callback from BufferQueueperformTraversalson Main Thread โ View system traversalupdateTexImageon RenderThread โ Bind Buffer as OES texturedrawTexture/drawRenderNodeon RenderThread โ GPU Copy operationqueueBuffertwice: once for Flutter content (SurfaceTexture), once for App window (BLASTBufferQueue)
Performance Impact:
- Extra GPU Copy: Fragment Shader samples from OES texture and writes to window FrameBuffer
- Memory Bandwidth: Each frame consumes additional GPU bandwidth for texture sampling
- Vsync Delay: Flutter content may be one frame behind (produced at T, consumed at T+16.6ms)
Impeller (3.27/3.29) - SurfaceView Mode
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Flutter App Process โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ [1.ui/main] Dart code โ Impeller Layer tree โ
โ โ โ
โ [1.raster] Impeller rendering โ GPU commands (Vulkan/Metal) โ
โ โ โ
โ AHardwareQueue_submit() / QueueSubmit() โ
โ โโ Direct GPU command submission โ
โ โโ No intermediate buffer queue โ
โโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ GPU commands
โโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ GPU (Vulkan/Metal) โ
โ โ โ
โ [HW Composer / WHC] Direct scanout or composition โ
โ โ โ
โ Display โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Trace Characteristics:
AHardwareQueue_submitorvkQueuePresentKHRon1.rasterthread- No
queueBuffer/dequeueBufferfor rendering (reduced latency) - Key difference: Impeller bypasses traditional BufferQueue, submits directly to GPU
Impeller (3.27/3.29) - TextureView Mode
Same flow as Skia TextureView - TextureView still requires SurfaceTexture path:
[1.ui/main] โ Impeller rendering โ GPU texture upload โ [JNIOnload] updateTexImage()
โ
Then View system โ Window BLASTBufferQueue โ SF โ Display
Note: TextureView mode cannot benefit from Impeller's direct GPU submission due to OpenGL texture requirement. Still goes through full View composition path.
Summary Table
| Mode | Flutter Version | Buffer Flow | Key Threads | Overhead |
|---|---|---|---|---|
| SurfaceView | 3.19 (Skia) | 1.raster โ BufferQueue โ SF โ Display | 1.raster, SF Main | Medium |
| SurfaceView | 3.27/3.29 (Impeller) | 1.raster โ GPU (direct) โ Display | 1.raster, GPU | Low |
| TextureView | All | 1.raster โ GPU Texture โ JNIOnload โ View System โ Window BufferQueue โ SF | 1.raster, JNIOnload, Main | High |
Performance Analysis Key Metrics
When analyzing in Perfetto, focus on these slices:
| Metric | 3.19/3.27 (Non-Merged) | 3.29 (Merged) |
|---|---|---|
| Frame Build Time | In BuildFrame slice on 1.ui thread | In BuildFrame slice on main thread |
| JNI Overhead | main โ 1.ui inter-thread communication | No cross-thread communication |
| GPU Submission | 1.ui โ commands โ 1.raster โ SurfaceFlinger | main โ commands โ 1.raster โ SurfaceFlinger |
| Buffer Exchange | queueBuffer/dequeueBuffer on 1.raster (SurfaceView) | QueueSubmit on 1.raster (SurfaceView) |
| Frame Interval | More stable frame interval | Potentially tighter frame interval |
Note: For TextureView mode, updateTexImage is called on JNIOnload thread regardless of Flutter version.
Trace Characteristics Under Load Testing
Build Load (Widget.build() computation)
- 3.19/3.27:
BuildFrameslice on1.uithread becomes longer - 3.29:
BuildFrameslice onmainthread becomes longer
Paint Load (CustomPainter GPU drawing)
- All versions:
1.rasterthread activity increases - 3.27/3.29: More efficient GPU command submission
PostFrame Load (inter-frame computation)
- 3.19/3.27: May affect next frame's
1.uithread scheduling - 3.29: Directly affects
mainthread, may compete with other main thread operations
APK Version Reference
| App Name | Flutter Version | Render Mode | Package Name |
|---|---|---|---|
| Flu-V319-Surface | 3.19 (Skia) | SurfaceView | com.example.friendscircle.v19 |
| Flu-V319-Texture | 3.19 (Skia) | TextureView | com.example.friendscircle.v19.textureview |
| Flu-V327-Surface | 3.27 (Impeller) | SurfaceView | com.example.friendscircle.v27 |
| Flu-V327-Texture | 3.27 (Impeller) | TextureView | com.example.friendscircle.v27.textureview |
| Flu-V329-Surface | 3.29 (Impeller+Merged) | SurfaceView | com.example.friendscircle.v29 |
| Flu-V329-Texture | 3.29 (Impeller+Merged) | TextureView | com.example.friendscircle.v29.textureview |
Load Types
Each app supports 13 load types:
| Category | Load Types | Description |
|---|---|---|
| Baseline | Minimal | No extra computation, performance baseline |
| Build (In-Frame) | Light / Medium / Heavy | CPU computation in Widget.build() phase |
| Paint (In-Frame GPU) | Light / Medium / Heavy | GPU drawing in CustomPainter.paint() phase |
| PostFrame (Between-Frames) | Light / Medium / Heavy | CPU computation after frame rendering |
| Mixed (Combined) | Light / Medium / Heavy | Build + PostFrame combined load |
ADB Quick Launch
# Format
adb shell am start -n <package_name>/.MainActivity -e "load" "<load_type>"
# Example: Launch 3.27 SurfaceView + Build Heavy
adb shell am start -n com.example.friendscircle.v27/.MainActivity -e "load" "build_heavy"
# Example: Launch 3.29 TextureView + Paint Heavy
adb shell am start -n com.example.friendscircle.v29.textureview/.MainActivity -e "load" "paint_heavy"
Project Structure
FriendsCircle_Flutter/
โโโ shared/ # Single source of truth for all Dart code and assets
โ โโโ lib/ # 18 Dart files (3,749 LOC), parameterized via --dart-define
โ โ โโโ main.dart
โ โ โโโ constants.dart
โ โ โโโ screens/
โ โ โโโ data/
โ โ โโโ models/
โ โ โโโ utils/
โ โ โโโ widgets/
โ โโโ assets/ # Shared avatars and images
โโโ 3.19_SurfaceView/ # Flutter 3.19 + SurfaceView (Skia)
โโโ 3.19_TextureView/ # Flutter 3.19 + TextureView (Skia)
โโโ 3.27_SurfaceView/ # Flutter 3.27 + SurfaceView (Impeller)
โโโ 3.27_TextureView/ # Flutter 3.27 + TextureView (Impeller)
โโโ 3.29_SurfaceView/ # Flutter 3.29 + SurfaceView (Impeller + Main Thread Merger)
โโโ 3.29_TextureView/ # Flutter 3.29 + TextureView (Impeller + Main Thread Merger)
โโโ build_release.sh # One-click build script
โโโ install_apks.sh # Batch install script
โโโ quick_launch.sh # Quick launch script
โโโ check_env.sh # Environment verification script
โโโ .github/workflows/ # GitHub Actions CI/CD
โโโ apk-release/ # APK output directory
Architecture: Single Source with Build-Time Configuration
All 6 variants share the same Dart source code via symlinks:
- Each variant's
lib/andassets/are symlinks to../shared/liband../shared/assets - Each variant retains its own
pubspec.yaml(Flutter version constraint) andandroid/(namespace, applicationId) - Runtime differences are parameterized via
--dart-definecompile-time constants:
| Constant | Description | Example |
|---|---|---|
FLUTTER_VERSION | Flutter version label | 3.19, 3.27, 3.29 |
RENDER_MODE | Rendering surface type | SurfaceView, TextureView |
PACKAGE_NAME | Android application ID | com.example.friendscircle.v27 |
Build Instructions
Using FVM to Manage Multiple Flutter Versions
# Install FVM
brew install fvm
# Install Flutter versions
fvm install 3.19.0
fvm install 3.27.0
fvm install 3.29.0
# Each project is configured with the corresponding Flutter version
# Simply run the build script
./build_release.sh
Manual Build (Single Variant)
cd 3.27_SurfaceView
fvm flutter build apk --release \
--dart-define=FLUTTER_VERSION=3.27 \
--dart-define=RENDER_MODE=SurfaceView \
--dart-define=PACKAGE_NAME=com.example.friendscircle.v27
Load Parameter Configuration
Design references HighPerformanceFriendsCircle native project. Gradual progression with probability-based triggering, frame interval control, and scroll awareness.
Build Load Iterations (In-Frame, ratio 1:4:10)
| Level | Iterations |
|---|---|
| Light | 2,000 |
| Medium | 8,000 |
| Heavy | 20,000 |
Paint Load Shape Count (Flutter-only)
| Level | Shape Count | Path Points | Shadow | Blur |
|---|---|---|---|---|
| Light | 50 | 10 | โ | โ |
| Medium | 200 | 50 | โ | โ |
| Heavy | 800 | 200 | โ | โ |
PostFrame Load Iterations (Between-Frame, ratio 1:3:6)
| Level | Iterations |
|---|---|
| Light | 5,000 |
| Medium | 15,000 |
| Heavy | 30,000 |
Mixed Load Combination (Build + PostFrame = In-Frame)
| Level | Build Part | PostFrame Part | Total = In-Frame |
|---|---|---|---|
| Light | 1,000 | 1,000 | 2,000 |
| Medium | 4,000 | 4,000 | 8,000 |
| Heavy | 10,000 | 10,000 | 20,000 |
Trigger Probability (aligned with native)
| Level | Probability | Multiplier |
|---|---|---|
| Light | 32% | 1.0x |
| Medium | 48% | 1.5x |
| Heavy | 72% | 2.25x |
| Mixed Boost | ร1.20 | - |
Frame Interval (aligned with native 3~5 frame interval)
| Level | Min Frames | Max Frames |
|---|---|---|
| All levels | 3 | 5 |
Scroll Awareness
All synthetic load types are gated by scroll phase:
- Press-drag/manual drag interval: no Build, Paint, PostFrame, or Mixed load is executed.
- Ballistic/inertial interval after finger release: load execution is enabled with the probability and frame-interval controls above.
- Idle interval: load execution stops immediately.
Related Projects
- Friends-Circle-Demo-Apks-For-Power-and-Performance-Test - AOSP native implementation
License
MIT License