Skip to content

Commit 1b1a438

Browse files
committed
optimise field path cache
1 parent e9acbae commit 1b1a438

File tree

3 files changed

+22
-17
lines changed

3 files changed

+22
-17
lines changed

pkg/demoinfocs/sendtables2/entity.go

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,9 @@ func (p *Parser) FilterEntity(fb func(*Entity) bool) []*Entity {
424424
}
425425

426426
func (e *Entity) readFields(r *reader, paths *[]*fieldPath) {
427-
readFieldPaths(r, paths)
427+
n := readFieldPaths(r, paths)
428428

429-
for _, fp := range *paths {
429+
for _, fp := range (*paths)[:n] {
430430
f := e.class.serializer.getFieldForFieldPath(fp, 0)
431431
name := e.class.getNameForFieldPath(fp)
432432
decoder, base := e.class.serializer.getDecoderForFieldPath2(fp, 0)
@@ -462,8 +462,6 @@ func (e *Entity) readFields(r *reader, paths *[]*fieldPath) {
462462
S2: true,
463463
})
464464
}
465-
466-
fp.release()
467465
}
468466
}
469467

@@ -491,10 +489,7 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
491489
op st.EntityOp
492490
}
493491

494-
var (
495-
tuples []tuple
496-
paths = make([]*fieldPath, 0)
497-
)
492+
var tuples []tuple
498493

499494
for ; updates > 0; updates-- {
500495
var (
@@ -530,12 +525,10 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
530525

531526
if baseline != nil {
532527
// POV demos are missing some baselines?
533-
e.readFields(newReader(baseline), &paths)
534-
paths = paths[:0]
528+
e.readFields(newReader(baseline), &p.pathCache)
535529
}
536530

537-
e.readFields(r, &paths)
538-
paths = paths[:0]
531+
e.readFields(r, &p.pathCache)
539532

540533
// Fire created-handlers so update-handlers can be registered
541534
for _, h := range class.createdHandlers {
@@ -559,8 +552,7 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
559552
op |= st.EntityOpEntered
560553
}
561554

562-
e.readFields(r, &paths)
563-
paths = paths[:0]
555+
e.readFields(r, &p.pathCache)
564556
}
565557
} else {
566558
e = p.entities[index]

pkg/demoinfocs/sendtables2/field_path.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,10 +306,10 @@ func (fp *fieldPath) release() {
306306
}
307307

308308
// readFieldPaths reads a new slice of fieldPath values from the given reader
309-
func readFieldPaths(r *reader, paths *[]*fieldPath) {
309+
func readFieldPaths(r *reader, paths *[]*fieldPath) int {
310310
fp := newFieldPath()
311-
312311
node := huffTree
312+
i := 0
313313

314314
for !fp.done {
315315
var next huffmanTree
@@ -326,14 +326,26 @@ func readFieldPaths(r *reader, paths *[]*fieldPath) {
326326
fieldPathTable[next.Value()].fn(r, fp)
327327

328328
if !fp.done {
329-
*paths = append(*paths, fp.copy())
329+
if len(*paths) <= i {
330+
*paths = append(*paths, fp.copy())
331+
} else {
332+
x := (*paths)[i]
333+
x.last = fp.last
334+
x.done = fp.done
335+
336+
copy(x.path, fp.path)
337+
}
338+
339+
i++
330340
}
331341
} else {
332342
node = next
333343
}
334344
}
335345

336346
fp.release()
347+
348+
return i
337349
}
338350

339351
// newHuffmanTree creates a new huffmanTree from the field path table

pkg/demoinfocs/sendtables2/parser.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type Parser struct {
6060
entityFullPackets int
6161
entities map[int32]*Entity
6262
entityHandlers []st.EntityHandler
63+
pathCache []*fieldPath
6364
}
6465

6566
func (p *Parser) ReadEnterPVS(r *bit.BitReader, index int, entities map[int]st.Entity, slot int) st.Entity {

0 commit comments

Comments
 (0)