更多面试题请看这里:https://interview.raoyunsoft.com/
面试题专栏会持续更新欢迎关注订阅
1. 核心继承关系
- View:所有UI组件的基类,在UI主线程中处理绘制和事件
- SurfaceView :继承自View,独立线程绘制(直接子类包括GLSurfaceView和VideoView)
- GLSurfaceView:专为OpenGL渲染设计的SurfaceView子类,内置OpenGL ES上下文支持
2. 核心差异对比表
| 特性 | View | SurfaceView | GLSurfaceView |
|---|---|---|---|
| 绘制线程 | UI主线程 | 独立后台线程 | 独立OpenGL渲染线程 |
| 绘制机制 | 被动更新(invalidate()) |
主动连续刷新 | 主动刷新+OpenGL渲染管线 |
| 适用场景 | 静态/低频更新UI | 视频/Camera/高频渲染 | 3D图形/游戏/复杂特效 |
| 图层层级 | 普通视图层级 | 位于独立Surface图层 | 独立Surface图层+OpenGL上下文 |
| 事件同步 | 自动同步 | 需手动线程同步 | 需OpenGL线程同步 |
3. 关键特性详解
▎View 的局限
java
// 在主线程更新UI的典型代码(可能导致卡顿)
myView.postInvalidate();
- 阻塞风险:复杂绘制会阻塞UI线程,导致触屏/按键无响应
- 刷新机制 :依赖
invalidate()被动触发,无法持续刷新
▎SurfaceView 的优势
java
// SurfaceView的绘制流程示例
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
new Thread(() -> {
Canvas canvas = holder.lockCanvas();
// 独立线程绘制逻辑
holder.unlockCanvasAndPost(canvas);
}).start();
}
});
- 双缓冲机制 :通过
lockCanvas()和unlockCanvasAndPost()实现无闪烁绘制 - 硬件加速:直接操作Surface,绕过View系统层级限制
- 典型应用 :
- 视频播放(VideoView基于SurfaceView)
- Camera预览
- 实时绘制(心电图、游戏背景)
▎GLSurfaceView 的强化
java
// OpenGL ES渲染配置
glSurfaceView.setRenderer(new GLSurfaceView.Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// OpenGL初始化
}
@Override
public void onDrawFrame(GL10 gl) {
// 每帧OpenGL渲染
}
});
- 专属优化 :
- 自动管理EGL上下文
- 内置帧速率控制(
setRenderMode(RENDERMODE_CONTINUOUSLY)) - 简化OpenGL ES生命周期管理
- 核心场景 :
- 3D游戏/VR应用
- 复杂粒子特效
- ARCore/Vulkan应用
4. 性能关键数据对比
| 指标 | View | SurfaceView | GLSurfaceView |
|---|---|---|---|
| 最高刷新率(FPS) | ≤60 | 90+ | 120+ |
| 内存占用 | 低 | 中 | 高 |
| GPU利用率 | 0-30% | 30-70% | 70-100% |
5. 选型决策指南
-
选择 View 当:
- 更新由用户交互触发(如按钮点击)
- 界面元素简单(表单/文本/静态图片)
- 需要兼容复杂布局嵌套
-
选择 SurfaceView 当:
- 需要>60FPS的持续绘制(视频流/游戏)
- 避免UI线程阻塞
- 直接操作像素数据(如自定义绘图板)
-
选择 GLSurfaceView 当:
- 涉及OpenGL ES/Vulkan图形API
- 需要3D变换/纹理贴图/着色器
- 追求极致渲染性能(如AR滤镜)
⚠️ 注意:
- SurfaceView的透明区域需特殊处理(默认不透明)
- GLSurfaceView在Android 7.0+建议配合Vulkan使用
- 现代替代方案:优先考虑
TextureView(无独立图层)或SurfaceTexture(无视图层级)