我正在开发专有的打印机服务,并且在Android的PrinterManager创建pdf文件之后,我渲染了位图,并且必须将24 BPP图像转换为1 BPP图像以将其发送到打印机。 我注意到,与后续打印相比,第一次打印的系统时间非常长,因此我分析了代码,发现时间主要花在以下循环中:
val startWhile = System.nanoTime()
while (row < height) {
var imgByte: Byte = 0
var bit = 7
for (i in start..end step 1) {
// Not strictly exact as I assume that every color has the same 'weight' which is not the reality but after all, it depends on the usage
// For example, according to CIE709 recommandation, the test should be:
// if ((pixels[i] * 0.2125 + pixels[i] * 0.7154 + pixels[i] * 0.0721) < 128) {
if (((pixels[i] and 0xFF) + ((pixels[i] shr 8) and 0xFF) + ((pixels[i] shr 16) and 0xFF)) / 3 < 128) { // 0xAA000000 black to 0xAAFFFFFF white AA is transparency value.
imgByte = imgByte or (1 shl bit).toByte()
}
if (bit <= 0) {
bytes[b++] = imgByte
bit = 7
imgByte = 0
} else {
bit--
}
}
if (bit != 7) { // loop interrupted before end of byte
bytes[b++] = imgByte
}
row++
end += width
start += width
}
Log.d(TAG, "+++++ Conversion time 24 BPP to 1 BPP: ${(System.nanoTime() - startWhile) / 1000000L} ms")
根据日志,完成while循环的第一次执行(因此第一次完全转换为24BPP到1BPP)在大约11.000 ms内执行,随后的一次在11 ms内执行。 我怀疑某种形式的代码预编译。
为什么?