智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Flash Player 10的Drawing API 2.0

Posted on   Bill Yuan  阅读(865)  评论(0编辑  收藏  举报

转自:http://www.kingnare.com/auzn/archives/546

文章对Grahpics API新增的drawPath, drawTriangles方法与传统方法之间的性能做了一些测试.
运行下面的代码:

复制代码
代码
var container:Shape = new Shape();
addChild(container);
var currentTime:Number 
= getTimer();
var commands:Vector. 
= Vector.([1,2,2,2,2]);
var coords:Vector. 
= Vector.([10,10,100,10,100,100,10,100,10,10]);
for (var i:int = 0; i< 15000; i++)
{
    container.graphics.clear();
    container.graphics.beginFill(
0x9900001);
    container.graphics.drawPath(commands, coords);
}
trace( getTimer() 
- currentTime );
复制代码

用时18~20ms
然后用传统的方法实现:

复制代码
代码
var container:Shape = new Shape();
addChild(container);
var currentTime:Number 
= getTimer();
var commands:Vector. 
= Vector.([1,2,2,2,2]);
var coords:Vector. 
= Vector.([10,10,100,10,100,100,10,100,10,10]);
for (var i:int = 0; i< 15000; i++)
{
    container.graphics.clear();
    container.graphics.beginFill(
0x9900001);
    
//container.graphics.drawPath(commands, coords);
    container.graphics.moveTo( coords[0], coords[1] );
    container.graphics.lineTo( coords[
2], coords[3] );
    container.graphics.lineTo( coords[
4], coords[5] );
    container.graphics.lineTo( coords[
6], coords[7] );
    container.graphics.lineTo( coords[
8], coords[9] );
}
trace( getTimer() 
- currentTime );
复制代码

 

竟和原文一样,用时31ms
原文提到,虽然新方法快了不少,但有一点要注意,我们所测试的是把所有指令数据传送给renderer的时间,并不包括rendering time.
通过以上测试,得知方法drawPath快很多,但我们并不知道所使用的rendering time是多少.
Flash Player的rendering是异步的,所以要注意在帧重绘中才会引发rendering.
强行调用Flash Player的renderer就是使用BitmapData.draw(). 可以通过这个方法测试rendering时间.

复制代码
代码
var bitmap:BitmapData = new BitmapData(400,400);
var container:Shape 
= new Shape();
addChild(container);
var commands:Vector. 
= Vector.([1,2,2,2,2]);
var coords:Vector. 
= Vector.([10,10,100,10,100,100,10,100,10,10]);
for (var i:int = 0; i< 15000; i++)
{
    container.graphics.clear();
    container.graphics.beginFill(
0x9900001);
    container.graphics.drawPath(commands, coords);
}
var currentTime:Number 
= getTimer();
bitmap.draw( container );
trace( getTimer() 
- currentTime );
复制代码

 

多次运行的结果为0或1,不过0的机率要大些.
使用传统方法测试,结果差不多.
最后,总的时间花销为:

复制代码
代码
var bitmap:BitmapData = new BitmapData(400,400);
var container:Shape 
= new Shape();
addChild(container);
var currentTime:Number 
= getTimer();
var commands:Vector. 
= Vector.([1,2,2,2,2]);
var coords:Vector. 
= Vector.([10,10,100,10,100,100,10,100,10,10]);
for (var i:int = 0; i< 15000; i++)
{
    container.graphics.clear();
    container.graphics.beginFill(
0x9900001);
    container.graphics.drawPath(commands, coords);
}
bitmap.draw( container );
trace( getTimer() 
- currentTime );
复制代码

 

用时20~22ms
作者结论是从AS代码执行来讲,drawPath,drawTriangles能提供更高的性能.
如果你的程序将大量时间花销在向renderer发送命令数据上,可以使用此方法来提高程序性能;
但对于rendering的性能提升,新的API是不会有任何帮助的.

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示