2012-01-25 5 views
0

У меня есть компас, который является подклассом для класса представления, а моя стрелка компаса - растровое изображение. Каждый раз, когда датчик меняет компас, он недействителен и перерисовывается на полотне, также изменяется вращение стрелки компаса. Проблема, с которой я сталкиваюсь, заключается в том, что когда вы видите, что стрелка компаса вращается, она немного отстает, в основном плохая fps. Я предполагаю, что это отстает, потому что я постоянно перерисовываю растровое изображение вместо того, чтобы рисовать, и задаюсь вопросом, исчезнет ли бедный fps, если бы я использовал поверхностное представление вместо того, чтобы рисовать на холсте. Будем очень благодарны за любые советы о том, как решить эту проблему. Изображение 300x300 px.Android-графика

Датчик в основной деятельности:

@Override 
public void onSensorChanged(SensorEvent event) { 
    float[] v = event.values; 
    north = v[0]; 
    comp.setNorth(-v[0]); 
} 

Компас вид:

public void setNorth(float n) { 
    north_changed = true; 
    north = n; 
    invalidate(); 
} 

растровый рисунок:

private void drawCompass(Canvas canvas) { 
    canvas.save(); 
    if (north_changed == true) { 
     canvas.rotate(north); 
    } 
    float maxwidth = (float) (canvasBitmap.getWidth() * Math.sqrt(2)); 
    float maxheight = (float) (canvasBitmap.getHeight() * Math.sqrt(2)); 
    float ratio = Math.min(w/maxwidth, h/maxheight); 
    int width = (int) (canvasBitmap.getWidth() * ratio); 
    int height = (int) (canvasBitmap.getHeight() * ratio); 

    canvas.drawBitmap(compTexture, new Rect(0, 0, compTexture.getWidth(), 
      compTexture.getHeight()), new Rect(-width/2, -height/2, 
      width/2, height/2), facePaint); 
    canvas.restore(); 

} 
+0

Можете ли вы опубликовать, как вы рисуете растровое изображение? Вы не должны испытывать проблемы с производительностью, если вы просто рисуете повернутое изображение, особенно то, что составляет всего 300x300 пикселей. Использование SurfaceView НЕ приведет к исчезновению проблем с производительностью. – Samuel

+0

Добавлен код. – user1163392

+0

Какой тариф вы используете при регистрации с помощью SensorManager? Попробуйте SENSOR_DELAY_GAME или SENSOR_DELAY_FASTEST. Это может быть место, из-за которого происходит отставание. – Samuel

ответ

0

Использование SurfaceView костюмы эта задача намного лучше, он может сделать много больше кадров в секунду вы также можете использовать GLSurfaceView, чтобы убедиться, что все который отображается на графическом процессоре.

+0

SurfaceView не исправил задержку, как при использовании простого представления. – user1163392