From bd6da593de104d3c2b8d0f004627b1b197e35b99 Mon Sep 17 00:00:00 2001 From: Davis Rollman Date: Sat, 16 May 2026 02:44:58 -0700 Subject: [PATCH] Optimize LightList hot path copies --- .../main/java/com/jme3/light/LightList.java | 55 +++--- .../java/com/jme3/light/LightListTest.java | 156 ++++++++++++++++++ 2 files changed, 189 insertions(+), 22 deletions(-) create mode 100644 jme3-core/src/test/java/com/jme3/light/LightListTest.java diff --git a/jme3-core/src/main/java/com/jme3/light/LightList.java b/jme3-core/src/main/java/com/jme3/light/LightList.java index 2770f089f7..2089e2da55 100644 --- a/jme3-core/src/main/java/com/jme3/light/LightList.java +++ b/jme3-core/src/main/java/com/jme3/light/LightList.java @@ -51,6 +51,7 @@ public final class LightList implements Iterable, Savable, Cloneable, Jme private Light[] list, tlist; private float[] distToOwner; private int listSize; + private int tlistSize; private Spatial owner; private static final int DEFAULT_SIZE = 1; @@ -136,8 +137,9 @@ public void remove(int index) { return; } - for (int i = index; i < listSize; i++) { - list[i] = list[i+1]; + int copyLength = listSize - index; + if (copyLength > 0) { + System.arraycopy(list, index + 1, list, index, copyLength); } list[listSize] = null; } @@ -182,11 +184,11 @@ public void clear() { if (listSize == 0) return; - for (int i = 0; i < listSize; i++) - list[i] = null; + Arrays.fill(list, 0, listSize, null); if (tlist != null) - Arrays.fill(tlist, null); + Arrays.fill(tlist, 0, tlistSize, null); + tlistSize = 0; listSize = 0; } @@ -205,11 +207,15 @@ public void clear() { public void sort(boolean transformChanged) { if (listSize > 1) { // resize or populate our temporary array as necessary - if (tlist == null || tlist.length != list.length) { - tlist = list.clone(); + if (tlist == null || tlist.length < listSize) { + tlist = new Light[listSize]; } else { - System.arraycopy(list, 0, tlist, 0, list.length); + if (tlistSize > listSize) { + Arrays.fill(tlist, listSize, tlistSize, null); + } } + System.arraycopy(list, 0, tlist, 0, listSize); + tlistSize = listSize; if (transformChanged) { // check distance of each light @@ -249,31 +255,36 @@ public void update(LightList local, LightList parent, Predicate filter) { // using the arguments clear(); - while (list.length <= local.listSize) { + int requiredSize = local.listSize + (parent == null ? 0 : parent.listSize); + while (list.length < requiredSize) { doubleSize(); } - int localListSize = 0; - for(int i=0;i light != discard); + + Assertions.assertEquals(2, world.size()); + Assertions.assertSame(keep, world.get(0)); + Assertions.assertSame(parentLight, world.get(1)); + } +}