Wie mache ich meine animation glatter Android
Habe ich eine app, die hat einen ball, läuft über den Bildschirm. Wenn der ball auf halbem Weg der Antrag nimmt einige audio, berechnet die FFT und hat einige zusätzliche Analyse.
Diese erfolgt durch Asynctask, jedoch ist die animation noch kurz stottert.
Hat jemand irgendwelche Vorschläge auf, wie man es sanfter verlaufen?
Dank
folgenden code:
import com.ben.applicationLayer.GameView;
import dataObjectLayer.Sprite;
import dataObjectLayer.MusicalNote;
import android.media.AudioRecord;
import android.media.MediaRecorder.AudioSource;
import android.media.AudioFormat;
import android.os.AsyncTask;
public class recorderThread extends AsyncTask<Sprite, Void, Integer> {
short[] audioData;
int bufferSize;
Sprite ballComp;
@Override
protected Integer doInBackground(Sprite... ball) {
MusicalNote note = ball[0].expectedNote;
ballComp = ball[0];
boolean recorded = false;
double frequency;
int sampleRate = 8192;
AudioRecord recorder = instatiateRecorder(sampleRate);
double[] magnitude = new double[1024];
double[] audioDataDoubles = new double[2048];
while (!recorded) { //loop until recording is running
if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)
//check to see if the recorder has initialized yet.
{
if (recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)
recorder.startRecording();
//check to see if the Recorder has stopped or is not recording, and make it record.
else {
double max_index;
recorder.read(audioData,0,bufferSize);
//read the PCM audio data into the audioData array
computeFFT(audioDataDoubles, magnitude);
max_index = getLargestPeakIndex(magnitude);
frequency = getFrequencyFromIndex(max_index, sampleRate);
//checks if correct frequency, assigns number
int correctNo = correctNumber(frequency, note);
checkIfMultipleNotes(correctNo, max_index, frequency, sampleRate, magnitude, note);
if (audioDataIsNotEmpty())
recorded = true;
if (correctNo!=1)
return correctNo;
}
}
else
{
recorded = false;
recorder = instatiateRecorder(sampleRate);
}
}
if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING)
{
killRecorder(recorder);
}
return 1;
}
private void killRecorder(AudioRecord recorder) {
recorder.stop(); //stop the recorder before ending the thread
recorder.release(); //release the recorders resources
recorder=null; //set the recorder to be garbage collected
}
@Override
protected void onPostExecute(Integer result) {
(result == 2)
GameView.score++;
}
private AudioRecord instatiateRecorder(int sampleRate) {
bufferSize= AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT)*2;
//get the buffer size to use with this audio record
AudioRecord recorder = new AudioRecord (AudioSource.MIC,sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); //instantiate the AudioRecorder
audioData = new short [bufferSize]; //short array that pcm data is put into.
return recorder;
}
}
- Zeigen Sie uns den code um den Aufruf dieser AsyncTask, denn das problem ist nicht hier. AsyncTask macht seinen job auf einem anderen thread, so sollte es keine Auswirkungen auf die Animation (in Konzept, aber vielleicht, wenn das ist extrem). Trotzdem bitte zeigen Sie uns die animation code und den Ort, wo Sie dies nennen AsyncTask
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einem Asynctask ist entlang der Linien von, was Sie tun möchten. Allerdings würde ich vorschlagen, mit einem thread-pool. Sie können Ihre animation als eine Aufgabe, fügen Sie Ihre audio-Aufnahme als eine Aufgabe, die FFT als eine weitere Aufgabe, und Ihre weitere Analyse als eine Aufgabe.
Dem kurzen Stottern ist wahrscheinlich das Ergebnis der Zuweisung von Ressourcen für die Aufnahme in den animation thread. Mit einem pool bedeutet, dass Sie nicht haben, um pause beim erstellen des thread führen Sie Ihre audio-Aufgaben. Offensichtlich ist etwas code wäre praktisch, um vollständig zu verstehen, Ihr problem.
Werfen Sie einen Blick auf:
ScheduledThreadPoolExecutor
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html
oder
ThreadPoolExecutor
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
Ein sehr einfaches Beispiel, was Sie vielleicht tun möchten:
In Ihrer Aktivität können Sie definieren, dieses zu starten, die Aufgaben
Ball.java
Recording.java
Als Mohammed sagt, ist es schwer zu erraten, was das problem sein könnte, ohne dass der code. Mit dem im Verstand...
Es klingt wie Sie Ihre
AsyncTask
blockiert andere threads ausgeführt werden. Stellen Sie sicher, dass Sie einige Anrufe zuThread.sleep()
im es zu geben dem Planer die chance, wechseln Sie wieder in den UI-thread (Thread.yield()
ist auch eine option, aber bewusst sein, es gibt einige Fallstricke mit einer Ausbeute).yield
wird am besten vermieden, wenn Sie sich nicht sicher, was Sie tun. Ohne zu wissen, wie lange jeder dieser Aufrufe dauert, ich werde zu erraten, aber ich würde sagen, dass ein guter Kandidat für die Position der Anrufe zusleep
wäre am Ende deiner while-Schleife. Wenn diecomputeFFT()
Funktion ist sehr langsam (es kann auch 'schnell', aber wenn der Speicher dient FFTs immer noch mit sehr viel Arbeit) vielleicht möchten Sie sich bei der Unterbringung einige Anrufe zusleep()
innerhalb das auch.ohne code wird es schwer sein, zu erraten, mit optimieren kann, aber ich werde Ihnen sagen, was ich mit mehr als 1 million Operationen im laden ..
• Wenn Sie problem haben mit Leistung versuchen :
1-prüfen Sie Ihre Daten-Typ von Variablen und niedriger eingestellt, wenn Sie sicher sind variable nicht mehr benötigt byte, d.h. für die Größe, die Sie short statt int.
2-überprüfen Sie Ihren code und versuchen Sie, alle Ergebnisse können gespeichert für nächsten Start, und rufen Sie Sie das nächste mal, anstatt Sie zu berechnen wieder.
• Aber wenn Ihr problem, dass die animation zu langsam ist und Sie haben kein problem mit dem Speicher, so versuchen Sie, reduzieren die Zeit der animation oder Zunahme Einheiten von Bewegungen.
durch die Art und Weise wie setzen Sie die animation? frame-by-frame-animation oder in der layout-animation oder anzeigen animation ?