почему logcat спамит информацией GC? - PullRequest
1 голос
/ 29 февраля 2012

Если я закомментирую этот блок, то спам GC исчезнет. Что вызывает спам? Если я закомментирую раздел "// Очистка", то спам все еще там.

public void updatePixels()
{
    // Fill the bitmap with black.
    mBitmap.eraseColor(Color.BLACK);

    // Pass bitmap to be rendered by native function.
    if(!mNativeHelper.render(mBitmap)) return;


    // If FroyVisuals has text to display, then use a canvas and paint brush to display it.
    String text = mActivity.mTextDisplay;
    if(text != null)
    {
        // Give the bitmap a canvas so we can draw on it.
        mCanvas.setBitmap(mBitmap);

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setTextSize(10);
        paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(1);
        paint.setColor(Color.WHITE);
        paint.setTextAlign(Paint.Align.CENTER);

        float canvasWidth = mCanvas.getWidth();
        float textWidth = paint.measureText(text);
        float startPositionX = (canvasWidth - textWidth / 2) / 2;

        mCanvas.drawText(text, startPositionX, mTextureWidth-12, paint);
        paint = null;
    }

    // Flip the texture vertically.
    Matrix flip = new Matrix();

    flip.postScale(1f, -1f);

    Bitmap temp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), flip, true);

    // Copy bitmap pixels into buffer.
    mPixelBuffer.rewind();

    temp.copyPixelsToBuffer(mPixelBuffer);

    // Cleanup
    temp.recycle();
    temp = null;
    flip = null;
}

1 Ответ

1 голос
/ 29 февраля 2012

Я не уверен, на какой раздел вы ссылаетесь под «этим блоком», поэтому я предполагаю, что вы имеете в виду весь метод. Вы создаете объекты внутри этого метода

здесь

Paint paint = new Paint();

и здесь

 Bitmap temp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), flip, true);

так что, если этот метод вызывается часто, вы увидите, что эти объекты GC довольно много. Вы должны использовать подход, который не требует создания объектов при каждом вызове. Например, вы можете создать bitmap при первом запуске метода, а затем манипулировать canvas этого растрового изображения, чтобы добиться вашего отражения.

Вы можете получить canvas в конструкторе и манипулировать в начале каждого вызова метода с помощью rotate () . Таким образом, вы можете просто создать Bitmap и Canvas при первом вызове метода.

Кроме того, всякий раз, когда вы создаете растровое изображение, оно также может выделять для этого видеопамять, что делает его еще более неэффективным, чем выглядит!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...