Flash Stage.quality影响DisplayObject.concatenatedMatrix缩放的原因咨询
Flash
stage.quality设置影响concatenatedMatrix取值的底层原因 通过设置stage.quality调整Flash舞台画质等级时,会对矩阵DisplayObject.transform.concatenatedMatrix的取值产生影响,相关验证代码如下:
import flash.text.TextField; var child = new TextField(); var quals = ["best", "high", "16x16", "16x16linear", "8x8", "8x8linear", "low", "medium"]; for (var i in quals) { var qual = quals[i]; stage.quality = qual; trace(qual + " TextField " + child.transform.concatenatedMatrix); trace(qual + " stage " + stage.transform.concatenatedMatrix); }
上述代码在最新版Adobe Animate环境、Flash Projector 35播放器中运行,得到如下输出结果:
best TextField (a=5, b=0, c=0, d=5, tx=0, ty=0) best stage (a=5, b=0, c=0, d=5, tx=0, ty=0) high TextField (a=5, b=0, c=0, d=5, tx=0, ty=0) high stage (a=5, b=0, c=0, d=5, tx=0, ty=0) 16x16 TextField (a=1.25, b=0, c=0, d=1.25, tx=0, ty=0) 16x16 stage (a=1.25, b=0, c=0, d=1.25, tx=0, ty=0) 16x16linear TextField (a=1.25, b=0, c=0, d=1.25, tx=0, ty=0) 16x16linear stage (a=1.25, b=0, c=0, d=1.25, tx=0, ty=0) 8x8 TextField (a=2.5, b=0, c=0, d=2.5, tx=0, ty=0) 8x8 stage (a=2.5, b=0, c=0, d=2.5, tx=0, ty=0) 8x8linear TextField (a=2.5, b=0, c=0, d=2.5, tx=0, ty=0) 8x8linear stage (a=2.5, b=0, c=0, d=2.5, tx=0, ty=0) low TextField (a=20, b=0, c=0, d=20, tx=0, ty=0) low stage (a=20, b=0, c=0, d=20, tx=0, ty=0) medium TextField (a=10, b=0, c=0, d=10, tx=0, ty=0) medium stage (a=10, b=0, c=0, d=10, tx=0, ty=0)
目前暂未查询到官方文档对该行为的相关说明,所有公开资料均显示舞台画质设置与显示对象变换逻辑应完全独立。实际观测得到如下结论:
Stage.transform.matrix不受画质设置影响,说明该缩放变换在舞台自身变换之前生效,效果等同于舞台存在上层父级容器;- 不同画质下
concatenatedMatrix的取值差异均体现为缩放操作,且画质等级越低,对应的缩放系数越高。
底层原因说明
这个现象是Flash播放器渲染管线的历史遗留设计导致的,不属于文档记载的预期API行为:
- 所有非
best/high档位的画质模式,核心性能优化手段都是调整离屏渲染缓冲区的实际分辨率,减少需要计算的像素总量:画质越低,渲染缓冲区的实际尺寸和舞台逻辑尺寸的比值差异越大,渲染时需要处理的像素数越少。所有显示对象(包括Stage本身)都会先被绘制到这个离屏缓冲区,最后再由播放器将缓冲区内容拉伸/收缩到舞台视口的实际尺寸输出到屏幕。 concatenatedMatrix属性的内部计算逻辑,是返回显示对象本地坐标系到当前最终渲染目标坐标系的全链路累积变换矩阵,不是到Stage本地坐标系的矩阵。播放器套在Stage外层的、用于匹配渲染缓冲区尺寸的隐式缩放变换,会被完整计入这个累积矩阵的计算结果。Stage.transform.matrix仅记录Stage对象自身被主动设置的变换属性,播放器外层的隐式视口变换不属于Stage自身的属性,自然不会对这个值产生影响,和观测结果完全吻合。
从测试结果的数值比例可以看出,不同画质档位对应的缩放系数,和该档位下离屏渲染缓冲区与舞台逻辑尺寸的比值完全匹配,画质越低,为了减少渲染像素量对缓冲区尺寸的调整幅度越大,累积矩阵里的缩放系数偏差就越明显。
这个行为属于AS层API暴露时的设计疏漏:concatenatedMatrix最早是播放器渲染管线内部做坐标换算用的内部属性,暴露给开发者时没有剥离最外层的播放器视口隐式变换,且因为Flash平台早已停止迭代,该问题始终没有被修复。
内容的提问来源于stack exchange,提问作者Aaron Hill
相关产品推荐
相关产品推荐

