From 1e28cb5f3a879fc53aada4138d51f536e8e3ac21 Mon Sep 17 00:00:00 2001 From: Yaroslav Mytkalyk Date: Sun, 4 Feb 2024 13:59:57 +0100 Subject: [PATCH 1/2] Optimize loops For-each operator creates a new Iterator instance which is then garbage- collected. See https://googlesamples.github.io/android-custom-lint-rules/checks/DrawAllocation.md.html https://programmerr47.medium.com/to-index-or-iterate-7b81039e5484 --- java/com/scrat/everchanging/Background.java | 14 ++++++-- java/com/scrat/everchanging/Bat.java | 10 ++++-- java/com/scrat/everchanging/Blick.java | 10 ++++-- java/com/scrat/everchanging/ButterFlie.java | 10 ++++-- java/com/scrat/everchanging/Crystal.java | 10 ++++-- java/com/scrat/everchanging/Dandelion.java | 10 ++++-- .../everchanging/EverchangingRender.java | 12 +++++-- java/com/scrat/everchanging/Eye.java | 10 ++++-- java/com/scrat/everchanging/Fairy.java | 22 +++++++++---- java/com/scrat/everchanging/FireFlie.java | 10 ++++-- java/com/scrat/everchanging/FireWork.java | 10 ++++-- java/com/scrat/everchanging/Fly.java | 10 ++++-- java/com/scrat/everchanging/Foreground.java | 16 ++++++--- java/com/scrat/everchanging/Leave.java | 13 +++++--- java/com/scrat/everchanging/Petal.java | 13 ++++++-- java/com/scrat/everchanging/Rain.java | 17 ++++++++-- java/com/scrat/everchanging/Ripple.java | 10 ++++-- java/com/scrat/everchanging/Scene.java | 5 ++- java/com/scrat/everchanging/Snow.java | 10 ++++-- .../scrat/everchanging/TextureManager.java | 33 ++++++++++++++++--- java/com/scrat/everchanging/Valentine.java | 10 ++++-- 21 files changed, 209 insertions(+), 56 deletions(-) diff --git a/java/com/scrat/everchanging/Background.java b/java/com/scrat/everchanging/Background.java index e04dbf6..c8ef80c 100644 --- a/java/com/scrat/everchanging/Background.java +++ b/java/com/scrat/everchanging/Background.java @@ -38,7 +38,13 @@ public void createObject(int season) { int textureIndex = textureManager.getTextureIndex(textureList[0][season]); TextureManager.Texture texture = textureManager.getTexture(textureIndex); - if (objects.size()>0) for (Object object : objects) object.setTexture(texture, scale); + if (!objects.isEmpty()) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + objects.get(i).setTexture(texture, scale); + } + } + else { Object object = new Object(texture, scale); object.setObjectScale(1.0f); @@ -53,6 +59,10 @@ public void createObject(int season) { public void update(int season, int timesOfDay) { int s = season == 5 ? 4:season; if (currentSeason != s) createObject(s); - for (Object object : objects) object.setColorTransform(colorTransformValues[season][timesOfDay]); + + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + objects.get(i).setColorTransform(colorTransformValues[season][timesOfDay]); + } } } diff --git a/java/com/scrat/everchanging/Bat.java b/java/com/scrat/everchanging/Bat.java index 5c4cfa1..a32e9a2 100644 --- a/java/com/scrat/everchanging/Bat.java +++ b/java/com/scrat/everchanging/Bat.java @@ -163,7 +163,9 @@ public void update(boolean createObject) { frameCounter = (frameCounter+1) % maxFrames; if (createObject && (frameCounter==2)) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform.length) { object.resetMatrix(); object.setTexture(textureManager.getTexture(textureManager.getTextureIndex(textureList[0][spriteTable[object.animCounter]])), 1.0f); @@ -176,7 +178,11 @@ public void update(boolean createObject) { else removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } diff --git a/java/com/scrat/everchanging/Blick.java b/java/com/scrat/everchanging/Blick.java index 78ce258..4173b81 100644 --- a/java/com/scrat/everchanging/Blick.java +++ b/java/com/scrat/everchanging/Blick.java @@ -987,14 +987,20 @@ void objectAnimate(Object object) { public void update(boolean createObject) { if (createObject) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); object.resetMatrix(); objectAnimate(object); object.setTransform(matrixTransform[spriteIndex[object.index]][object.frameCounter]); object.frameCounter = (object.frameCounter+1) % matrixTransform[spriteIndex[object.index]].length; if (!createObject && (object.frameCounter == 0)) removeObjects.add(object); } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/ButterFlie.java b/java/com/scrat/everchanging/ButterFlie.java index 3048d3b..bc70ef4 100644 --- a/java/com/scrat/everchanging/ButterFlie.java +++ b/java/com/scrat/everchanging/ButterFlie.java @@ -1061,7 +1061,9 @@ public void update(boolean createObject) { if (frameCounter == 2) if (createObject) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform[object.index].length) { object.resetMatrix(); object.setTexture(textureManager.getTexture(textureManager.getTextureIndex(textureList[0][object.animCounter++ % textureList[0].length])), 1.0f); @@ -1070,7 +1072,11 @@ public void update(boolean createObject) { object.frameCounter++; } else removeObjects.add(object); } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } diff --git a/java/com/scrat/everchanging/Crystal.java b/java/com/scrat/everchanging/Crystal.java index 08626d2..0e015c6 100644 --- a/java/com/scrat/everchanging/Crystal.java +++ b/java/com/scrat/everchanging/Crystal.java @@ -120,7 +120,9 @@ public void createObject(float[] transform, float[] translate) { public void update(boolean createObject) { frameCounter = (frameCounter+1) % maxFrames; if (createObject && (frameCounter == 1)) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform.length) { object.resetMatrix(); object.setColorTransform(colorTransform[object.frameCounter]); @@ -130,7 +132,11 @@ public void update(boolean createObject) { removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/Dandelion.java b/java/com/scrat/everchanging/Dandelion.java index d27eabf..1d4ead1 100644 --- a/java/com/scrat/everchanging/Dandelion.java +++ b/java/com/scrat/everchanging/Dandelion.java @@ -279,7 +279,9 @@ public void update(boolean createObject) { init = createObject; if (createObject && frameCounter==2) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); object.resetMatrix(); object.setTexture(textureManager.getTexture(textureManager.getTextureIndex(textureList[0][object.animCounter])), 1.0f); object.setTransform(animationStartPosition); @@ -288,7 +290,11 @@ public void update(boolean createObject) { object.animCounter = (object.animCounter+1) % textureList[0].length; if (!createObject && (object.frameCounter == 0)) removeObjects.add(object); } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/EverchangingRender.java b/java/com/scrat/everchanging/EverchangingRender.java index 847888b..3f5929a 100644 --- a/java/com/scrat/everchanging/EverchangingRender.java +++ b/java/com/scrat/everchanging/EverchangingRender.java @@ -162,7 +162,9 @@ public void onSurfaceChanged(GL10 gl, int width, int height) { GLES20.glViewport(0, 0, width, height); float scaleImageHeight = surfaceHeight / 320f; //todo setup position - for (Scene scene : scenes) { + final int scenesSize = scenes.size(); + for (int i = 0; i < scenesSize; i++) { + final Scene scene = scenes.get(i); switch (scene.sceneType) { case BG: ((BackgroundScene) scene).setupPosition(surfaceWidth, surfaceHeight, scaleImageHeight, displayRotation); break; /*complete 100% 640/480+ */ case CB: ((CrystalBlickScene) scene).setupPosition(surfaceWidth, surfaceHeight, scaleImageHeight, displayRotation); break; /*complete 100% 640/480+ */ @@ -197,7 +199,9 @@ private Scene.ShortTypes getAnim() { void update() { // todo update Scene.ShortTypes currentScene = getAnim(); - for (Scene scene : scenes) { + final int scenesSize = scenes.size(); + for (int i = 0; i < scenesSize; i++) { + final Scene scene = scenes.get(i); boolean createObject = scene.sceneType == currentScene; switch (scene.sceneType) { case BG: ((BackgroundScene) scene).update(); break; @@ -222,7 +226,9 @@ void update() { void render(){ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); //todo draw - for (Scene scene : scenes) { + final int scenesSize = scenes.size(); + for (int i = 0; i < scenesSize; i++) { + final Scene scene = scenes.get(i); switch (scene.sceneType) { case BG: ((BackgroundScene) scene).render(); break; case E: ((EyesScene) scene).render(); break; diff --git a/java/com/scrat/everchanging/Eye.java b/java/com/scrat/everchanging/Eye.java index 2eb4de3..2e1b725 100644 --- a/java/com/scrat/everchanging/Eye.java +++ b/java/com/scrat/everchanging/Eye.java @@ -73,7 +73,9 @@ public void update(boolean createObject) { init = createObject; if (frameCounter == 2) if (createObject) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.animCounter == 0) { object.frameCounter++; if (object.frameCounter < Frames.length) { @@ -87,7 +89,11 @@ public void update(boolean createObject) { } object.animCounter--; } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/Fairy.java b/java/com/scrat/everchanging/Fairy.java index 7718faa..f1bb210 100644 --- a/java/com/scrat/everchanging/Fairy.java +++ b/java/com/scrat/everchanging/Fairy.java @@ -290,13 +290,19 @@ private void createObject(int index) { } private void updateCreator() { - for (Creator creator : creatorObjects) { + final int objectsSize = creatorObjects.size(); + for (int i = 0; i < objectsSize; i++) { + final Creator creator = creatorObjects.get(i); if (creator.frame == 0) createObject(creator.animIndex); if (creator.maxFrame == 0) removeCreatorObjects.add(creator); creator.frame --; creator.maxFrame --; } - for (Creator creator : removeCreatorObjects) creatorObjects.remove(creator); + + final int removeCreatorObjectsSize = removeCreatorObjects.size(); + for (int i = 0; i < removeCreatorObjectsSize; i++) { + creatorObjects.remove(removeCreatorObjects.get(i)); + } removeCreatorObjects.clear(); } @@ -308,7 +314,9 @@ public void update(boolean createObject) { updateCreator(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform[object.index].length) { object.resetMatrix(); object.setTransform(matrixTransform[object.index][object.frameCounter][object.animCounter]); @@ -324,10 +332,12 @@ public void update(boolean createObject) { object.frameCounter++; } else removeObjects.add(object); } - for (Object object : removeObjects) objects.remove(object); - removeObjects.clear(); - + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } + removeObjects.clear(); } private static class Creator { diff --git a/java/com/scrat/everchanging/FireFlie.java b/java/com/scrat/everchanging/FireFlie.java index 68c7f36..53a854e 100644 --- a/java/com/scrat/everchanging/FireFlie.java +++ b/java/com/scrat/everchanging/FireFlie.java @@ -210,7 +210,9 @@ public void update(boolean createObject) { init = createObject; if (createObject && frameCounter==2) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform.length) { object.resetMatrix(); object.setColorTransform(colorTransform[object.frameCounter]); @@ -221,7 +223,11 @@ public void update(boolean createObject) { else removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/FireWork.java b/java/com/scrat/everchanging/FireWork.java index 692c398..6177b61 100644 --- a/java/com/scrat/everchanging/FireWork.java +++ b/java/com/scrat/everchanging/FireWork.java @@ -92,7 +92,9 @@ public void update(boolean createObject) { if ((createObject) && (frameCounter==2) && (random.nextInt(3) == 0)) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < spriteTable.length) { object.resetMatrix(); object.setTexture(textureManager.getTexture(textureManager.getTextureIndex(textureList[0][spriteTable[object.frameCounter]])), 1.0f); @@ -102,7 +104,11 @@ public void update(boolean createObject) { else removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/Fly.java b/java/com/scrat/everchanging/Fly.java index 16c6c33..37b653f 100644 --- a/java/com/scrat/everchanging/Fly.java +++ b/java/com/scrat/everchanging/Fly.java @@ -124,7 +124,9 @@ public void createObject(float[] transform, float[] translate, int xscale, int i objects.add(object); } public void update() { - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform[object.index].length) { creatorCallback.callingCrystallCreatorCallback(object.transformMatrix, object.ViewTranslate); TextureManager.Texture texture = textureManager.getTexture(textureManager.getTextureIndex(textureList[0][object.animCounter])); @@ -141,7 +143,11 @@ public void update() { removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } diff --git a/java/com/scrat/everchanging/Foreground.java b/java/com/scrat/everchanging/Foreground.java index db5e4c5..54e42bc 100644 --- a/java/com/scrat/everchanging/Foreground.java +++ b/java/com/scrat/everchanging/Foreground.java @@ -56,12 +56,17 @@ public void update(int foregroundIndex, int timesOfDay) { resetMatrix(); createObjects(); } - for (Object object : objects) object.setColorTransform(colorTransformValues[current][timesOfDay]); + + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + objects.get(i).setColorTransform(colorTransformValues[current][timesOfDay]); + } } private void createObjects() { - for (String texture : textureList[current]) { - int textureIndex = textureManager.getTextureIndex(texture); + final int textureListCurrentLength = textureList[current].length; + for (int i = 0; i < textureListCurrentLength; i++) { + int textureIndex = textureManager.getTextureIndex(textureList[current][i]); Object object = new Object(textureManager.getTexture(textureIndex), scale); object.resetViewMatrix(); object.setObjectScale(1.0f); @@ -73,7 +78,10 @@ private void createObjects() { private void setObjectsPosition() { float deltaHeight = height; int index = 0; - for (Object object: objects) { + + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); float spriteWidth = object.texture.width * scale; float spriteHeight = object.texture.height * scale; float y = deltaHeight - spriteHeight + offsetValues[current][index][0]; diff --git a/java/com/scrat/everchanging/Leave.java b/java/com/scrat/everchanging/Leave.java index 4aa6e70..af2e3f1 100644 --- a/java/com/scrat/everchanging/Leave.java +++ b/java/com/scrat/everchanging/Leave.java @@ -434,7 +434,9 @@ public void update(boolean createObject) { if (!init && createObject) numClips = get0703()?maxObjects:(minObjects + random.nextInt(maxObjects - 4)); init = createObject; if (createObject && (frameCounter == 2)) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); object.resetMatrix(); if (object.remove) { @@ -457,10 +459,11 @@ public void update(boolean createObject) { else removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); - removeObjects.clear(); - + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } + removeObjects.clear(); } - } diff --git a/java/com/scrat/everchanging/Petal.java b/java/com/scrat/everchanging/Petal.java index 2e3f577..b60a869 100644 --- a/java/com/scrat/everchanging/Petal.java +++ b/java/com/scrat/everchanging/Petal.java @@ -338,7 +338,8 @@ private void addCreator() { } private void creatorObjects() { - for (int i = creatingFramesCounter.size()-1; i>=0; i--) { + final int creatingFramesCounterSize = creatingFramesCounter.size(); + for (int i = creatingFramesCounterSize-1; i>=0; i--) { Creator creator = creatingFramesCounter.get(i); creator._C++; switch (creator._C) { @@ -372,7 +373,9 @@ public void update(boolean createObject) { if (createObject && (frameCounter==2)) addCreator(); creatorObjects(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform[object.index].length) { object.resetMatrix(); object.setTexture(textureManager.getTexture(textureManager.getTextureIndex(spritesAnimation[object.index][object.frameCounter])), 1.0f); @@ -381,7 +384,11 @@ public void update(boolean createObject) { object.frameCounter++; } else removeObjects.add(object); } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } diff --git a/java/com/scrat/everchanging/Rain.java b/java/com/scrat/everchanging/Rain.java index 37d1848..848c4d4 100644 --- a/java/com/scrat/everchanging/Rain.java +++ b/java/com/scrat/everchanging/Rain.java @@ -84,19 +84,30 @@ public void update(boolean createObject) { if (!init && createObject) numClips = get0403() ? maxObjects : (minObjects + random.nextInt(maxObjects - 4)); init = createObject; if (createObject && frameCounter == 1) createObject(); - for (Object object : objects) { + + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); object.setTranslate(-speed, speed); if (++object.frameCounter == frameMoveCount) { finishCallback.callingFinishCallback(object); removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } /* | По идее надо делать через resetObject, но тогда ripple не отображаются, | поэтому просто пересоздаем все удаленные объекты. */ - if (createObject) for (Object object : removeObjects) createObject(); + if (createObject) { + for (int i = 0; i < removeObjectsSize; i++) { + createObject(); + } + } removeObjects.clear(); } diff --git a/java/com/scrat/everchanging/Ripple.java b/java/com/scrat/everchanging/Ripple.java index 41bb4ef..fe6e7e8 100644 --- a/java/com/scrat/everchanging/Ripple.java +++ b/java/com/scrat/everchanging/Ripple.java @@ -24,7 +24,9 @@ public void createObject(Object object) { } public void update() { - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter > 0) { if (object.frameCounter == 1) { int textureIndex = textureManager.getTextureIndex(textureList[0][typesAnim]); @@ -37,7 +39,11 @@ public void update() { object.frameCounter++; if (object.frameCounter > maxFrames) removeObjects.add(object); } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/Scene.java b/java/com/scrat/everchanging/Scene.java index bbe23c0..97ceabc 100644 --- a/java/com/scrat/everchanging/Scene.java +++ b/java/com/scrat/everchanging/Scene.java @@ -44,7 +44,10 @@ public void render(TextureObject object) { // Disabled because of SIGSEGV, https://github.com/SCratORS/Everchanging/issues/2 //GLES20.glUniform1i (object.mTexture, GLES20.GL_TEXTURE0); float[] sceneMatrix = object.calculateMatrix(); - for (Object subObject: object.objects) { + + final int objectsSize = object.objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object subObject = object.objects.get(i); //Биндим картинку GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, subObject.texture.textureID); //Активируем позиционирование, что бы это нибыло diff --git a/java/com/scrat/everchanging/Snow.java b/java/com/scrat/everchanging/Snow.java index d41ec2e..cf1f167 100644 --- a/java/com/scrat/everchanging/Snow.java +++ b/java/com/scrat/everchanging/Snow.java @@ -194,7 +194,9 @@ public void update(boolean createObject) { if (createObject && (frameCounter == 2)) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); object.resetMatrix(); object.setTransform(AnimatedTextureMatrix[object.animCounter]); if (object.frameCounter < heightMax - colorTransform.length ) { @@ -213,7 +215,11 @@ public void update(boolean createObject) { } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } diff --git a/java/com/scrat/everchanging/TextureManager.java b/java/com/scrat/everchanging/TextureManager.java index 541aaee..c9597a0 100644 --- a/java/com/scrat/everchanging/TextureManager.java +++ b/java/com/scrat/everchanging/TextureManager.java @@ -34,17 +34,39 @@ public float dipToPixels(float dipValue){ TextureManager(Context context, String[][] TexturesNameList, float[][] PivotList){ this.context = context; int texturesCount = 0; - for (String[] textures: TexturesNameList) texturesCount+=textures.length; + + final int texturesNameListLength = TexturesNameList.length; + // Optimization to avoid creating Iterator + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < texturesNameListLength; i++) { + final String[] textures = TexturesNameList[i]; + texturesCount += textures.length; + } String[] bothTextureNameList = new String[texturesCount]; int c = 0; - for (String[] strings : TexturesNameList) - for (String string : strings) bothTextureNameList[c++] = string; + + // Optimization to avoid creating Iterator + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < texturesNameListLength; i++) { + final String[] strings = TexturesNameList[i]; + final int stringsLength = strings.length; + // Optimization to avoid creating Iterator + //noinspection ForLoopReplaceableByForEach + for (int s = 0; s < stringsLength; s++) { + bothTextureNameList[c++] = strings[s]; + } + } texturesIDs = new int[texturesCount]; textures = new Texture[texturesCount]; GLES20.glGenTextures(texturesCount, texturesIDs, 0); int counter = 0; - for (int textureID: texturesIDs) { + + final int texturesIDsLength = texturesIDs.length; + // Optimization to avoid creating Iterator + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < texturesIDsLength; i++) { + final int textureID = texturesIDs[i]; GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID); textures[counter] = new Texture(); textures[counter].textureID = textureID; @@ -90,7 +112,8 @@ Texture getTexture(int index) { } int getTextureIndex(String name){ - for (int i = 0; i < textures.length; i++) { + final int texturesLength = textures.length; + for (int i = 0; i < texturesLength; i++) { if (textures[i].textureName.equals(name)) return i; } return -1; diff --git a/java/com/scrat/everchanging/Valentine.java b/java/com/scrat/everchanging/Valentine.java index aa928e7..154a063 100644 --- a/java/com/scrat/everchanging/Valentine.java +++ b/java/com/scrat/everchanging/Valentine.java @@ -82,7 +82,9 @@ void createObject() { public void update(boolean createObject) { if (createObject) createObject(); - for (Object object : objects) { + final int objectsSize = objects.size(); + for (int i = 0; i < objectsSize; i++) { + final Object object = objects.get(i); if (object.frameCounter < matrixTransform.length) { object.resetMatrix(); object.setColorTransform(colorTransform[object.frameCounter]); @@ -92,7 +94,11 @@ public void update(boolean createObject) { removeObjects.add(object); } } - for (Object object : removeObjects) objects.remove(object); + + final int removeObjectsSize = removeObjects.size(); + for (int i = 0; i < removeObjectsSize; i++) { + objects.remove(removeObjects.get(i)); + } removeObjects.clear(); } } From 58fe355abcb3b3eec703e1ce98372f18feafebc8 Mon Sep 17 00:00:00 2001 From: Yaroslav Mytkalyk Date: Sun, 4 Feb 2024 14:24:40 +0100 Subject: [PATCH 2/2] Reuse transform matrix to avoid allocations --- java/com/scrat/everchanging/Object.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/java/com/scrat/everchanging/Object.java b/java/com/scrat/everchanging/Object.java index c7f6102..7fb5c33 100644 --- a/java/com/scrat/everchanging/Object.java +++ b/java/com/scrat/everchanging/Object.java @@ -5,6 +5,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; +import java.util.Arrays; public class Object { @@ -23,6 +24,8 @@ public class Object { private final float[] scaleViewMatrix = new float[16]; //Матрица увеличения вида private final float[] rotateViewMatrix = new float[16]; //Матрица поворота вида + private final float[] tmpTransformMatrix = new float[16]; + public boolean remove = false; private float scale = 1.0f; @@ -140,12 +143,12 @@ void setRotateSkew(float angleX, float angleY) { */ void setTransform(float[] transform) { transformMatrix = transform; - float[] matrix = new float[16]; - Matrix.setIdentityM(matrix, 0); - matrix[0] = transform[0];matrix[1] = transform[2]; - matrix[4] = transform[3];matrix[5] = transform[1]; - matrix[12] = transform[4];matrix[13] = transform[5]; - Matrix.multiplyMM(rotateSkewMatrix, 0, matrix, 0, rotateSkewMatrix, 0); + Arrays.fill(tmpTransformMatrix,0); + Matrix.setIdentityM(tmpTransformMatrix, 0); + tmpTransformMatrix[0] = transform[0];tmpTransformMatrix[1] = transform[2]; + tmpTransformMatrix[4] = transform[3];tmpTransformMatrix[5] = transform[1]; + tmpTransformMatrix[12] = transform[4];tmpTransformMatrix[13] = transform[5]; + Matrix.multiplyMM(rotateSkewMatrix, 0, tmpTransformMatrix, 0, rotateSkewMatrix, 0); } void setRotate(float angle) {