Skip to content

Commit 2200c4b

Browse files
committed
Reduce garbage generation
1 parent 78cd12b commit 2200c4b

File tree

3 files changed

+19
-15
lines changed

3 files changed

+19
-15
lines changed

core/src/main/java/org/mini2Dx/miniscript/core/GameScriptingEngine.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public GameScriptingEngine(ClasspathScriptProvider classpathScriptProvider,
215215

216216
private void init(int maxConcurrentScripts) {
217217
for(int i = 0; i < maxConcurrentScripts; i++) {
218-
threadPoolProvider.submit(this);
218+
threadPoolProvider.scheduleAtFixedRate(this, 16L, 16L, TimeUnit.MILLISECONDS);
219219
}
220220
threadPoolProvider.scheduleAtFixedRate(new Runnable() {
221221
@Override
@@ -288,8 +288,9 @@ public void update(float delta) {
288288
gameThread = Thread.currentThread();
289289
}
290290

291-
for (GameFuture gameFuture : runningFutures.values()) {
292-
gameFuture.evaluate(delta);
291+
final List<GameFuture> gameFutures = (List<GameFuture>) runningFutures.values();
292+
for (int i = 0; i < gameFutures.size(); i++) {
293+
gameFutures.get(i).evaluate(delta);
293294
}
294295

295296
while (!queuedFutures.isEmpty()) {
@@ -359,13 +360,6 @@ public void run() {
359360
if(shuttingDown.get()) {
360361
return;
361362
}
362-
363-
long duration = System.currentTimeMillis() - startTime;
364-
if (duration >= 16L) {
365-
threadPoolProvider.submit(this);
366-
} else {
367-
threadPoolProvider.schedule(this, 16L - duration, TimeUnit.MILLISECONDS);
368-
}
369363
}
370364

371365
private void cleanupCompletedFutures() {

core/src/main/java/org/mini2Dx/miniscript/core/threadpool/KavaThreadPoolProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public void shutdown(boolean interruptThreads) {
9898

9999
@Override
100100
public void run() {
101+
final Thread currentThread = Thread.currentThread();
101102
while(running.get()) {
102103
final ScheduledTask scheduledTask;
103104
try {
@@ -114,7 +115,7 @@ public void run() {
114115
}
115116
try {
116117
final ScheduledTaskFuture future = scheduledTask.getFuture();
117-
future.setExecutingThread(Thread.currentThread());
118+
future.setExecutingThread(currentThread);
118119
final Runnable runnable = scheduledTask.getRunnable();
119120
if(runnable != null && !future.isCancelled()) {
120121
runnable.run();
@@ -125,7 +126,7 @@ public void run() {
125126
final ScheduledTaskFuture future = scheduledTask.getFuture();
126127
if(scheduledTask.isRepeating() && !future.isCancelled()) {
127128
final ScheduledTask nextTask = ScheduledTask.allocate(scheduledTask.getRunnable(),
128-
System.nanoTime() + scheduledTask.getRepeatUnit().toNanos(scheduledTask.getRepeatInterval()),
129+
scheduledTask.getScheduledStartTimeNanos() + scheduledTask.getRepeatUnit().toNanos(scheduledTask.getRepeatInterval()),
129130
scheduledTask.getRepeatInterval(), scheduledTask.getRepeatUnit());
130131

131132
nextTask.setFuture(future);

core/src/main/java/org/mini2Dx/miniscript/core/util/ReadWriteMap.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,10 @@ public Set<K> keySet() {
104104
final Set<K> result = keySet.get();
105105
try {
106106
result.clear();
107-
result.addAll(internalMap.keySet());
107+
//addAll allocates arrays unnecessarily
108+
internalMap.keySet().forEach((key) -> {
109+
result.add(key);
110+
});
108111
} finally {
109112
lock.unlockRead();
110113
}
@@ -117,7 +120,10 @@ public Collection<V> values() {
117120
final Collection<V> result = values.get();
118121
try {
119122
result.clear();
120-
result.addAll(internalMap.values());
123+
//addAll allocates arrays unnecessarily
124+
internalMap.values().forEach((val) -> {
125+
result.add(val);
126+
});
121127
} finally {
122128
lock.unlockRead();
123129
}
@@ -130,7 +136,10 @@ public Set<Entry<K, V>> entrySet() {
130136
final Set<Entry<K, V>> result = entrySet.get();
131137
try {
132138
result.clear();
133-
result.addAll(internalMap.entrySet());
139+
//addAll allocates arrays unnecessarily
140+
internalMap.entrySet().forEach((entry) -> {
141+
result.add(entry);
142+
});
134143
} finally {
135144
lock.unlockRead();
136145
}

0 commit comments

Comments
 (0)