Optimize PacketHandler performance

This commit is contained in:
Tnze
2021-12-24 15:40:39 +08:00
parent dccbf7ce46
commit 494a52320d
7 changed files with 191 additions and 69 deletions

View File

@ -25,16 +25,25 @@ type GamePlay interface {
type Game struct {
Dim Level
components []Component
handlers map[int32][]*PacketHandler
eid int32
}
type Component interface {
Init(g *Game)
Run(ctx context.Context)
AddPlayer(p *Player)
RemovePlayer(p *Player)
}
type PacketHandler struct {
ID int32
F packetHandlerFunc
}
type packetHandlerFunc func(player *Player, packet Packet757) error
//go:embed DimensionCodec.snbt
var dimensionCodecSNBT string
@ -42,10 +51,19 @@ var dimensionCodecSNBT string
var dimensionSNBT string
func NewGame(dim Level, components ...Component) *Game {
return &Game{
g := &Game{
Dim: dim,
components: components,
handlers: make(map[int32][]*PacketHandler),
}
for _, v := range components {
v.Init(g)
}
return g
}
func (g *Game) AddHandler(ph *PacketHandler) {
g.handlers[ph.ID] = append(g.handlers[ph.ID], ph)
}
func (g *Game) Run(ctx context.Context) {
@ -67,7 +85,6 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net
UUID: id,
EntityID: g.newEID(),
Gamemode: 1,
handlers: make(map[int32][]packetHandlerFunc),
errChan: make(chan error, 1),
}
dimInfo := g.Dim.Info()
@ -107,13 +124,11 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net
var packet pk.Packet
for {
err := p.ReadPacket(&packet)
if err != nil {
if err := p.ReadPacket(&packet); err != nil {
return
}
for _, ph := range p.handlers[packet.ID] {
err = ph(Packet757(packet))
if err != nil {
for _, ph := range g.handlers[packet.ID] {
if err := ph.F(p, Packet757(packet)); err != nil {
return
}
}