[英]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.