AS3 x和y属性精度

Pon*_*dle 6 flash precision rendering actionscript-3 coordinates

在ActionScript 3(和IIRC 2)中,显示对象上的x和y属性始终存储为0.05的倍数.

所以像是一样obj.x = 66.6666的东西obj.x = 66.65

大多数时候,这没关系.但有时我最终会得到速度很慢的物体,例如每秒1个像素.1/60(fps)=每帧0.017像素.obj.x += 0.017永远不会真正改变x值,因为它被四舍五入到最接近的0.05.
这迫使我覆盖DisplayObject的x和y属性,以便它们不会被舍入.

我可以理解舍入坐标到最接近的渲染积分值.使用更高级的渲染器,我甚至可以理解舍入到二进制可表示的一些分数(例如0.25).但0.05不能用二进制表示.

那么为什么Flash的创造者决定四舍五入到最接近的.05?这对我来说似乎是一个任意数字.

Rya*_*n S 9

来自维基百科关于Twips的文章:

Flash内部计算使用具有缇(或像素的1/20)的像素的任何内容.精灵,电影剪辑和舞台上的任何其他对象都是缇.结果,(例如)精灵的坐标总是0.05的倍数(即1/20).(即1/20).

解决方法是将坐标存储在数字中,然后将其分配给displayobject的属性.

  • 根据SWF文件格式规范,"Twips在尺寸和精度之间是一个很好的折衷.它们提供子像素精度,用于缩放和精确放置对象,同时每个坐标消耗很少的比特." (3认同)

小智 5

更好的是,DisplayObject的其他属性的精度也不同...请考虑以下代码:

var tmp:Number = 1/17;
var s:Sprite = new Sprite();
s.scaleX = tmp;
s.scaleY = tmp;
s.x = tmp;
s.y = tmp;
s.rotation = tmp;
trace(tmp);
trace(s.scaleX);
trace(s.scaleY);
trace(s.x);
trace(s.y);
trace(s.rotation);
Run Code Online (Sandbox Code Playgroud)

它会输出

0.058823529411764705
0.0588235294117647
0.0588235294117647
0.05
0.05
0.058823529411764705
Run Code Online (Sandbox Code Playgroud)

这意味着旋转存储在数字精度中,x和y以缇(0.05的倍数)存储,而scaleX和scaleY存储在接近数字但稍微少一点(可能正好少一点?)的精度中