canvas.drawText-多次vs.一次开销

| 在整个字符串上调用一次drawText与为字符串中的每个字符(或单词)调用drawText有明显的区别吗?     
已邀请:
为了娱乐,我为此进行了测试。我以为完整的字符串绘制会更快,主要是因为从Java到本机代码的上下文切换次数减少了。结果很有趣。 测试如下。我创建了一个简单的自定义视图,该视图扩展了View并实现了onDraw,如下所示:
String text = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";
String t[] = {\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",
              \"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",
              \"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\"};
long fulltime=0;
double fullavetime=0;
long fullcount=0;   
long chartime=0;
double charavetime=0;
long charcount=0;
@Override
protected void onDraw(Canvas canvas) {
    float width = (float) getWidth();
    float inc=width/26;
    float y1 = (float) getHeight() / 3;
    float y2 = y1*2;;
    float x=0;

        // do this test loop 1000 times to get time data
    if (fullcount < 1000) {

        // test by char using a simple 26 char string
        // I tried to eliminate as much overhead as possible
        // so this just pulls strings from an array and draws them
    long start=System.currentTimeMillis();

    for (int i=0;i<26;i++) {
        canvas.drawText(t[i], x, y1, textPaint);
        x+=inc;
    }

    long end=System.currentTimeMillis();
    long elapse=end-start;
    chartime+=elapse;
    charcount++;
    charavetime=(double)chartime/charcount;

        // draw the entire 26 char string at once
    x=0f;
    start=System.currentTimeMillis();

    canvas.drawText(text, x, y2, textPaint);

    end=System.currentTimeMillis();
    elapse=end-start;
    fulltime+=elapse;
    fullcount++;
    fullavetime=(double)fulltime/fullcount;
    } else {
           // after the 1000 test draws, just paint the results on screen
        canvas.drawText(\"bychar \"+charavetime, 0, y1, textPaint);
        canvas.drawText(\"  full \"+fullavetime, 0, y2, textPaint);
    }
        // keep painting over and over
    invalidate();
}
我在方便的三部手机上运行了,结果如下
HTC EVO 4G (2.2)
bychar 1.055  1.142  1.184
full    .398   .354   .432

Motorola Droid (2.1 up 1)
bychar .951  1.108  1.071
full   .138   .146   .134

Nexus One (2.3.3)
bychar .991 1.033 1.045 .938
full   .839  .886  .891 .819
我还做了一个模拟器,该模拟器与bychar结果可笑地歪曲了十倍的全字符串结果。 结果有些意外。显然,摩托罗拉droid具有非常快速的本机文本绘制例程,并且Java到本机的进程同样慢。 与往常一样,仔细检查代码,我可能做了一些使测试歪斜的事情。 我的收获是,您应该尽可能画出完整的字符串。正如他们所说,您的里程可能会有所不同。     
在字符串中的每个字符上调用drawtext可能导致不同设备和屏幕尺寸的未对齐。 如果您编写代码来解决该问题,那么我认为那时您将继续跟踪更多变量并调用外部类和方法,这将减慢画布的绘制速度。 (如果画布必须在绘制中间进行计算或在类外调用时,它会降低画布的速度) 由于ondraw是canvas的继承方法,因此如果您使用多个实例,则它不应有太大影响。它背后的所有编码会使它变慢     

要回复问题请先登录注册