问题描述
我最近学习了一些关于 Canvas API 的知识,这里有一个示例项目:CanvasSamples
我的问题是如何在频谱图示例中提高 CircleRender 和 CircleBarFftRenderer 的性能?
CircleRender 的渲染代码:
override fun onRender(canvas: Canvas,data: ByteArray,rect: Rect) {
if (mCycleColor) {
cycleColor()
}
val rwh = rect.width() / 2
val rhh = rect.height() / 2
mPoints?.let {
for (i in 0 until data.size - 1) {
points[0] = i.toFloat() / (data.size - 1)
points[1] = (rhh + (data[i] + 128).toByte() * (rhh) / 128).toFloat()
toPolar(points,rwh,rhh,0)
// x1
it[i * 4] = points[2]
// y1
it[i * 4 + 1] = points[3]
points[4] = (i + 1).toFloat() / (data.size - 1)
points[5] = (rhh + (data[i + 1] + 128).toByte() * (rhh) / 128).toFloat()
toPolar(points,4)
// x2
it[i * 4 + 2] = points[6]
// y2
it[i * 4 + 3] = points[7]
}
canvas.drawLines(it,mPaint)
// Controls the pulsing rate
modulation += 0.04f
}
}
private fun toPolar(cartesian: FloatArray,rwh: Int,rhh: Int,start: Int): FloatArray {
val cX = rwh.todouble()
val cY = rhh.todouble()
val angle = cartesian[start] * 2 * Math.PI
val radius =
(rwh * (1 - aggressive) + aggressive * cartesian[start + 1] / 2) * (1.2 + sin(
modulation.todouble()
)) / 2.2
cartesian[start + 2] = (cX + radius * sin(angle)).toFloat()
cartesian[start + 3] = (cY + radius * cos(angle)).toFloat()
return cartesian
}
我对 onRender
方法进行了两次优化(Android Studio Profiler 测量的统计数据):
- 避免在绘制调用中创建浮点数组。这改进了:平均从 14.39 毫秒到 12.12 毫秒,最大从 24.08 毫秒到 18.85 毫秒。
- 缓存矩形宽度和宽度以进行计算。这改进了:平均从 12.12ms 到 8.06ms,最大从 18.85ms 到 10.85ms(基于优化 1)。
对 onRender
方法有进一步优化的想法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)