您的位置:首页 > 健康 > 养生 > 西安做网站的公司排名_揭阳专业网站建设_百度上的广告多少钱一个月_网络平台的推广方法

西安做网站的公司排名_揭阳专业网站建设_百度上的广告多少钱一个月_网络平台的推广方法

2025/5/1 5:07:38 来源:https://blog.csdn.net/qq_56394739/article/details/147603607  浏览:    关键词:西安做网站的公司排名_揭阳专业网站建设_百度上的广告多少钱一个月_网络平台的推广方法
西安做网站的公司排名_揭阳专业网站建设_百度上的广告多少钱一个月_网络平台的推广方法

一、Android 显示系统架构总览

1. 核心组件全景图(按职责划分)

组件职责所属层级
App (ViewRootImpl)接收输入事件 → 触发 View 测量/布局/绘制Java Framework
SurfaceFlinger合成所有 Layer 图层 → 输出到 FrameBufferNative Service
DisplayManagerService (DMS)管理显示设备生命周期(如亮灭屏)→ 连接 SurfaceFlingerJava Service
HWComposer HAL提供硬件合成能力(GPU/GPU混合渲染)→ 控制 VSync 中断Hardware Abstraction
BufferQueue生产消费模式管理 GraphicBuffer 缓冲区C++ Lib

2. 关键数据流

App draw() 
→ BufferQueue dequeue/queue 
→ SurfaceFlinger composeLayers 
→ HWComposer set(hal_module)
→ FrameBufferDevice (最终输出)

二、核心组件详解与协作机制

1. DisplayManagerService (DMS)

核心功能:
  • 监控显示设备插拔(如热插拔 HDMI)
  • 管理 DisplayDeviceInfo(分辨率/DPI/刷新率)
  • 创建 DisplayToken 并传递给 SurfaceFlinger
源码位置:
// Java 层入口
frameworks/base/services/core/java/com/android/server/display/DisplayManagerService.java
关键调用链:
// DMS 初始化时注册显示设备
private void registerDefaultDisplay(int displayId, IBinder displayToken) {// 通过 SF 的 BootInitialize 设置主屏SurfaceControl.setDisplayToken(displayToken);
}

2. SurfaceFlinger

核心职责:
  • 接收并缓存多个 Layer(来自 App 的 Surface)
  • 根据 Z-order 合成图层 → 通过 HWC 或 OpenGL 渲染
  • 管理帧缓冲区(FrameBuffer)
源码位置:
// Native 入口
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
启动流程:
int main() {// Step1: 创建实例sp<SurfaceFlinger> flinger = new SurfaceFlinger();// Step2: 初始化硬件抽象层flinger->init();// Step3: 注册 Binder 接口sp<ISurfaceFlinger> iFlinger = flinger;defaultServiceManager()->addService(String16("SurfaceFlinger"), iFlinger);// Step4: 启动消息循环runLoop();
}

3. BufferQueue:生产者-消费者模型

工作机制:
  • 应用侧(Producer)通过 dequeueBuffer 获取空缓冲区
  • 绘制完成后调用 queueBuffer 提交
  • SurfaceFlinger(Consumer)消费缓冲区进行合成
核心状态机:
[ FREE ] --dequeue--> [ DEQUEUED ]^                     ||                   queue+----<<acquire<<-----+ 
源码位置:
// BufferQueue 核心实现
frameworks/native/libs/gui/include/gui/BufferQueue.h
frameworks/native/libs/gui/BufferQueue.cpp

4. VSync 信号同步机制

原理图:
HWComposer.generateVSync()↓
EventThread.dispatchVSync()↓
SurfaceFlinger.onVSyncReceived()↓
App.doTraversal() → 开始下一帧绘制
黄油计划改进(Android 4.1+):
  • 引入 Choreographer 实现 UI 渲染与 VSync 的同步
  • 支持多级 VSync offset(避免输入延迟)
源码片段(Choreographer):
public void postCallback(int callbackType, Runnable action, Object token) {synchronized (mLock) {// 计算下一帧时间戳long now = SystemClock.uptimeMillis();mCallbackQueues[callbackType].addCallbackLocked(now, action, token);// 请求下一次 VSyncscheduleFrameLocked(now);}
}

三、显示流程全链路跟踪

1. App 侧 View 绘制到 BufferQueue

// Activity 启动后触发首次绘制
ViewRootImpl.setView() {// 创建 Surface 并关联到 WindowSessionmSurface = new Surface();mWindowSession.addToDisplay(...);// 开始绘制循环requestLayout();
}// Canvas 绘制完成提交缓冲区
Surface.unlockCanvasAndPost(Canvas canvas) {nativeUnlockCanvasAndPost(mNativeObject, canvas);
}

2. BufferQueue 本地提交流程(C++ 层)

// frameworks/native/libs/gui/BufferQueueProducer.cpp
virtual status_t queueBuffer(...) {// 通知 Consumer 可以消费mCore->signalCondition();// 更新缓冲区状态bufferState[b].status = BufferSlot::DEQUEUED;
}

3. SurfaceFlinger 合成逻辑

// SurfaceFlinger.cpp
void onMessageReceived(int32_t what) {switch (what) {case MessageQueue::INVALIDATE:// 触发合成handleRepaint();break;}
}void handleRepaint() {// 遍历所有 Layerfor (size_t i=0 ; i<mLayers.size() ; i++) {Layer* layer = mLayers[i];// 准备缓冲区layer->beginFrame();// 合成操作layer->prepare(SurfaceFlinger::eNextAnimationFrame);}
}

四、必看调试命令与工具

# 查看 SurfaceFlinger 当前负载
adb shell dumpsys SurfaceFlinger --latency# 分析 BufferQueue 状态
adb shell service call SurfaceFlinger 1013# 抓取 Systrace 分析 VSync
python systrace.py --time=10 -o trace.html gfx view wm# 查看当前显示设备信息
adb shell dumpsys display

五、推荐动手实验

  1. 修改 VSync 周期
    // 修改 frameworks/native/services/surfaceflinger/EventThread.cpp
    static const nsecs_t vsyncPeriod = 16666666; // 默认 60Hz
    
  2. 打印 BufferQueue 状态
    BufferQueueProducer::queueBuffer() 添加日志输出
  3. 强制软件合成
    adb shell setprop debug.sf.force_gpu false
    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com