资讯动态

SkiaSharp 1.68.2 Android API 变更解读:SKPaintGLSurfaceEventArgs 新增构造函数与 GPU 绘制实践

发布时间:2026/10/15 17:38:42 来源:尧图企业网站定制
图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载本文围绕 SkiaSharp 1.68.2 版本发布说明中 SkiaSharp.Views.Android.dll 的 API 变更文档 展开聚焦SKPaintGLSurfaceEventArgs新增构造函数这一核心变更并结合当前仓库的 事件参数源码、Android 平台渲染器实现与官方示例讲解该类型在SKGLSurfaceView/SKGLTextureViewGPU 渲染链路中的角色。读完本文你将理解这组构造参数的来源与含义、PaintSurface事件的触发机制以及如何基于新 API 编写 Android 上的硬件加速绘图代码。变更速览1.68.2 中 SkiaSharp.Views.Android 的 API 变更1.68.2 的发布说明API diff针对SkiaSharp.Views.Android.dll记录了唯一一处变更——类型SkiaSharp.Views.Android.SKPaintGLSurfaceEventArgs新增了一个构造函数public SKPaintGLSurfaceEventArgs ( SkiaSharp.SKSurface surface, SkiaSharp.GRBackendRenderTarget renderTarget, SkiaSharp.GRSurfaceOrigin origin, SkiaSharp.SKColorType colorType, SkiaSharp.GRGlFramebufferInfo glInfo);该条目位于 documentation/docfx/releases/1.68.2/SkiaSharp.Views/SkiaSharp.Views.Android.md 的Namespace SkiaSharp.Views.Android一节。与之相对同版本其他平台的 Views 程序集如 SkiaSharp.Views.Desktop.md标注为 No changes可见本次 Android 侧的关注点正是这个 GPU 绘制事件参数类型。新增构造函数的五个参数逐个拆解这一构造函数把一次 GPU 绘制所需的全部上下文集中在一个事件参数对象中五个参数各司其职参数类型含义surfaceSKSurface当前正在被绘制的 Skia 表面绘制指令通过surface.Canvas发出renderTargetGRBackendRenderTarget当前正在绘制的 GPU 后端渲染目标封装 OpenGL framebufferoriginGRSurfaceOrigin渲染目标的表面原点决定画布坐标系的 Y 轴方向colorTypeSKColorType渲染目标的颜色类型描述像素的存储格式glInfoGRGlFramebufferInfoOpenGL framebuffer 信息包含 framebuffer ID 与 sized internal format其中GRGlFramebufferInfo是 GRDefinitions.cs 中定义的结构体它持有两个关键字段fboIdOpenGL framebuffer 对象 ID即GL_FRAMEBUFFER_BINDING查询到的句柄formatframebuffer 的 sized internal format如RGBA8它由SKColorType通过ToGlSizedFormat扩展方法换算而来。从源码看 SKPaintGLSurfaceEventArgs 的完整构造函数家族当前仓库中SKPaintGLSurfaceEventArgs定义于共享源码 SKPaintGLSurfaceEventArgs.cs通过条件编译映射到 Android、iOS、tvOS、macOS、Tizen、WinUI、UWP、Blazor 等平台命名空间。该类继承自EventArgs共提供四个公开构造函数// 1) 双参数重载使用默认的 origin 与 colorType public SKPaintGLSurfaceEventArgs(SKSurface surface, GRBackendRenderTarget renderTarget) : this(surface, renderTarget, GRSurfaceOrigin.BottomLeft, SKColorType.Rgba8888) { } // 2) 四参数重载origin colorTypeInfo 由 renderTarget 尺寸推导 public SKPaintGLSurfaceEventArgs(SKSurface surface, GRBackendRenderTarget renderTarget, GRSurfaceOrigin origin, SKColorType colorType) { Surface surface; BackendRenderTarget renderTarget; ColorType colorType; Origin origin; Info new SKImageInfo(renderTarget.Width, renderTarget.Height, ColorType); RawInfo Info; } // 3) 四参数重载origin SKImageInfo public SKPaintGLSurfaceEventArgs(SKSurface surface, GRBackendRenderTarget renderTarget, GRSurfaceOrigin origin, SKImageInfo info) : this(surface, renderTarget, origin, info, info) { } // 4) 五参数重载origin info rawInfo public SKPaintGLSurfaceEventArgs(SKSurface surface, GRBackendRenderTarget renderTarget, GRSurfaceOrigin origin, SKImageInfo info, SKImageInfo rawInfo) { Surface surface; BackendRenderTarget renderTarget; ColorType info.ColorType; Origin origin; Info info; RawInfo rawInfo; }可以看到双参数重载隐含了两个默认值GRSurfaceOrigin.BottomLeft与SKColorType.Rgba8888——这与 Android 渲染器内部使用的常量完全一致详见下文渲染链路。而 1.68.2 发布说明记录的带glInfo参数重载从当前源码结构看GRGlFramebufferInfo已被封装进GRBackendRenderTarget内部渲染器在创建 render target 时传入glInfo事件参数层面不再需要单独暴露该参数。该类的公开属性只读包括Surface当前绘制表面BackendRenderTarget后端渲染目标ColorType渲染目标的颜色类型Origin渲染目标表面原点Info表面图像信息尺寸 颜色类型RawInfo底层渲染目标的原始图像信息在需要区分逻辑尺寸与物理尺寸时使用。GRBackendRenderTarget 与 GRGlFramebufferInfo事件参数背后的 GPU 对象GRBackendRenderTarget在 GRBackendRenderTarget.cs 中定义其 OpenGL 构造路径为public GRBackendRenderTarget (int width, int height, int sampleCount, int stencilBits, GRGlFramebufferInfo glInfo)对应底层调用SkiaApi.gr_backendrendertarget_new_gl(width, height, sampleCount, stencilBits, glInfo)。该类同样支持 VulkanGRVkImageInfo、MetalGRMtlTextureInfo与 Direct3DGRD3DTextureResourceInfo后端并通过Backend属性标识当前后端。事件处理中常用的属性包括Width/Height渲染目标像素尺寸绘制时通常直接以它们作为画布范围SampleCount每像素采样数多重采样抗锯齿相关StencilBits每像素模板缓冲位数IsValid底层对象是否已完成初始化GetGlFramebufferInfo()若包装的是 OpenGL framebuffer可取回其信息。GRGlFramebufferInfo的 format 字段一般不需要手工指定——GRDefinitions.cs 中的ToGlSizedFormat(this SKColorType)扩展方法提供了SKColorType到 GL sized format 的完整映射例如Rgba8888 → RGBA8、Bgra8888 → BGRA8、RgbaF16 → RGBA16F、Srgba8888 → SRGB8_ALPHA8无法映射的类型如Unknown、Rgba10x6等返回 0。事件如何触发PaintSurface 与 OnPaintSurfaceSKPaintGLSurfaceEventArgs是SKGLSurfaceView与SKGLTextureView上PaintSurface事件的数据载体。以 SKGLSurfaceView.cs 为例视图提供两种绘制入口方式一订阅事件myView.PaintSurface (sender, e) { var surface e.Surface; var surfaceWidth e.BackendRenderTarget.Width; var surfaceHeight e.BackendRenderTarget.Height; var canvas surface.Canvas; // 在 canvas 上绘制…… canvas.Flush(); };方式二覆写虚方法protected override void OnPaintSurface(SKPaintGLSurfaceEventArgs e) { // 注意必须调用 base否则事件不会触发 base.OnPaintSurface(e); var surface e.Surface; var canvas surface.Canvas; // 绘制…… canvas.Flush(); }源码中OnPaintSurface的默认实现即为PaintSurface?.Invoke(this, e)并且视图内部通过私有的InternalRenderer把渲染器的回调转发给视图的OnPaintSurface。因此文档与 XML 注释都明确强调如果覆写OnPaintSurface而不调用base.OnPaintSurface(e)外部订阅的PaintSurface事件将不会被触发。两种方式任选其一即可不必同时使用。底层渲染链路OnDrawFrame 中如何构造事件参数要真正理解这些参数从何而来需要阅读渲染器 SKGLSurfaceViewRenderer.cs 的OnDrawFrame实现。每一次 GL 帧回调大致经历以下步骤清屏GLES20.GlClear清空颜色、深度与模板缓冲创建 GPU 上下文首次回调时通过GRGlInterface.Create()取得 GL 接口再GRContext.CreateGl(glInterface)创建GRContext读取 framebuffer 状态并重建 render target通过GlGetIntegerv分别读取GL_FRAMEBUFFER_BINDING、GL_STENCIL_BITS、GL_SAMPLES将采样数裁剪到context.GetMaxSurfaceSampleCount(colorType)允许的范围然后构造glInfo new GRGlFramebufferInfo((uint)buffer[0], colorType.ToGlSizedFormat()); renderTarget new GRBackendRenderTarget(newSize.Width, newSize.Height, samples, buffer[1], glInfo);创建 Skia 表面SKSurface.Create(context, renderTarget, surfaceOrigin, colorType)构造事件参数并分发using (new SKAutoCanvasRestore(canvas, true)) { var e new SKPaintGLSurfaceEventArgs(surface, renderTarget, surfaceOrigin, colorType); OnPaintSurface(e); }冲刷canvas.Flush()与context.Flush()把 Skia 绘制指令提交给 GL。渲染器内部的两个常量colorType SKColorType.Rgba8888、surfaceOrigin GRSurfaceOrigin.BottomLeft正是事件参数四参数重载的默认值来源OnSurfaceChanged中执行GLES20.GlViewport(0, 0, width, height)并记录新尺寸OnSurfaceCreatedSKGLTextureViewRenderer中为创建/销毁时释放旧上下文负责生命周期管理。视图初始化时还会调用SetEGLContextClientVersion(2)与SetEGLConfigChooser(8, 8, 8, 8, 0, 8)配置 EGL 环境。SKGLTextureViewRenderer见 SKGLTextureViewRenderer.cs采用相同的流程区别在于它基于GLTextureView并在OnSurfaceCreated/OnSurfaceDestroyed时通过FreeContext()释放并重建 GPU 资源。实战在 SKGLSurfaceView 与 SKGLTextureView 上绘制官方示例 samples/Basic/Android/SkiaSharpSample 提供了两种视图的完整用法GpuSurfaceFragment.cs基于SKGLSurfaceViewGpuTextureFragment.cs基于SKGLTextureView。两者的核心绘制逻辑相同均使用SKRuntimeEffect生成着色器并在PaintSurface事件中绘制全屏矩形skiaView.PaintSurface OnPaintSurface; private void OnPaintSurface(object sender, SKPaintGLSurfaceEventArgs e) { var canvas e.Surface.Canvas; var width e.BackendRenderTarget.Width; var height e.BackendRenderTarget.Height; var builder shaderBuilder.Value; builder.Uniforms[iTime] fpsCounter.ElapsedSeconds; builder.Uniforms[iResolution] new float[] { (float)width, (float)height }; using var shader builder.Build(); using var paint new SKPaint { Shader shader }; canvas.DrawRect(0, 0, width, height, paint); }示例中的几个实践要点值得注意绘制区域直接取自e.BackendRenderTarget.Width / Height而不是视图的布局尺寸——因为画布大小会受设备像素密度影响CanvasSize可能与视图尺寸不一致渲染器源码注释对此有明确说明SKGLSurfaceView支持RenderMode Rendermode.Continuously实现持续重绘FPS 场景常用而SKGLTextureView默认按需绘制示例中只处理了触摸事件驱动的重绘在OnDestroyView中务必解除事件订阅skiaView.PaintSurface - OnPaintSurface并释放着色器构建器避免 Fragment 重建造成的事件泄漏与资源泄漏。此外在 MAUI 平台SKGLView的 Android Handler见 SKGLViewHandler.Android.cs会把平台事件的e.Surface、e.BackendRenderTarget、e.Origin、e.Info、e.RawInfo原样转发给虚拟视图即使用五参数重载构造新的事件参数——这说明SKPaintGLSurfaceEventArgs的构造函数族也是跨平台封装层之间传递绘制上下文的标准载体。升级迁移注意事项结合前序版本的 API diff见 1.68.0 的 SkiaSharp.Views.Android.md可以梳理出完整的演进脉络1.68.0 起SKPaintGLSurfaceEventArgs旧构造函数SKPaintGLSurfaceEventArgs(SKSurface, GRBackendRenderTargetDesc)被标记[Obsolete]对应属性RenderTarget类型GRBackendRenderTargetDesc同样废弃替代方案是BackendRenderTarget类型GRBackendRenderTargetOriginColorType的组合1.68.0 同时新增了SKGLSurfaceView/SKGLTextureView的PaintSurface事件与OnPaintSurface虚方法并废弃了旧的SetRenderer(ISKRenderer)渲染器模式以及SKGLSurfaceViewRenderer.OnDrawFrame(SKSurface, GRBackendRenderTargetDesc)抽象方法1.68.2 则进一步补充了SKPaintGLSurfaceEventArgs的构造函数重载完善了事件参数在不同调用场景下的构建能力。因此从 1.68 之前的版本升级时建议迁移路径为以PaintSurface事件或覆写OnPaintSurface替代自定义ISKRenderer在事件参数中读取Surface与BackendRenderTarget进行绘制并同步检查是否存在对已废弃GRBackendRenderTargetDesc类型的引用。小结SKPaintGLSurfaceEventArgs是连接 SkiaSharp GPU 表面与 Android GL 视图的枢纽渲染器在每一帧读取 framebuffer 状态、构建GRBackendRenderTarget与SKSurface之后把绘制上下文封装成事件参数交给PaintSurface事件或OnPaintSurface虚方法。1.68.2 记录的新增构造函数与 1.68.0 引入的事件模型一起构成了当前仓库 Android 平台 GPU 绘制的标准 API 形态理解这组参数的来源与默认值BottomLeftRgba8888即可准确把控硬件加速绘制的每一个环节。赞分享图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载相关推荐SkiaSharp 1.68.2 macOS 视图 API 变更解读SKGLView.Reshape 与 SKPaintGLSurfaceEventArgs 新构造函数SkiaSharp 1.68.2 macOS 视图 API 变更解读SKGLView.Reshape 与 SKPaintGLSurfaceEventArgs图形学图像处理跨平台SkiaSharp 1.68.2 桌面 OpenGL 渲染 API 变更解析SKPaintGLSurfaceEventArgs 新增构造函数SkiaSharp 1.68.2 桌面 OpenGL 渲染 API 变更解析SKPaintGLSurfaceEventArgs 新增构造函数 本文基于 Ski图形学图像处理跨平台SkiaSharp.Views.Tizen 1.68.2 API 变更解读SKPaintGLSurfaceEventArgs 新增 glInfo 构造器SkiaSharp.Views.Tizen 1.68.2 API 变更解读SKPaintGLSurfaceEventArgs 新增 glInfo 构造器 本文图形学图像处理跨平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑