Skip to content

Commit 2b87e1c

Browse files
committed
fix: remove overhead via AnimationStateHandler.TreeIterator
1 parent 38bfc71 commit 2b87e1c

File tree

1 file changed

+20
-31
lines changed

1 file changed

+20
-31
lines changed

api/src/main/java/kr/toxicity/model/api/animation/AnimationStateHandler.java

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public final class AnimationStateHandler<T extends Timed> {
4040
@Getter
4141
private int delay;
4242
private volatile TreeIterator currentIterator = null;
43-
private volatile KeyframeData beforeKeyframe = null, afterKeyframe = null;
43+
private volatile T beforeKeyframe = null, afterKeyframe = null;
4444

4545
/**
4646
* Checks this keyframe has been finished
@@ -55,15 +55,15 @@ public boolean keyframeFinished() {
5555
* @return before keyframe
5656
*/
5757
public T beforeKeyframe() {
58-
return value(beforeKeyframe);
58+
return beforeKeyframe;
5959
}
6060

6161
/**
6262
* Gets after keyframe
6363
* @return after keyframe
6464
*/
6565
public T afterKeyframe() {
66-
return value(afterKeyframe);
66+
return afterKeyframe;
6767
}
6868

6969
/**
@@ -73,7 +73,7 @@ public T afterKeyframe() {
7373
*/
7474
@NotNull
7575
public T beforeKeyframe(@NotNull T defaultValue) {
76-
var value = value(beforeKeyframe);
76+
var value = beforeKeyframe;
7777
return value != null ? value : defaultValue;
7878
}
7979

@@ -84,7 +84,7 @@ public T beforeKeyframe(@NotNull T defaultValue) {
8484
*/
8585
@NotNull
8686
public T afterKeyframe(@NotNull T defaultValue) {
87-
var value = value(afterKeyframe);
87+
var value = afterKeyframe;
8888
return value != null ? value : defaultValue;
8989
}
9090

@@ -171,26 +171,16 @@ private boolean updateKeyframe(@NotNull Iterator<TreeIterator> iterator, @NotNul
171171
}
172172
}
173173

174-
private boolean setAfterKeyframe(@Nullable KeyframeData next) {
175-
if (equals(afterKeyframe, next)) return false;
174+
private boolean setAfterKeyframe(@Nullable T next) {
175+
if (afterKeyframe == next) return false;
176176
setConsumer.accept(
177-
value(beforeKeyframe = afterKeyframe),
178-
value(afterKeyframe = next)
177+
beforeKeyframe = afterKeyframe,
178+
afterKeyframe = next
179179
);
180180
delay = Math.round(frame());
181181
return true;
182182
}
183183

184-
private boolean equals(@Nullable KeyframeData from, @Nullable KeyframeData to) {
185-
if (from == null && to == null) return true;
186-
if (from == null || to == null) return false;
187-
return from.value == to.value && from.realTime == to.realTime;
188-
}
189-
190-
private @Nullable T value(@Nullable KeyframeData data) {
191-
return data == null ? null : data.value;
192-
}
193-
194184
/**
195185
* Adds animation
196186
* @param name name
@@ -240,7 +230,7 @@ public boolean stopAnimation(@NotNull String name) {
240230
* @return ticking frame
241231
*/
242232
public float frame() {
243-
return afterKeyframe != null ? 20 * Tracker.MINECRAFT_TICK_MULTIPLIER * (afterKeyframe.realTime + MathUtil.FRAME_EPSILON) : 0F;
233+
return afterKeyframe != null ? 20 * Tracker.MINECRAFT_TICK_MULTIPLIER * (currentIterator.time + MathUtil.FRAME_EPSILON) : 0F;
244234
}
245235

246236
private class TreeIterator implements BooleanSupplier {
@@ -254,13 +244,15 @@ private class TreeIterator implements BooleanSupplier {
254244
private boolean started = false;
255245
private boolean ended = false;
256246

247+
private float time = 0;
248+
257249
public TreeIterator(String name, AnimationIterator<T> iterator, AnimationModifier modifier, Runnable removeTask) {
258250
animation = new RunningAnimation(name, iterator.type());
259251
this.iterator = iterator;
260252
this.modifier = modifier;
261253
this.removeTask = removeTask;
262254

263-
previous = afterKeyframe != null ? afterKeyframe.value : initialValue;
255+
previous = afterKeyframe != null ? afterKeyframe : initialValue;
264256
}
265257

266258
@Override
@@ -272,28 +264,25 @@ public boolean hasNext() {
272264
return iterator.hasNext() || (modifier.end() > 0 && !ended);
273265
}
274266

275-
public @NotNull KeyframeData next() {
267+
public @NotNull T next() {
276268
if (!started) {
277269
started = true;
278-
return new KeyframeData(iterator.next(), (float) modifier.start() / 20);
270+
time = (float) modifier.start() / 20;
271+
return iterator.next();
279272
}
280273
if (!iterator.hasNext()) {
281274
ended = true;
282-
return new KeyframeData(previous, (float) modifier.end() / 20);
275+
time = (float) modifier.end() / 20;
276+
return previous;
283277
}
284278
var nxt = iterator.next();
285-
return new KeyframeData(nxt, nxt.time() / modifier.speedValue());
279+
time = nxt.time() / modifier.speedValue();
280+
return nxt;
286281
}
287282

288283
public void clear() {
289284
iterator.clear();
290285
started = ended = !iterator.hasNext();
291286
}
292287
}
293-
294-
@RequiredArgsConstructor
295-
private class KeyframeData {
296-
private final T value;
297-
private final float realTime;
298-
}
299288
}

0 commit comments

Comments
 (0)