[英]Animation is choppy and isn't updated as often as it should
我正在嘗試完成折線收縮的簡單動畫。 我正在訪問加速度計X值,將其添加到數組/點列表,然后更新所有這些點的x坐標。 這是一張圖:
所以讓我們假設我的SCREEN_WIDTH為800像素。
步驟1:我添加新點A =(0,9.43634),沒有繪制任何內容,因為我需要至少2個點
points[(0, 9.43634)];
第2步:我添加另一個點B =(0,7.23134)。 我重新計算新的X值,然后使用這些點繪制折線:
points[(0, 9.43634), (800, 7.23134)];
第3步:我添加另一個點C =(0,8.251251)。 我重新計算X值,然后使用這些點繪制折線:
points[(0, 9.43634), (400, 7.23134), (800, 8.251251)];
第4步: ......
我的問題是動畫不流暢。 當我將要添加的最大點數設置為~100時,它似乎跳過幀。 看起來如果在添加單個點之后動畫沒有刷新,而是在添加了幾個之后。
我已經嘗試使用數組而不是ArrayList來避免垃圾收集,我試過限制動畫速度等但沒有任何作用。
是計算新的x值並使用100+點減慢折線? 我也試過在相鄰點之間畫線,但性能是一樣的。
我正在測試三星Galaxy S2,如果它很重要的話。
太糟糕了我不能發布這里看起來像什么的動畫,但這里是所有necesarry代碼:
來自加速計測試項目的Accelerometer_Test.java:
AndroidManifest.xml中:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gurniak.accelerometer.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:allowBackup="true" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
來自accelerometer-test-android項目的MainActivity.java:
package com.gurniak.accelerometer.test;
import android.os.Bundle;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import android.util.Log;
public class MainActivity extends AndroidApplication {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
cfg.useGL20 = true;
cfg.useAccelerometer = true;
cfg.useCompass = false;
cfg.useWakelock = true;
initialize(new Accelerometer_Test(), cfg);
}
}
我的問題是:如何加快動畫速度並使其更流暢? 我希望它快速更新(每個~20 [ms]將是完美的)並且在每個點添加到pointsX
。 我在這里做了一件非常愚蠢的事嗎? 我在logcat GC_CONCURRENT FREED
反復看到,即使在達到MAX_NUM_POINTS
限制后沒有添加新點。 最后,如果重新計算新的x值實際上對性能有害,那么是否有任何算法可以更快地重新計算它?
使用分析器或儀器代碼來查看時間的來源。 Android DDMS工具非常適合跟蹤分配。
渲染中的打嗝通常是由垃圾收集引起的,這是由於在渲染循環中分配“太多”(即大多數東西)引起的,所以這就是我要開始的地方。 但是,在嘗試優化代碼時,您應該找到並遵循實際的硬數據。 如果它與分配相關,請嘗試在create
預先分配所有“point” Vector2
對象。
我解決了我的問題。 我做錯了三件事:
1)我正在繪畫,然后更新,這是我應該做的相反的順序。
2)我在render()
方法中分配新對象繪制垃圾收集器瘋狂:
points.add(new Vector2(0, newValue));
3)我使用整數步而不是浮動步,這就是為什么動畫不流暢的原因:
int step = (int) Math.ceil(SCREEN_WIDTH / ((points.size - 1) * 1.0));
嘗試使用至少兩個或三個線程的線程池,這樣你就不會占用你的UI線程,工作可以卸載到其他核心。 然后,可以使用UI線程上的handler
來接收具有X,Y和時間戳的消息,以便UI可以保持最新。
類似於ThreadPool
類示例的設置可以很好地解決這個問題。 它與線程池一起還顯示了如何重用相同的變量來防止不必要的內存分配和垃圾回收。 那些可能是昂貴的操作,並且每次GC運行時,在您的應用程序甚至有機會開始更新之前,它將花費+ 20ms。
谷歌I / O還有很多關於優化應用程序的討論,值得一試。
Google I / O 2009 - 為Android版 Google I / O 2011 編寫實時游戲 - 加速Android渲染
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.