簡體   English   中英

為什么這個Android代碼這么慢?

[英]Why is this Android code so slow?

我有一個等高線圖呈現是超快的程序。 它基本上在OnPaint事件中呈現為表單,並且更新非常快...基本上與移動鼠標一樣快。 我對此非常滿意。 它基於本文:

http://paulbourke.net/papers/conrec/

但是,我將其移植到Android / Java上,並針對非常快的平板電腦(Nexus 9)進行了調試,而且速度非常慢,以至於我覺得自己必須使用錯誤的方法。 基本上我:

1)以編程方式創建一個視圖,2)實現onDraw方法以調用我的cContourPlot類Draw方法,其中3)遍歷2D數據數組,與1D“ bins”數組進行比較,並進行數千次調用我在下面編寫的“ DrawPolygonRegion”函數。

這要花很長的時間,比.NET慢大約100倍,以至於我想知道自己做錯了什么。 具體問題:

a)速度可調以下的功能嗎? 有沒有比使用路徑更快的繪制多邊形的方法? (.NET中有一個DrawPolygon函數,必須為Android端口添加一些新功能)b)我是否需要做一些事情來“分批”渲染命令? 如(想象中的:)Canvas.SuspendUpdates,Canvas.ResumeUpdates? c)是否需要激活雙緩沖或其他功能? 我的快速研究表明,這是在Android中自動完成的,但不確定。 (我必須在.NET中激活它,但不確定是否必須在這里激活)

非常感謝您的任何見解/幫助。

void DrawPolygonRegion(Canvas c, int color, double ... p)
{
    int length = p.length;

    if (length >= 6)
    {
        paint.setColor(color);
        paint.setStyle(Style.FILL);
        Path path = new Path();
        path.moveTo((float) p[0], (float) p[1]); // used for first point
        path.lineTo((float) p[2], (float) p[3]);
        path.lineTo((float) p[4], (float) p[5]);

        int idx = 6;

        for (int n=6; n<length; n+=2)
        {
            path.lineTo((float) p[n], (float) p[n+1]);
        }

        c.drawPath(path, paint);
    }
}

叫了幾千遍。 哦,是的,您遇到了一些問題。

1)分配一個新的路徑。 分配在Android上迅速增加。 盡量避免它們。 最好重用對象,尤其是在onDraw之類的函數中。

2)您真的不應該一直在創建整個路徑-最好保存並在附加模式下重用它們。

3)從雙精度浮點數到浮點數的轉換並非免費。 躲開它

4)您是直接在畫布上執行此操作嗎? 別。 在其自己的線程中對位圖畫布進行處理,然后將結果塗抹到屏幕畫布上。

我真的懷疑,即使是在具有更好處理器和RAM的PC上的.NET中,該代碼能否快速運行。 我認為您的屁股被硬件加速保存在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM