自绘组件库思考

如果先不管窗口管理的具体逻辑,我们先聚焦于绘制这个任务上面来。

flowchart TB
  subgraph ui["主线程 / 其它线程"]
    App[应用 / Widget 等]
  end
  subgraph rt["RenderThread 专用线程"]
    Q[任务队列 Post / InvokeSync]
    RC[RenderContext: EGL + ANGLE + GrDirectContext]
    RS[RenderSurface: EGLSurface + SkSurface]
    Draw[SkCanvas 上画 Shapes / Rectangle]
  end
  App -->|"Post(任务) 或 CreateContext/CreateSurface"| Q
  Q --> RC
  RC --> RS
  RS --> Draw

渲染线程是一个单线程+队列的形式,所有 EGL / 当前上下文 / 创建 RenderContext·RenderSurface 都应在这条线程上完成(或通过 Post / InvokeSync 投递过去)。

并且,我们需要一个和GPU绘画的资源,那就是EGL,经 ANGLE,Windows 上走 D3D11)+ Skia 的 GrDirectContext。

GLFW的窗口句柄绑定到EGL的surface后,使用sksurface-》 skcanvas,负责一帧的绘制。