Java canvas.drawText-多次开销与一次开销

Java canvas.drawText-多次开销与一次开销,java,android,drawtext,Java,Android,Drawtext,对整个字符串调用一次drawText与对字符串中的每个字符(或单词)调用drawText之间是否存在显著差异?对字符串中的每个字符调用drawText会导致不同设备和屏幕大小的不对中 如果您编写代码来解决这个问题,我会假设在那时您将跟踪更多的变量,并调用外部类和方法,这将降低画布的ondraw速度。(如果画布必须在绘制中进行计算或调用外部类等,则会减慢画布的速度) 由于ondraw是canvas的一个继承方法,如果使用多个实例,它不应该有太多的输入。它背后的所有编码都会使它变慢在字符串中的每个字

对整个字符串调用一次drawText与对字符串中的每个字符(或单词)调用drawText之间是否存在显著差异?

对字符串中的每个字符调用drawText会导致不同设备和屏幕大小的不对中

如果您编写代码来解决这个问题,我会假设在那时您将跟踪更多的变量,并调用外部类和方法,这将降低画布的ondraw速度。(如果画布必须在绘制中进行计算或调用外部类等,则会减慢画布的速度)


由于ondraw是canvas的一个继承方法,如果使用多个实例,它不应该有太多的输入。它背后的所有编码都会使它变慢

在字符串中的每个字符上调用drawtext可能会导致不同设备和屏幕尺寸的不对中

如果您编写代码来解决这个问题,我会假设在那时您将跟踪更多的变量,并调用外部类和方法,这将降低画布的ondraw速度。(如果画布必须在绘制中进行计算或调用外部类等,则会减慢画布的速度)


由于ondraw是canvas的一个继承方法,如果使用多个实例,它不应该有太多的输入。它背后的所有编码都会减慢它的速度

为了好玩,我为此做了一个测试。我曾假设,由于从java到本机代码的上下文切换数量减少,完整的字符串绘制会更快。结果很有趣

测试如下。我创建了一个简单的自定义视图,它扩展了视图并实现了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();
}
我还做了仿真器,它的bychar结果是完整字符串结果的10倍

结果有些出人意料。显然,摩托罗拉droid有一个非常快速的本机文本绘制程序和同样慢的java到本机thunks

像往常一样,仔细检查代码,我可能做了一些使测试有偏差的事情


我的建议是,在可能的情况下,你应该画完整的线。正如他们所说,你的里程数可能会有所不同

为了好玩,我为此做了一个测试。我曾假设,由于从java到本机代码的上下文切换数量减少,完整的字符串绘制会更快。结果很有趣

测试如下。我创建了一个简单的自定义视图,它扩展了视图并实现了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();
}
我还做了仿真器,它的bychar结果是完整字符串结果的10倍

结果有些出人意料。显然,摩托罗拉droid有一个非常快速的本机文本绘制程序和同样慢的java到本机thunks

像往常一样,仔细检查代码,我可能做了一些使测试有偏差的事情


我的建议是,在可能的情况下,你应该画完整的线。正如他们所说,你的里程数可能会有所不同

这将取决于浏览器。为什么不试试看呢?首先,我说的是Java(比如Android)。第二,我怎样才能“看到”?在一个循环中多次尝试每一个,以及它需要多长时间。哎呀,你是这样的,我误读了标签!这将取决于浏览器。为什么不试试看呢?首先,我说的是Java(比如Android)。第二,我怎样才能“看到”?在一个循环中多次尝试每一个,以及它需要多长时间。哎呀,你是这样的,我误读了标签!