0

ポリライン縮小の簡単なアニメーションを完成させようとしています。加速度計の X 値にアクセスし、それをポイントの配列/リストに追加してから、それらすべてのポイントの x 座標を更新しています。ここに図があります:

ここに画像の説明を入力

たとえば、私の SCREEN_WIDTH が 800 px だとしましょう。

ステップ 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 以上のポイントを使用してポリラインを描画すると、速度が低下しますか? 隣接するポイント間に線を引いてみましたが、パフォーマンスは同じでした。

重要な場合は、Samsung Galaxy S2 でテストしています。

残念ながら、ここにどのように見えるかのアニメーションを投稿することはできませんが、ここにすべての必要なコードがあります:

Accelerometer-test プロジェクトの 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 [ミリ秒]が完璧です)そしてすべてのポイントがに追加された後pointsX. 私はここで非常に愚かなことをしていますか?GC_CONCURRENT FREED制限に達した後に新しいポイントが追加されていないにもかかわらず、logcat に繰り返し表示されMAX_NUM_POINTSます。最後に、新しい x 値を再計算することが実際にパフォーマンスに悪い場合、それをより速く再計算するアルゴリズムはありますか?

4

3 に答える 3

1

問題を解決しました。私が間違っていたことが3つあります。

1) 描画してから更新していましたが、これは私がすべきことの逆の順序です。

render()2)私は、ガベージコレクターを狂わせるメソッド描画内で新しいオブジェクトを割り当てていました:

points.add(new Vector2(0, newValue));

3) float ステップの代わりに整数ステップを使用していたため、アニメーションが滑らかではありませんでした:

int step = (int) Math.ceil(SCREEN_WIDTH / ((points.size - 1) * 1.0));
于 2013-09-29T15:55:24.813 に答える
0

少なくとも 2 つまたは 3 つのスレッドのスレッド プールを使用してみてください。そうすれば、UI スレッドを拘束せず、作業を他のコアにオフロードできます。次にhandler、UI スレッドの を使用して、X、Y、およびタイムスタンプを持つメッセージを受信できるため、UI を最新の状態に保つことができます。

ThreadPoolクラスの例が示すようなセットアップは、これに適しています。スレッド プールとともに、同じ変数を再利用して不要なメモリ割り当てとガベージ コレクションを防ぐ方法も示します。これらはコストのかかる操作になる可能性があり、GC が実行されるたびに、アプリが更新を開始する前に +20 ミリ秒かかります。

複数スレッド用のマネージャーの作成

アプリの最適化に関する Google I/O の講演も多数あり、チェックする価値があります。

Google I/O 2009 - Android 向けリアルタイム ゲームの作成 Google I/O 2011 - Android レンダリングの高速化

于 2013-09-23T08:56:21.697 に答える