todo: stuff
This commit is contained in:
32
TODO.md
32
TODO.md
@@ -1,3 +1,35 @@
|
|||||||
|
# Networking
|
||||||
|
> All that is left is optimization
|
||||||
|
|
||||||
|
## ERADICATE DIRECT
|
||||||
|
|
||||||
|
We only need NONE, SOME and NETWORK.
|
||||||
|
|
||||||
|
## Optimize compute and memory
|
||||||
|
> OC does this too
|
||||||
|
|
||||||
|
Optimize both *time* and *memory* using graph theory.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
It obviously must be fast and memory-efficient, and respect the current semantics.
|
||||||
|
|
||||||
|
The current idea is to make NETWORK style nodes the only ones with a cache,
|
||||||
|
and to instead appoint a connection that is also a NETWORK node, if any, as
|
||||||
|
the one source of truth, or steal the source. This means only one node
|
||||||
|
in a local network gets to actually compute the graph layout.
|
||||||
|
Complications can happen when merges happen, the idea is to pick one source of truth
|
||||||
|
then as well.
|
||||||
|
|
||||||
|
Also, `onNodeAdded` and `onNodeRemoved` should also be called when a reachable node is added/removed.
|
||||||
|
This is for perf. We only care about nodes being added/removed then.
|
||||||
|
This can be done by broadcasting to all of their *connections*, to circumvent the NONE/SOME/NETWORK asymmetric reachability sets.
|
||||||
|
|
||||||
|
## Optimize power balancing
|
||||||
|
|
||||||
|
Use a smarter algorithm to prevent N storage nodes from iterating N^2 nodes each tick
|
||||||
|
to balance power.
|
||||||
|
|
||||||
# Computation
|
# Computation
|
||||||
> Pretty important for a computer mod
|
> Pretty important for a computer mod
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ abstract class DeviceBlockEntity(type: BlockEntityType<*>, pos: BlockPos, state:
|
|||||||
val connetionsInDir = MutableList<DeviceNode?>(Direction.entries.size) { null }
|
val connetionsInDir = MutableList<DeviceNode?>(Direction.entries.size) { null }
|
||||||
var alreadySetup = false
|
var alreadySetup = false
|
||||||
var receivedServerState = false
|
var receivedServerState = false
|
||||||
|
var connectionsAreDirty = false
|
||||||
|
|
||||||
abstract fun getDeviceNodes(): List<DeviceNode>
|
abstract fun getDeviceNodes(): List<DeviceNode>
|
||||||
|
|
||||||
@@ -93,6 +94,10 @@ abstract class DeviceBlockEntity(type: BlockEntityType<*>, pos: BlockPos, state:
|
|||||||
if(!alreadySetup) {
|
if(!alreadySetup) {
|
||||||
initNetworking()
|
initNetworking()
|
||||||
}
|
}
|
||||||
|
if(connectionsAreDirty) {
|
||||||
|
connectionsAreDirty = false
|
||||||
|
Direction.entries.forEach { handleConnectionsFor(it) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun sendCommitsToClient(level: Level) {
|
open fun sendCommitsToClient(level: Level) {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ class CableEntity(pos: BlockPos, state: BlockState) : SingleDeviceBlockEntity(Bl
|
|||||||
for (dir in Direction.entries) {
|
for (dir in Direction.entries) {
|
||||||
val ent = level!!.getBlockEntity(blockPos.relative(dir))
|
val ent = level!!.getBlockEntity(blockPos.relative(dir))
|
||||||
level!!.setBlockAndUpdate(blockPos, blockState.setValue(getPropByDirection(dir), CableBlock.shouldConnect(blockPos, blockPos.relative(dir), level!!)))
|
level!!.setBlockAndUpdate(blockPos, blockState.setValue(getPropByDirection(dir), CableBlock.shouldConnect(blockPos, blockPos.relative(dir), level!!)))
|
||||||
|
if(ent is CableEntity) {
|
||||||
|
ent.connectionsAreDirty = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user