2011-06-15 62 views
6

所以我在寫一種粒子模擬的,像「落砂遊戲」,如果你知道那是什麼,我已經那種打了一個路障現在。我這樣做的方式是我有一個粒子對象,基本上現在有一個位置(int x,int y),就是這樣。我繪製/移動它們的方式是使用線程和android面板的onDraw事件。每次onDraw被調用時,我都會遍歷所有的粒子,將它們向下移動一個像素,除非它們碰到底部然後繪製它們,這樣非常平滑,直到我得到大約200個粒子,然後fps顯着下降。我知道這是計算重的方式,我這樣做,沒有任何關於它的爭論,但是有什麼辦法可以做到這一點,以允許更多的粒子被繪製,並且延遲更少?繪製粒子(的Java/Android設備)的成千上萬的更有效的方法

在此先感謝。

回答

0

如果模糊圖像了一下,然後你可以只移動一半particule的時間,也許只是一個第四和全部打印出來..這將削減計算和用戶不會看到它,越來越覺得所有粒子移動。

但是你選擇什麼都,我想你應該把強勢漲停,並不是所有的用戶都有強大的Android設備。

問候, 斯特凡

2

我想你正在使用這種單獨的像素繪圖功能?這確實很慢。

我看到了一些改進方法。首先是將像素放入內存位圖,然後同時繪製整個位圖。其次,由於粒子總是向下一個像素,所以可以滾動部分位圖而不是重新繪製所有內容。如果Android沒有滾動,則只需將位圖向下畫一個像素,然後爲滾動上方的粒子開始一個新的位圖。你必須修復底部的顆粒,但是那些顆粒更少。

+0

它是android的drawPoint(x,y,Paint)函數。 – Hamel 2011-06-15 17:45:25

0

我認爲,如果粒子接近對方,你可以創建代表3級或更多的顆粒物。

當在屏幕上顯示幾個顆粒,套粒也許得到注意。

2

你可能想看看OpenGL ES硬件加速和renderscript。它不會給你一個更有效的代碼明智的解決方案(請參閱其他答案)。然而,它確實爲您開啓了更多的處理能力。你甚至可以在GPU上運行整個模擬(可能不知道你的實現細節)。

編輯
另外,如果你仍然決定做處理在Java中,你應該看看Method Profiling in DDMS。這將幫助您查看性能瓶頸的位置。

+0

+1:真的,這裏唯一合理的答案。 OpenGL被設計爲完成這種處理。 – Rekin 2011-06-15 18:26:08

2

我從來沒有做過這樣的事情,但我已經做了一些複雜的細胞自動機。對不起,如果這太模糊。

基本這裏的想法是標記所有的粒子應該「繼續下跌」或「不動」和排除他們從複雜的處理(用特殊短/快處理器的「下落」名單 - 你需要做的就是每個像素點)。

  • 非運動粒子的加速度 - 靜態粒子(我稱之爲S粒子)是它們不移動。標記爲所有非移動區域(例如用戶可能製造的重力免疫「牆」或「碗」),如果它們穩定,則標記它上面的粒子,例如對於液體,如果其下面有S粒子,則標記爲,對於它自己的雙方,它不會移動對於沙子形成的東西,如果它在它下面的三個點中都有一個S,它會堆成一堆,你會得到很好的45-我確信你可以改變它以使某些東西形成更陡峭或更不陡峭的樁。做S映射自下而上
  • 加速度爲下面沒有顆粒的顆粒正在下降-F顆粒。在它們下面的F粒子的粒子也是F粒子,並且將它們自下而上標記爲
  • 粒子未標記的F或S a他們可能會開始下降,停止下降或滾動,使用已經擁有的慢速處理器來處理它們,應該不會有太多。

最後你會得到許多許多快速粒子。那些在一堆/湖泊和下雨的人們。剩餘粒子是位於斜坡邊緣,湖泊頂部或其他複雜位置的粒子。不應該有像快速粒子一樣多的粒子。

用色標記各種顆粒,複雜顆粒呈鮮紅色。找到它仍然很慢的情況,並參見其他類型的快速處理器您應該做什麼。例如,您可能會發現,製作大量的沙子會在斜坡上形成大量紅色區域,您可能需要投資加快沿樁斜坡的「滾動區域」。

希望它是有道理的。不要忘了一旦你想出了一些東西,就回來編輯!

+0

這是非常有幫助的,我可能會這樣做 – Hamel 2011-06-15 20:04:45

相關問題