“写AE插件没有遇到需要花上两三天解决的坑,注定是不完整的。” “没有见过比AE的API更脑瘫更难用的API”

变量相关

变量格式——关于脑瘫定点数

脑瘫AE不知道发什么疯,还在沾沾自喜地使用只会出现在计组教科书中的定点数(Fixed Point)。 所谓定点数,在AE中是总长度为32,前16位用于表示整数部分,后16位表示小数部分的数的表示方法。由于前16位是整数部分,因此整数部分的范围只有int16的范围,即-32768~32767,小数部分的精度为1 ÷ 65536 = 0.0000152587890625,精度是比较好的。 AE使用定点数的原因一定是因为定点数的精度足够,定点数的计算由于只涉及了整数计算,因此也比较快。但是,在控制情绪的情况下可以有以下六个理由反驳这种脑瘫行为:

  1. 现代CPU浮点性能今时不同往日,除非在性能及其孱弱的嵌入式设备上才稍微有可能考虑使用定点数。
  2. AE的定点数是使用在变量中的,只是用于储存变量,并不涉及任何计算,使用脑瘫定点数完全不会提高计算性能。
  3. 定点数的范围最多也就-32769~32768,AE是觉得这些数值是非常大吗?那为什么在我们对分形噪波的演化属性进行k帧时经常会因为超过定点数范围而造成奇异的演化数值?
  4. 在编写插件过程中,开发者需要对这些定点数打交道,没有人会愿意直接使用定点数进行运算,因此通常都是直接转换为浮点数后进行计算。那么问题来了,为什么不直接使用浮点数?而是提供FIX2FLOATINT2FIXED这两个丑陋的宏。各位注意到AE并没有提供FLOAT2FIXED的宏,这是因为浮点数就不能像整数一样简单地转换到脑瘫定点数。
  5. AE本身一定也注意到了这个问题,但是由于种种原因,只有一部分变量支持使用浮点数,而另一部分则完全不支持,例如Point_2D类型是纯纯的脑瘫定点数,而Point_3D又是纯纯浮点数(而且完全不在文档中标注)。半生半熟,不愧是脑瘫
  6. 使用定点数的一个好处是精度分布非常均匀,从最小值到最大值之间,精度是完全相同的,而浮点数则会在数轴上靠近0的部分精度较高,数值越大精度越低。但是首先AE是一个制作影片的软件,对某属性进行K帧时,就算两帧之间的数值差异较大,只要K帧的属性变化是连续的,那么就不会显得非常突兀,这间接降低了我们对数据精度的要求(实际上我是完全没有遇到过需要调整数值到小数点后5位的情况);其次,浮点数在8388608到16777215区间会有1的精度误差,因此在小于8388608时精度误差小于1,在32767时的误差约莫为小数点后三位,对于AE来说是完全够用的,即使如果在特殊情况下不够,也可以使用双精度浮点获取更精确的数值;再次,如果AE仍然固执地想保持精度的均匀性,那为什么不使用64位定点数?是因为你想在早就放弃的32位平台获得几乎为0的性能提升?是因为想要保证兼容性、减小工程文件的大小?那为什么不提供不同位数的精度选项?为什么不调整小数点的位置以增大定点数的表示范围,是因为你觉得不值得提高哪怕1位整数范围,在损失0.0000152587890625精度的情况下获得两倍的表示范围?。