我在我的android程序中有一個碰撞檢測方法,用於檢測兩個球碰撞並計算其新速度。每個球存儲在一個陣列Ball[] ballArray
。爲了處理碰撞,我遍歷每個球,取其中心座標並計算周圍區域。如果任何其他球的中心位於該區域內,則我檢查兩個球是否有碰撞。處理碰撞 - 陣列查找昂貴
我的方法基本如下
public void handleCollisions(){
int size = ballArray.length;
for(int i = 0; i < size; i++){
Ball ball = ballArray[i];
int centerX = ball.centerX;
int centerY = ball.centerY;
int radius = ball.radius;
//calculate box around ball
int lowXLimit = (centerX - radius - largestPossibleRadius);
int highXLimit = (centerX + radius + largestPossibleRadius);
int lowYLimit = (centerY- radius - largestPossibleRadius);
int highYLimit = (centerY+ radius + largestPossibleRadius);
for(int j = j+1; j < size; j++){
Ball ball2 = ballArray[j];
int centerX2 = ball.centerX;
int centerY2 = ball.centerY;
int radius2 = ball.radius;
//if ball2 is inside the possible collision region around ball1
if (centerX2 > lowXLimit && centerX2 < highXLimit && centerY2 > lowYLimit && centerY2 < highYLimit) {
//do calculations to determine new velocities
}
}
我是從我的代碼獲得性能相當差,跑一traceview。令我驚訝的是,這種方法中只有大約5%的執行時間用於衝突解決計算(相當多的浮點除法,乘法)。事實上,在這種方法中,大約60-70%的時間只是從球陣列中獲取球(線Ball ball = ballArray[i]
和Ball ball2 = ballArray[j]
)。
我試過使用ArrayList
,但那更糟。有什麼我可以做的,以加快這個代碼?也許另一個數據結構?對我來說,這似乎是一段很長的時間。我應該嘗試減少Ball
中的成員變量的數量嗎?
我想知道在循環外部聲明ball和ball2是否更有效率,並且只在每次迭代時重新影響 – njzk2 2012-03-12 17:31:45
,我認爲鏈表可能會更有效地循環遍歷元素 – njzk2 2012-03-12 17:37:34
'ball'和'ball2'只是對現有對象的引用 - 不是一個緩慢的操作('new')。在循環外部聲明它們並更新循環內部引用的區別應該接近於零。但嘗試一下 - 這是一個有趣的問題。 – zapl 2012-03-12 17:39:28