Skip to content

Commit b0b2f4c

Browse files
committed
Reduce allocation of GameplayHitSampleInfo arrays
1 parent e0996c8 commit b0b2f4c

File tree

5 files changed

+54
-32
lines changed

5 files changed

+54
-32
lines changed

src/ru/nsu/ccfit/zuev/osu/game/GameObjectListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.rian.osu.gameplay.GameplayHitSampleInfo;
88

99
import java.util.BitSet;
10+
import java.util.List;
1011

1112
public interface GameObjectListener {
1213

@@ -41,5 +42,5 @@ void onSliderHit(int id, int score, PointF judgementPos,
4142

4243
void onUpdatedAutoCursor(float pX, float pY);
4344

44-
void playHitSamples(GameplayHitSampleInfo[] samples);
45+
void playHitSamples(List<GameplayHitSampleInfo> samples);
4546
}

src/ru/nsu/ccfit/zuev/osu/game/GameScene.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,16 +2389,16 @@ public void onSpinnerHit(int id, final int score, final boolean endCombo, int to
23892389
}
23902390

23912391
@Override
2392-
public void playHitSamples(GameplayHitSampleInfo[] samples) {
2392+
public void playHitSamples(List<GameplayHitSampleInfo> samples) {
23932393
float volume = 1;
23942394
var muted = GameHelper.getMuted();
23952395

23962396
if (muted != null && muted.affectsHitSounds()) {
23972397
volume = muted.volumeAt(stat.getCombo());
23982398
}
23992399

2400-
for (int i = 0; i < samples.length; ++i) {
2401-
var sample = samples[i];
2400+
for (int i = 0, size = samples.size(); i < size; ++i) {
2401+
var sample = samples.get(i);
24022402
sample.setVolume(volume);
24032403
sample.play();
24042404
}

src/ru/nsu/ccfit/zuev/osu/game/GameplayHitCircle.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import org.anddev.andengine.entity.scene.Scene;
1717

18+
import java.util.ArrayList;
19+
1820
import ru.nsu.ccfit.zuev.osu.Config;
1921
import ru.nsu.ccfit.zuev.osu.ResourceManager;
2022
import ru.nsu.ccfit.zuev.osu.scoring.ResultType;
@@ -31,7 +33,7 @@ public class GameplayHitCircle extends GameObject {
3133
private float timePreempt;
3234
private boolean kiai;
3335
private boolean successfulHit;
34-
private GameplayHitSampleInfo[] hitSamples;
36+
private final ArrayList<GameplayHitSampleInfo> hitSamples = new ArrayList<>(5);
3537

3638
/**
3739
* The circle piece that represents the circle body and overlay.
@@ -149,7 +151,7 @@ public void init(final GameObjectListener listener, final Scene pScene, final Hi
149151

150152
// Initialize samples
151153
var parsedSamples = beatmapCircle.getSamples();
152-
hitSamples = new GameplayHitSampleInfo[parsedSamples.size()];
154+
hitSamples.ensureCapacity(parsedSamples.size());
153155

154156
for (int i = 0, size = parsedSamples.size(); i < size; i++) {
155157
var gameplaySample = GameplayHitSampleInfo.pool.obtain();
@@ -159,7 +161,7 @@ public void init(final GameObjectListener listener, final Scene pScene, final Hi
159161
gameplaySample.setFrequency(GameHelper.getSpeedMultiplier());
160162
}
161163

162-
hitSamples[i] = gameplaySample;
164+
hitSamples.add(gameplaySample);
163165
}
164166

165167
scene.attachChild(circlePiece, 0);
@@ -171,12 +173,14 @@ private void removeFromScene() {
171173
return;
172174
}
173175

174-
for (int i = 0; i < hitSamples.length; ++i) {
175-
hitSamples[i].reset();
176-
GameplayHitSampleInfo.pool.free(hitSamples[i]);
177-
}
176+
for (int i = hitSamples.size() - 1; i >= 0; --i) {
177+
var sample = hitSamples.get(i);
178178

179-
hitSamples = null;
179+
sample.reset();
180+
GameplayHitSampleInfo.pool.free(sample);
181+
182+
hitSamples.remove(i);
183+
}
180184

181185
circlePiece.clearEntityModifiers();
182186
approachCircle.clearEntityModifiers();

src/ru/nsu/ccfit/zuev/osu/game/GameplaySlider.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import ru.nsu.ccfit.zuev.osu.scoring.StatisticV2;
4141
import ru.nsu.ccfit.zuev.skins.OsuSkin;
4242

43+
import java.util.ArrayList;
4344
import java.util.BitSet;
4445

4546
public class GameplaySlider extends GameObject {
@@ -66,7 +67,7 @@ public class GameplaySlider extends GameObject {
6667
private final boolean isSliderBallFlip;
6768
private boolean shouldSnakeOut;
6869

69-
private GameplayHitSampleInfo[][] nestedHitSamples;
70+
private final ArrayList<ArrayList<GameplayHitSampleInfo>> nestedHitSamples = new ArrayList<>(10);
7071
private final GameplaySequenceHitSampleInfo sliderSlideSample;
7172
private final GameplaySequenceHitSampleInfo sliderWhistleSample;
7273

@@ -606,14 +607,19 @@ private void removeFromScene() {
606607
listener.removeObject(this);
607608
stopSlidingSamples();
608609

609-
for (int i = 0; i < nestedHitSamples.length; ++i) {
610-
for (int j = 0; j < nestedHitSamples[i].length; ++j) {
611-
nestedHitSamples[i][j].reset();
612-
GameplayHitSampleInfo.pool.free(nestedHitSamples[i][j]);
610+
for (int i = 0, iSize = nestedHitSamples.size(); i < iSize; ++i) {
611+
var hitSamples = nestedHitSamples.get(i);
612+
613+
for (int j = hitSamples.size() - 1; j >= 0; --j) {
614+
var sample = hitSamples.get(j);
615+
616+
sample.reset();
617+
GameplayHitSampleInfo.pool.free(sample);
618+
619+
hitSamples.remove(j);
613620
}
614621
}
615622

616-
nestedHitSamples = null;
617623
path = null;
618624
scene = null;
619625
}
@@ -1301,21 +1307,30 @@ private void applyBodyFadeAdjustments(float fadeInDuration) {
13011307

13021308
private void reloadHitSounds() {
13031309
var nestedObjects = beatmapSlider.getNestedHitObjects();
1304-
nestedHitSamples = new GameplayHitSampleInfo[nestedObjects.size()][];
1310+
nestedHitSamples.ensureCapacity(nestedObjects.size());
13051311

1306-
for (int i = 0; i < nestedHitSamples.length; ++i) {
1312+
for (int i = 0, size = nestedObjects.size(); i < size; ++i) {
13071313
var nestedObjectSamples = nestedObjects.get(i).getSamples();
1308-
nestedHitSamples[i] = new GameplayHitSampleInfo[nestedObjectSamples.size()];
1314+
int nestedObjectSampleCount = nestedObjectSamples.size();
1315+
1316+
var nestedHitSample = i < nestedHitSamples.size() ? nestedHitSamples.get(i) : null;
1317+
1318+
if (nestedHitSample != null) {
1319+
nestedHitSample.ensureCapacity(nestedObjectSampleCount);
1320+
} else {
1321+
nestedHitSample = new ArrayList<>(Math.max(5, nestedObjectSampleCount));
1322+
nestedHitSamples.add(nestedHitSample);
1323+
}
13091324

1310-
for (int j = 0; j < nestedHitSamples[i].length; ++j) {
1325+
for (int j = 0; j < nestedObjectSampleCount; ++j) {
13111326
var gameplaySample = GameplayHitSampleInfo.pool.obtain();
13121327
gameplaySample.init(nestedObjectSamples.get(j));
13131328

13141329
if (GameHelper.isSamplesMatchPlaybackRate()) {
13151330
gameplaySample.setFrequency(GameHelper.getSpeedMultiplier());
13161331
}
13171332

1318-
nestedHitSamples[i][j] = gameplaySample;
1333+
nestedHitSample.add(gameplaySample);
13191334
}
13201335
}
13211336

@@ -1355,7 +1370,7 @@ private void reloadHitSounds() {
13551370
}
13561371

13571372
private void playCurrentNestedObjectHitSound() {
1358-
listener.playHitSamples(nestedHitSamples[currentNestedObjectIndex]);
1373+
listener.playHitSamples(nestedHitSamples.get(currentNestedObjectIndex));
13591374
}
13601375

13611376
@Override

src/ru/nsu/ccfit/zuev/osu/game/GameplaySpinner.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.anddev.andengine.opengl.texture.region.TextureRegion;
1717
import org.anddev.andengine.util.MathUtils;
1818

19+
import java.util.ArrayList;
20+
1921
import ru.nsu.ccfit.zuev.audio.serviceAudio.SongService;
2022
import ru.nsu.ccfit.zuev.osu.Config;
2123
import ru.nsu.ccfit.zuev.osu.Constants;
@@ -50,7 +52,7 @@ public class GameplaySpinner extends GameObject {
5052
protected boolean spinnable;
5153

5254
protected final boolean isSpinnerFrequencyModulate;
53-
protected GameplayHitSampleInfo[] hitSamples;
55+
protected final ArrayList<GameplayHitSampleInfo> hitSamples = new ArrayList<>(5);
5456
protected final GameplaySequenceHitSampleInfo spinnerSpinSample;
5557
protected final GameplaySequenceHitSampleInfo spinnerBonusSample;
5658

@@ -366,17 +368,17 @@ public void update(final float dt) {
366368

367369
protected void reloadHitSounds() {
368370
var parsedSamples = beatmapSpinner.getSamples();
369-
hitSamples = new GameplayHitSampleInfo[parsedSamples.size()];
371+
hitSamples.ensureCapacity(parsedSamples.size());
370372

371-
for (int i = 0; i < hitSamples.length; ++i) {
373+
for (int i = 0, size = parsedSamples.size(); i < size; ++i) {
372374
var gameplaySample = GameplayHitSampleInfo.pool.obtain();
373375
gameplaySample.init(parsedSamples.get(i));
374376

375377
if (GameHelper.isSamplesMatchPlaybackRate()) {
376378
gameplaySample.setFrequency(GameHelper.getSpeedMultiplier());
377379
}
378380

379-
hitSamples[i] = gameplaySample;
381+
hitSamples.add(gameplaySample);
380382
}
381383

382384
spinnerSpinSample.reset();
@@ -420,13 +422,13 @@ protected void playAndFreeHitSamples(int obtainedScore) {
420422
listener.playHitSamples(hitSamples);
421423
}
422424

423-
for (int i = 0; i < hitSamples.length; ++i) {
424-
var sample = hitSamples[i];
425+
for (int i = hitSamples.size() - 1; i >= 0; --i) {
426+
var sample = hitSamples.get(i);
425427
sample.reset();
426428
GameplayHitSampleInfo.pool.free(sample);
427-
}
428429

429-
hitSamples = null;
430+
hitSamples.remove(i);
431+
}
430432
}
431433

432434
@Override

0 commit comments

Comments
 (0)