Skip to content

Commit 574c423

Browse files
committed
Threaded shotgun approach to improve performance.
For some reason this actually works
1 parent f905577 commit 574c423

File tree

1 file changed

+30
-48
lines changed
  • projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless

1 file changed

+30
-48
lines changed

projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessNetwork.java

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -104,78 +104,60 @@ private static void tryTransmit(PacketReceiver receiver, Packet packet, double r
104104
}
105105
}
106106

107+
var timer = System.currentTimeMillis(); // yes this is vulnerable to leap seconds, fight me
107108

108109
WirelessHelpers.Bresenham3D(obstructionBlocks, senderBlockPosition, receiverBlockPosition);
110+
111+
if (timer + 500 <= System.currentTimeMillis()) {
112+
log.warn("Bresenham3D took longer than 1 tick - " + obstructionBlocks.size() + " in " + (System.currentTimeMillis() - timer) + "ms");
113+
}
114+
109115
var signalDegradation = distance;
110116
var diagonalCompensation = WirelessHelpers.getDiagonalCompensation(senderBlockPosition, receiverBlockPosition);
111117

112-
var enumerationCounter = 0;
113118
var cancelled = false;
114119

115120
unloadedBlocks.clear();
116121

117-
var timer = System.currentTimeMillis(); // yes this is vulnerable to leap seconds, fight me
118122

119-
for (Vec3i blockVector : obstructionBlocks) {
123+
124+
Map<Vec3i, Double> signalDegradationCumulative = new ConcurrentHashMap<>();
125+
timer = System.currentTimeMillis();
126+
long finalTimer = timer;
127+
obstructionBlocks.parallelStream().forEach((blockVector) -> {
128+
if (finalTimer + 500 <= System.currentTimeMillis()) {
129+
return;
130+
}
120131
var currentBlockPos = new BlockPos(blockVector);
121-
if (level.isLoaded(currentBlockPos) && !level.isEmptyBlock(currentBlockPos)) {
132+
if (!level.isEmptyBlock(currentBlockPos)) {
122133
var currentBlockState = level.getBlockState(currentBlockPos);
123134
if (!currentBlockState.isAir()) {
124135
var explosionResistance = currentBlockState.getBlock().getExplosionResistance();
125136
if (explosionResistance >= 100)
126137
explosionResistance /= 4;
127-
signalDegradation += Math.sqrt(explosionResistance) * 10.0 * diagonalCompensation;
138+
signalDegradationCumulative.put(blockVector, Math.sqrt(explosionResistance) * 10.0 * diagonalCompensation);
128139
}
129-
} else {
130-
unloadedBlocks.add(currentBlockPos);
131-
}
132-
133-
if (signalDegradation > receiveRange) {
134-
break;
135-
}
136-
enumerationCounter++;
137-
if (timer + 500 <= System.currentTimeMillis()) {
138-
log.warn("Distance measure timeout in loaded blocks between [" + senderBlockPosition.getX() + ","
139-
+ senderBlockPosition.getY() + ","
140-
+ senderBlockPosition.getZ() + "] and ["
141-
+ receiverBlockPosition.getX() + ","
142-
+ receiverBlockPosition.getY() + ","
143-
+ receiverBlockPosition.getZ() + "]"
144-
+ " - blocks tested: " + enumerationCounter + "/" + obstructionBlocks.size());
145-
cancelled = true;
146-
break;
147140
}
141+
});
142+
143+
if (timer + 500 <= System.currentTimeMillis()) {
144+
log.warn("Dist measure timeout - " + (System.currentTimeMillis() - timer) + "ms [" + senderBlockPosition.getX() + ","
145+
+ senderBlockPosition.getY() + ","
146+
+ senderBlockPosition.getZ() + "] and ["
147+
+ receiverBlockPosition.getX() + ","
148+
+ receiverBlockPosition.getY() + ","
149+
+ receiverBlockPosition.getZ() + "]"
150+
+ " - blocks tested: " + signalDegradationCumulative.size() + "/" + obstructionBlocks.size());
151+
cancelled = true;
148152
}
149153

150-
for (BlockPos currentBlockPos : unloadedBlocks) {
151-
var currentBlockState = level.getBlockState(currentBlockPos);
152-
if (!currentBlockState.isAir()) {
153-
var explosionResistance = currentBlockState.getBlock().getExplosionResistance();
154-
if (explosionResistance >= 100)
155-
explosionResistance /= 4;
156-
signalDegradation += Math.sqrt(explosionResistance) * 10.0 * diagonalCompensation;
157-
}
158-
159-
if (signalDegradation > receiveRange) {
160-
break;
161-
}
162-
enumerationCounter++;
163-
if (timer + 500 <= System.currentTimeMillis()) {
164-
log.warn("Distance measure timeout in unloaded blocks between [" + senderBlockPosition.getX() + ","
165-
+ senderBlockPosition.getY() + ","
166-
+ senderBlockPosition.getZ() + "] and ["
167-
+ receiverBlockPosition.getX() + ","
168-
+ receiverBlockPosition.getY() + ","
169-
+ receiverBlockPosition.getZ() + "]"
170-
+ " - blocks tested: " + enumerationCounter + "/" + unloadedBlocks.size());
171-
cancelled = true;
172-
break;
173-
}
154+
for (var key : signalDegradationCumulative.keySet()) {
155+
signalDegradation += signalDegradationCumulative.get(key);
174156
}
175157

176158
if (cancelled) {
177159
// Extrapolating the signal degradation for the rest of the path
178-
signalDegradation = ((signalDegradation - distance) / (double) enumerationCounter / obstructionBlocks.size()) + distance;
160+
signalDegradation = ((signalDegradation - distance) / (double) signalDegradationCumulative.size() / obstructionBlocks.size()) + distance;
179161
} else {
180162
((WirelessModemPeripheral)sender).addCachedSignalDegradation(receiverBlockPosition, signalDegradation);
181163
}

0 commit comments

Comments
 (0)