Есть ли значительный выигрыш в производительности GC при повторном использовании массивов с плавающей запятой в Java? - PullRequest
0 голосов
/ 03 июля 2019

Я занимаюсь разработкой игры для Android на Java, и сборщик мусора регулярно включается и вызывает скачок задержки.

Посмотрев на распределение объектов, большая часть того, что перерабатывается, - это float []. Я создаю новый float [] каждый кадр для нескольких объектов.

Имеет ли смысл повторно использовать float [] или влияние на производительность незначительно (особенно по сравнению с объектами).

public float[] rectangleToVerts(float x, float y, float width, float height) 
    float[] verts = new float[8];

    verts[0] = x - width / 2;
    verts[1] = y + height / 2;
    verts[2] = x + width / 2;
    verts[3] = y + height / 2;
    verts[4] = x + width / 2;
    verts[5] = y - height / 2;
    verts[6] = x - width / 2;
    verts[7] = y - height / 2;

    return verts;
}

public void tick(){
    shape.setVertices(rectangleToVerts(x, y, 5, 5);
}

VERSUS

public float[] rectangleToVerts(float x, float y, float width, float 
    height, float[] verts) 

    verts[0] = x - width / 2;
    verts[1] = y + height / 2;
    verts[2] = x + width / 2;
    verts[3] = y + height / 2;
    verts[4] = x + width / 2;
    verts[5] = y - height / 2;
    verts[6] = x - width / 2;
    verts[7] = y - height / 2;

    return verts;
}

private float[8] verts;

public void tick(){
    shape.setVertices(rectangleToVerts(x, y, 5, 5, verts);
}

1 Ответ

0 голосов
/ 03 июля 2019

Трудно сказать, насколько более эффективным будет ваш код во втором примере, но он, безусловно, более эффективен.Каждый массив сам является объектом, и чем меньше новых ссылок вы создаете, тем реже запускается сборщик мусора.Поскольку вы сказали, что большая часть того, что перерабатывается, - это типы float [], это кажется вероятным кандидатом.Если вы работаете в Android Studio 3.0 или более поздней версии, вы можете использовать Memory Profiler , чтобы увидеть, как память выделяется вашей программой, и определить, действительно ли это является причиной вашего замедления.

В качестве примечания вы также дважды рассчитываете значения каждой вершины.(Например, для verts [0] и verts [6] задано значение x - width / 2.) Быстрая и простая оптимизация может выглядеть следующим образом:

public float[] rectangleToVerts(float x, float y, float width, float height, float[] verts) 
{
    verts[0] = x - width / 2;
    verts[6] = verts[0];        

    verts[1] = y + height / 2;
    verts[3] = verts[1];

    verts[2] = x + width / 2;
    verts[4] = verts[2];

    verts[5] = y - height / 2;
    verts[7] = verts[5];

    return verts;
}

Надеюсь, это поможет!

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