From 7337068d86f02b3c47423c057dbdfeea0684f875 Mon Sep 17 00:00:00 2001 From: adman Date: Thu, 26 Mar 2026 23:34:30 +0100 Subject: [PATCH] more performance --- event/event_bus.go | 5 +++++ proto/connection.go | 16 +++++++++++----- proto/packet_lookup.go | 24 ++++++++++++++++++------ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/event/event_bus.go b/event/event_bus.go index ce45db9..4da7704 100644 --- a/event/event_bus.go +++ b/event/event_bus.go @@ -212,6 +212,11 @@ func (l *Loop) ContextDoneListener() (chSending <-chan any) { return ch } +func (l *Loop) IsTypeRegistered(t reflect.Type) bool { + _, ok := l.HandlerFunctions[t] + return ok +} + func (l *Loop) StartLoop() (err error) { _ = *l // exit early on nil loop l.RegisterEventSource(l.ContextDoneListener()) diff --git a/proto/connection.go b/proto/connection.go index 34385fb..d2c8fad 100644 --- a/proto/connection.go +++ b/proto/connection.go @@ -27,6 +27,7 @@ var ( WrongDirectionErr = errors.New("wrong direction") CantTranslateErr = errors.New("cant translate packet") PacketDoesntExistInFutureVersionErr = errors.New("packet doesnt exist in future version") + NoHandlerRegisteredErr = errors.New("no handler registered") ) // LoginTick is used as a subsite for the old event system because it is very useful in login contexts @@ -54,11 +55,12 @@ func (u *UnCodablePacket) Decode(r io.Reader) (err error) { type Conn struct { RawConn *event.Loop - state proto_base.State - stateMutex sync.RWMutex - Actor proto_base.Actor - Version string - ProtocolVersion int32 + state proto_base.State + stateMutex sync.RWMutex + Actor proto_base.Actor + Version string + ProtocolVersion int32 + DecodeEvenIfUnused bool sendTickAlways bool } @@ -219,6 +221,10 @@ func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) { packet = &UnCodablePacket{Err: BadPacketIdErr, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} return } + if !c.DecodeEvenIfUnused && !c.IsTypeRegistered(reflect.TypeOf(packet)) { + packet = &UnCodablePacket{Err: NoHandlerRegisteredErr, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} + return + } err = packet.Decode(b) if err != nil { packet = &UnCodablePacket{Err: err, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} diff --git a/proto/packet_lookup.go b/proto/packet_lookup.go index 14db6e7..a29682d 100644 --- a/proto/packet_lookup.go +++ b/proto/packet_lookup.go @@ -7,15 +7,27 @@ import ( "github.com/admin-else/strom/proto_generated" ) -// I know this is in-performant and i dont care until it becomes a problem for somebody it will stay like this and it is pretty easy to make caches or similar to speed this up so yeah +type PidEtc struct { + Direction proto_base.Direction + State proto_base.State + PacketId int32 + ProtocolVersion int32 +} + +var pidMap = make(map[PidEtc]*proto_base.PacketInfo) + +func init() { + for _, pin := range proto_generated.Packets { + pidMap[PidEtc{pin.Direction, pin.State, pin.PacketId, pin.ProtocolVersion}] = &pin + } +} func LookUpTypeByPacketInfo(direction proto_base.Direction, state proto_base.State, pid, version int32) (p proto_base.PacketInfo, ok bool) { - for _, pin := range proto_generated.Packets { - if pin.Direction != direction || pin.State != state || pin.ProtocolVersion != version || pin.PacketId != pid { - continue - } - return pin, true + pP, ok := pidMap[PidEtc{direction, state, pid, version}] + if !ok { + return } + p = *pP return }