53
Android UI Subsystem Design Bin (Pierr) Chen http://pierrchen.blogspot.com Pattern’s Perspective

Android graphic system (SurfaceFlinger) : Design Pattern's perspective

  • Upload
    bin-chen

  • View
    89.769

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Android UI Subsystem Design

Bin (Pierr) Chenhttp://pierrchen.blogspot.com

Pattern’s Perspective

Page 2: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Android View System

Libgui

SufaceFlinger

HWC EGL

ComponentsApps

3D

Page 3: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Perspective

How Why

Page 4: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Combined

Libgui

SufaceFlinger+ How/Why

Page 5: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Pattern

Page 6: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Design Patternis a general reusable solution to acommonly occurringproblem

Page 7: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Observer/Publish-Subscribe

Page 8: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

UML

A oo way of saying callback in c.

Page 9: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Examples You subscribe to an RSS to get notification for new article Controller subscribe to View for Event

MediaPlayer notify user the status of current player ConsumerBase subscribe to BufferQueue for enqueue

event SurfaceFlinger subscribe to HWC for hotplug/vsync

Page 10: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

In China, we need a ________ to visit YouTube.

Page 11: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Proxy - UML

Page 12: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Examples Sp implementation - Smart Reference Binder - Remote Proxy

Page 13: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Bp/Bn

Page 14: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Bp/Bn Example

Page 15: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Sushi shop

Page 16: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Simplest form

put getproducer consumer

Page 17: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Not that simple, Actually

put/get usually in different thread->Need synchronization->Need define wait/wake policy for empty/full

Page 18: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Evolution Evolves

(Resource)Queue Evolves Producer Evolves Consumer

Page 19: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Questions? Isn’t put and get enough to describe the model? Why we need dequeue? is dequeue an consumer action or producer

action? dequeue acquire

enqueue release

Page 20: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Sushi shop, example

Each Plate cost $1000 So for each customer they only provide you

3 Plate You have to return the used Plate to the trail

so that servant can make next sushi.

Page 21: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

+Resource Pool

dequeue acquire

enqueue release

Page 22: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Resource State

free dequeued

queuedacquired

dequeue

queue

cancel

acquire

release

Page 23: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Participants店员 - Producer - SurfaceTextureClient/ANativeWindow顾客 - Consumer - SurfaceTexture/FramebufferService 转盘 - Resource Pool - BufferQueue盘子 - Resource - Graphic Buffer寿司 - Resource Content - Content of Graphic Buffer

Page 24: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

When to consume? +Observer

dequeue acquire

enqueue release

Observer

Page 25: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Scheduled consumer

dequeue acquire

enqueue release

Observer SchedulerMessage

trigger

Page 26: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Producer in another Process+ Proxy

BQdequeue acquire

enqueue release

Observer SchedulerMessage

Proxy

trigger

Page 27: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

+Sync-er

When a dequeue a resource but actually you can not use it immediately. You have to wait until that resource is free.

Then, why not dequeue block?

BQdequeue acquire

enqueue release

Observer SchedulerMessage

Proxy

trigger

sync-er

Sync-er

Page 28: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

SurfaceFlingerVSYNC

BQdequeue acquire

enqueue release

Observer SchedulerMessage

Proxy

surfaceTextureClient

BufferQueue

SurfaceTexture SF main threadtrigger

fence

new fence

trigger

Page 29: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Surface INVALIDATE1. SurfaceTexturClient::queue -> BufferQueeu::QueueBuffer - >

2. SurfaceTexture got notified -> Layer::onFrameQueuedLayer-> SignalLayerUpdate ->

3. requestNextVsync

4. VSYNC come -> dispatchMessageInvalidate

5. SF main thread -> handleMessageInvalidate -> acquireBuffer->createIMGKHR-> postMessageRefresh

1.Producer thru proxy

2.Listener get notified

3.Schedule Consumer

4.It is time to consume! (thru ActiveObject)

5.Consume

Page 30: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Connecting Producer/ConsumerYou can understand Compositor

SurfaceTexture

SurfaceTexture

FrameBufferSurface

REFRASH happened after INVALIDATE

Page 31: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

REFRESH1. Draw each layer’s latest onscreen buffer as Texture to FBS -

prepare

2. eglSwapBuffer for FBS1. EGL queue current buffer - produce2. dequeue next buffer of FBS

3. FBS’s listener update fb handle - listener notified

4. HWC commit will display the updated fb handle - consume

Page 32: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

INVALIDATE and REFRESH

Page 33: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

More

Page 34: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Thread Pool

Page 35: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Goal:Increase throughput and Improve responsiveness

ServerSocket socket = new ServerSocket();

While(true){

Socket con = socket.accept();

handleRequest(con);

}

Sequential execution Thread– Per -Task

service

clientclient

clientclient

clientclient

Page 36: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Thread pool Pattern is where a number of threads are

created to perform tasks submitted to task queue

client

Task submission Task execution

Submit task

retrieve result

Page 37: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Let’s return to Producer/Consumer a while…

Task Queue is a Producer/Consumer , multiply Consumer, one or more Producer

BufferQueue is really a Resource Pool

Page 38: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Binder Server

Page 39: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Those Binder Thread will submit the task to SurfaceFlinger main

thread.

Which is Achieved though….

Page 40: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Active Object

Page 41: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

The active object design pattern

decouples

method execution from

method invocation

for objects that each reside in their own thread of

control.

Page 42: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Why not Passive Object

Object called in the client thread, result in more complex synchronization

Schedule/MessageQueue sequential the request to servant object

Page 43: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Active Object:Participants

Page 44: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

SF main thread Message queue

Client

postMessage

surfaceFlinger

Active Object:Used in SurfaceFlinger

Page 45: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

How message are submitted from client thread to server thread?

Page 46: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Command PatternPurpose:Decouple the Invoker and the ReceiverThe command can be queue, transferred, stored and/or execute at different time.

Page 47: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Command Pattern

Page 48: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

SF in Action

SF main thread

SF MessageCreateSurfaceClient

Page 49: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Combined:

Thread Pool

+

Command

+

Active Object

+

Proxy

sp<ISurface> Client::createSurface( ISurfaceComposerClient::surface_data_t* params, const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags){ class MessageCreateLayer : public MessageBase { public: MessageCreateLayer(SurfaceFlinger* flinger, ISurfaceComposerClient::surface_data_t* params, const String8& name, Client* client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) : flinger(flinger), params(params), client(client), name(name), w(w), h(h), format(format), flags(flags) { } sp<ISurface> getResult() const { return result; } virtual bool handler() { result = flinger->createLayer(params, name, client, w, h, format, flags); return true; } };  sp<MessageBase> msg = new MessageCreateLayer(mFlinger.get(), params, name, this, w, h, format, flags); mFlinger->postMessageSync(msg);

return static_cast<MessageCreateLayer*>( msg.get() )->getResult();} 

Page 50: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Architecture

Integrated,

Connected Patterns

Page 51: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Recap Observer Proxy Producer/Consumer Thread Pool Command Pattern Active Object

Page 52: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

BnSurfaceTexture

SF Main Thread

BufferQueue

SurfaceTextureClient

FBSBufferQueue

invalidate

invalidate

refresh

SurfaceComposerClient Client

SurfaceFlinger

Proxy Thread Pool

Producer/Consumer

Command

Active Object

Observer

Page 53: Android graphic system (SurfaceFlinger) : Design Pattern's perspective

Android View System

Libgui

SufaceFlinger

HWC EGL

Apps

3D

Android UI Framework: View ,Usage & Patterns

Android App Development 101

Android SurfaceFlinger: Architecture explained by User case

Android UI:Patterns Perspective

Other Topics

Android Graphic Integration