在整个字符串上调用一次 drawText 与为字符串中的每个字符(或单词)调用 drawText 之间是否存在显着差异?
问问题
1052 次
2 回答
4
为了好玩,我为此做了一个测试。我曾假设完整的字符串绘制会更快,主要是由于从 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 结果 10x 全字符串结果可笑地扭曲了。
结果有些意外。显然,摩托罗拉 droid 具有非常快的本机文本绘制例程,而 Java 对本机 thunk 的速度同样慢。
和往常一样,仔细检查代码,我可能做了一些扭曲测试的事情。
我的收获是你应该尽可能地画出完整的字符串。正如他们所说,您的里程可能会有所不同。
于 2011-04-16T02:23:11.197 回答
1
对字符串中的每个字符调用 drawtext 可能会导致不同设备和屏幕尺寸的不对齐。
如果您编写代码来克服该问题,我会假设那时您将跟踪更多变量并调用外部类和方法,这会减慢画布的 ondraw。(如果画布必须在绘制过程中进行计算或调用外部类等,它会减慢画布的速度)
由于 ondraw 是 canvas 的继承方法,因此如果您使用多个实例,它不应该有太大的影响。它背后的所有编码都会减慢它的速度
于 2011-04-16T02:16:44.793 回答