Убрать аллокации из игрового hot path

This commit is contained in:
2026-08-18 17:20:04 +03:00
parent de3b9485c1
commit 88a1ba9b34
3 changed files with 196 additions and 31 deletions
@@ -0,0 +1,47 @@
package com.projectsacrifice.game;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotSame;
import java.util.Arrays;
import org.junit.Test;
public final class AccessibilityStateCacheTest {
@Test
public void unchangedFramesReuseOneStatusAndOneDeduplicatedSignalSet() {
AccessibilityStateCache cache = new AccessibilityStateCache();
cache.configureSignals(Arrays.asList("lift", "lift", "door"));
assertEquals(Arrays.asList("lift", "door"), cache.signalIds());
assertTrue(cache.update(GameStrings.forLanguage(GameLanguage.EN), 1, 0, 1, true));
String first = cache.statusText();
for (int frame = 0; frame < 600; frame++) {
assertFalse(cache.update(GameStrings.forLanguage(GameLanguage.EN), 1, 0, 1, true));
assertSame(first, cache.statusText());
}
}
@Test
public void criticalStateAndLanguageChangesInvalidateExactlyOnce() {
AccessibilityStateCache cache = new AccessibilityStateCache();
cache.configureSignals(Arrays.asList("plate"));
cache.update(GameStrings.forLanguage(GameLanguage.EN), 0, 0, 1, true);
String initial = cache.statusText();
assertTrue(cache.update(GameStrings.forLanguage(GameLanguage.EN), 1, 1, 1, false));
String changed = cache.statusText();
assertNotSame(initial, changed);
assertTrue(changed.contains("Signals 1/1"));
assertTrue(changed.contains("Volunteer respawning"));
assertFalse(cache.update(GameStrings.forLanguage(GameLanguage.EN), 1, 1, 1, false));
assertTrue(cache.update(GameStrings.forLanguage(GameLanguage.RU), 1, 1, 1, false));
assertTrue(cache.statusText().contains("Сигналы 1/1"));
assertFalse(cache.update(GameStrings.forLanguage(GameLanguage.RU), 1, 1, 1, false));
}
}