有什么想法可以提高这个自定义视图的渲染性能吗?

问题描述

我最近学习了一些关于 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 测量的统计数据):

  1. 避免在绘制调用中创建浮点数组。这改进了:平均从 14.39 毫秒到 12.12 毫秒,最大从 24.08 毫秒到 18.85 毫秒
  2. 缓存矩形宽度和宽度以进行计算。这改进了:平均从 12.12ms 到 8.06ms,最大从 18.85ms 到 10.85ms(基于优化 1)

但是经过这些优化后,onRender 仍然很慢:

Spectrogram View hw-trace

onRender 方法有进一步优化的想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)