A
Air官方
移植图形应用绕不开 OpenGL 上下文创建。桌面代码里几行的创建调用,在鸿蒙上牵出配置、共享、线程的一串细节。这篇讲清楚。
▍创建的标准序列
获得原生窗口——初始化显示连接——枚举配置——创建上下文与窗口表面——设当前(绑定线程)——绘制——交换缓冲。每步都有失败可能,错误码要逐一检查并日志(E 级)。真实工程的教训:某步失败后代码继续跑,最后表现成随机黑屏或崩溃,回查发现创建序列根本没走完——宁可创建失败立刻报错退出,也别带病运行。
▍配置选择
颜色格式(与窗口格式匹配)、深度与模板(按需,2D 应用可不要)、缓冲与采样(合成器兼容优先,别默认开多采样)、上下文版本(按应用需要的最低版本,别追新)。配置项组合在不同设备驱动上的支持度有差异,选配置时给候选优先级列表而不是单项绑定(第一选择不支持自动降第二)。
▍线程纪律
当前上下文绑定线程:一个上下文同一时刻只能在一个线程当前。渲染线程专属上下文是标准架构;多线程共享要显式建共享上下文(资源跨线程可见,但操作仍要同步)。真实坑族:在错误的线程调绘制(未绑定上下文,静默无效);两个线程抢一个上下文(交错绑定,画面撕裂加随机崩溃);表面销毁后线程还持有(僵尸表面)。解法都是纪律性的:渲染上下文的生命周期绑定渲染线程,销毁与重建在同一线程完成。
▍新旧表面的迁移
窗口重建(旋转、折叠、模式切换)时,上下文可以保留但表面要换:先解绑旧表面、销毁、建新、重绑。可保留的资源(纹理、着色器)在上下文存活期间有效,别过度销毁重建(闪屏与耗时的来源)。
▍与翻译层的配合
走 gl4es 翻译层时,上下文创建由翻译层代理,应用看到老 GL 接口——配置选择退到翻译层参数,注意翻译层的配置文档与限制(版本声明、扩展暴露)。
▍验收
创建失败路径的报错日志齐全;旋转与折叠后的表面重建画面正常;多窗口场景无串扰;长时间运行无上下文泄漏(设备句柄数稳定)。
更多真实移植案例,欢迎到 apps 板块翻看 56 篇《鸿蒙PC适配全记录》系列实录。
▍创建的标准序列
获得原生窗口——初始化显示连接——枚举配置——创建上下文与窗口表面——设当前(绑定线程)——绘制——交换缓冲。每步都有失败可能,错误码要逐一检查并日志(E 级)。真实工程的教训:某步失败后代码继续跑,最后表现成随机黑屏或崩溃,回查发现创建序列根本没走完——宁可创建失败立刻报错退出,也别带病运行。
▍配置选择
颜色格式(与窗口格式匹配)、深度与模板(按需,2D 应用可不要)、缓冲与采样(合成器兼容优先,别默认开多采样)、上下文版本(按应用需要的最低版本,别追新)。配置项组合在不同设备驱动上的支持度有差异,选配置时给候选优先级列表而不是单项绑定(第一选择不支持自动降第二)。
▍线程纪律
当前上下文绑定线程:一个上下文同一时刻只能在一个线程当前。渲染线程专属上下文是标准架构;多线程共享要显式建共享上下文(资源跨线程可见,但操作仍要同步)。真实坑族:在错误的线程调绘制(未绑定上下文,静默无效);两个线程抢一个上下文(交错绑定,画面撕裂加随机崩溃);表面销毁后线程还持有(僵尸表面)。解法都是纪律性的:渲染上下文的生命周期绑定渲染线程,销毁与重建在同一线程完成。
▍新旧表面的迁移
窗口重建(旋转、折叠、模式切换)时,上下文可以保留但表面要换:先解绑旧表面、销毁、建新、重绑。可保留的资源(纹理、着色器)在上下文存活期间有效,别过度销毁重建(闪屏与耗时的来源)。
▍与翻译层的配合
走 gl4es 翻译层时,上下文创建由翻译层代理,应用看到老 GL 接口——配置选择退到翻译层参数,注意翻译层的配置文档与限制(版本声明、扩展暴露)。
▍验收
创建失败路径的报错日志齐全;旋转与折叠后的表面重建画面正常;多窗口场景无串扰;长时间运行无上下文泄漏(设备句柄数稳定)。
更多真实移植案例,欢迎到 apps 板块翻看 56 篇《鸿蒙PC适配全记录》系列实录。
楼主
7 天前