
Kardroid
Stamm-User
- 154
Hallo,
ich sitze jetzt schon ein paar Stunden an meinem Problem und habe keine Idee mehr wie ich noch googlen soll.
Ich habe eine Bewegungserkennung, die die Bewegung von einer vorher definierten Farbe anhand von OpenGL in einer SurfaceView bestimmt.
Der speicherlastige Code sieht in etwa so aus:
D.h.: Ich allokiere zweimal wegen den Bitmaps "viel" Speicher.
Aber an dieser Stelle bekomme ich gar kein OutOfMemory-Problem.
Sondern, wenn ich die Activity wechsel, gibt es folgenden OutOfMemoryError:
Ich starte die weitere Activity über folgenden Code:
Über das Flag und den finish()-Befehl versuche ich die alte Activity aus dem Speicher zu löschen.
Jetzt sind also meine Fragen:
1. Frisst meine App einfach per Konzept zu viel Speicher?
2. Kann ich die Analyse jedes Frames meiner Kamera schlanker machen?
3. Oder wie kann ich den Speicher vor dem Wechsel der Activities aufräumen?
ich sitze jetzt schon ein paar Stunden an meinem Problem und habe keine Idee mehr wie ich noch googlen soll.
Ich habe eine Bewegungserkennung, die die Bewegung von einer vorher definierten Farbe anhand von OpenGL in einer SurfaceView bestimmt.
Der speicherlastige Code sieht in etwa so aus:
Code:
@Override
public void onPreviewFrame(byte[] arg0, Camera arg1) {
previewSize = arg1.getParameters().getPreviewSize();
mWidth = previewSize.width;
mHeight = previewSize.height;
//Hier wird aus dem aktuellen CameraFrame ein int-Array, damit ich es in ein Bitmap konvertieren kann.
int[] imagePixels = convert(arg0, previewSize.width, previewSize.height);
//Hier erstelle ich ein Bitmap
bitmapImage = Bitmap.createBitmap(imagePixels, previewSize.width, previewSize.height, Bitmap.Config.ARGB_8888);
//Hier wird ein GLFilter auf das Bild gesetzt, um die Farbe zu erkennen
mGLImage.setImage(bitmapImage);
bitmapImage = mGLImage.getBitmap();
//Hier wird aus dem neuen Bild mit dem Filter wieder ein int-Array, damit ich dieses analysieren kann.
pix = new int[mWidth * mHeight];
bitmapImage.getPixels(pix, 0, mWidth, 0, 0, mWidth, mHeight);
//Hiermit versuche ich das Objekt über den GC zu löschen
bitmapImage = null;
//Hier wird jeder Pixel des Bildes analyisiert, ob er schwarz ist. Die Koordinaten werden gespeichert um die weitere Erkennung durchzuführen.
//Only the clear part in the middle will be analyzed.
double top = PlayOverlayView.PLAY_AREA_TOP;
double bot = PlayOverlayView.PLAY_AREA_BOTTOM;
double left = PlayOverlayView.PLAY_AREA_LEFT;
double right = PlayOverlayView.PLAY_AREA_RIGHT;
int rowLineSum = 0, detectedRowLinesCount = 0;
for(int y = (int)(top*mHeight); y <= (int)(bot*mHeight); ++y)
{
int maxPixelsInRow = 0;
for(int x = (int)(left*mWidth); x <= (int)(right*mWidth); ++x)
{
if (pix != null) {
//offset locates the pixel in the data from x,y.
//4 for 4 bytes of data per pixel, w is width of one row of data.
int index = y * mWidth + x;
//int alpha = data[offset];
int bActual = pix[index]&0xFF;
int gActual = (pix[index]>>8)&0xFF;
int rActual = (pix[index]>>16)&0xFF;
int aActual = (pix[index]>>24)&0xFF;
if(bActual > 0 || gActual > 0 || rActual > 0)
{
xCoords.add(x);
yCoords.add(y);
maxPixelsInRow++;
}
}
}
Aber an dieser Stelle bekomme ich gar kein OutOfMemory-Problem.
Sondern, wenn ich die Activity wechsel, gibt es folgenden OutOfMemoryError:
Code:
02-24 15:42:06.819: E/AndroidRuntime(32474): Caused by: java.lang.OutOfMemoryError
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.content.res.Resources.loadDrawable(Resources.java:2988)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.view.View.<init>(View.java:3563)
02-24 15:42:06.819: E/AndroidRuntime(32474): at android.view.View.<init>(View.java:3492)
Code:
Intent intent = new Intent(myActivity, GameFinishActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
this.finish();
Jetzt sind also meine Fragen:
1. Frisst meine App einfach per Konzept zu viel Speicher?
2. Kann ich die Analyse jedes Frames meiner Kamera schlanker machen?
3. Oder wie kann ich den Speicher vor dem Wechsel der Activities aufräumen?