天天看點

android播放視訊過程cpu占用高,Android App高CPU使用率和電池消耗

我已經從事Android遊戲已有一段時間了。我已經實作了基本遊戲,是以現在我要回去嘗試優化。似乎電池消耗和CPU使用率對于我正在執行的操作來說太高了。我實際上隻有我的主線程,然後所有繪圖和更新都是在單獨的線程上完成的。

以下是進行更新和所有繪圖的實際遊戲線程的代碼。所有實際的代碼都已删除,剩下的就是我正在嘗試找出異常的CPU使用率/電池消耗的實驗。

是以,基本上,如果我僅使用無限的while循環來啟動以下線程,則該應用在使用30分鐘後将消耗約315mAh或約9%的手機電池電量。如果我在run方法中不使用代碼啟動線程,以使其在運作一次後失效,則在相同的時間内它會消耗大約70mAh或2%的手機電池電量。當線程運作并僅運作無限循環時,CPU使用率也從不運作線程的2%-3%躍升至大約14%-15%。

總而言之,似乎僅使用無限while循環運作線程,什麼也不做,在30分鐘内将電池使用量增加了7%。我不知道這是怎麼可能的,并認為我一定會丢失一些東西。我将繼續努力解決這個問題,但是沒有更多代碼可以提取了。如果有人有任何建議或可以提供一些有關為什麼發生這種情況的見解,我将不勝感激。提前緻謝。

class InnerThread extends Thread

{

public InnerThread()

{

super();

}

public void run()

{

while(true){}

}

}

無延遲或無節奏的循環因占用CPU和電池而臭名昭著。仔細考慮您是否真的需要連續處理,或者每幀一次,每個任意時間間隔一次還是每次外部事件發生一次就足夠了。嘗試在循環中添加一個小的任意延遲,您可能會立即看到改進。

許多遊戲使用主遊戲循環。這是一個可搜尋的術語。基本上,一個無限循環執行一些計算,繪制一個幀,然後通常休眠一段時間。 (請參閱SystemClock.sleep()與Thread.sleep()。)您的主循環可以将幀号和時間戳傳遞給其餘代碼。您可以每幀計算移動對象的位置,但是可以做更複雜的事情,例如僅在一定時間間隔或幀内更新敵人的AI。如果您使用Unity之類的遊戲引擎,則主循環仍然存在,但您不必自己編寫。您隻需編寫它調用每一幀的代碼。

是以我認為這可能是問題所在。我進行了測試,它以每秒13,000幀的速度運作,這顯然太高了,無法滿足我的需求。理想的是使其以60 FPS的速度運作。香港專業教育學院試圖使用System.nanotime來保持幀率,但在那種情況下,大多數遊戲代碼都以60 FPS運作,但是保持幀率的代碼仍以13,000+ FPS運作。我可以嘗試以其他方式保持幀速率,延遲的首選方式是什麼? SystemClock.sleep?

@Envenge編輯。

非常感謝您的幫助。我有遊戲循環的經驗,并實作了一個遊戲,我隻是删除了實際的代碼以嘗試使循環中的代碼最少,以確定我沒有記憶體洩漏或内部某處引起CPU使用率飙升的東西。和電池消耗。對我來說,多線程是一個相當新的概念,我仍在嘗試充分利用。肯定有很多東西要學習,我再次感謝您的時間和耐心來解釋似乎很明顯的事情。

我經曆并編輯了我的代碼。利用thread.sleep限制整體繪制并将代碼更新為每秒60幀。我還使用了Object.wait()和Object.notify()方法來減少不必要的線程處理。我看到了巨大的進步,感謝您的幫助,我非常感謝。我的問題絕對是我在浪費電池和CPU電源處理任何事情。

while(true)是經典的無窮循環,在Java中可能不需要。

它甚至不在哪個線程上運作都很重要,它很可能會耗盡汁液。

請參見" while(true)"循環是如此糟糕嗎?

嗨,while(true)循環是無限的,是以它隻需做少量工作即可保持線程運作以測試線程的電池消耗。我想最大程度地減少線程正在執行的工作量,以檢視我能用多低的電量消耗電池并仍然使線程運作。

@Envenge您并沒有減少工作量。旋轉while(true)與執行一些有用的計算一樣多。

@Envenge是另一個答案,除非添加一些緩動...否則它将以最大疊代速度運作并嚴格消耗電池電量。這是可以在交流電源機器上執行的操作,但不能在移動裝置上執行。最好隻在需要時執行處理。

例如。當添加Thread.sleep(500)時,它仍然每秒疊代兩次。但這是一種解決方法。重新考慮建議的基本業務邏輯。

香港專業教育學院已經玩了一點,但還沒有找到最好的方法來做到這一點,而不會稍微影響遊戲性能。麻煩研究一下重新組織代碼,并嘗試使線程定期進入睡眠狀态。感謝您的快速回複!

@Envenge您需要确定您甚至需要在其中運作任何代碼的頻率。可能添加服務會有所幫助;這也将擁有自己的線程并繼續運作。嘗試使其成為基于事件的遊戲,或者檢視其他遊戲引擎的源代碼以及它們的處理方式。