Skip to content

Commit dfd79dc

Browse files
committed
cs2 perf improvements
1 parent 7be9c51 commit dfd79dc

File tree

3 files changed

+35
-23
lines changed

3 files changed

+35
-23
lines changed

pkg/demoinfocs/sendtables2/entity.go

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type Entity struct {
2525
onCreateFinished []func()
2626
onDestroy []func()
2727
updateHandlers map[string][]st.PropertyUpdateHandler
28+
propCache map[string]st.Property
2829
}
2930

3031
func (e *Entity) ServerClass() st.ServerClass {
@@ -126,15 +127,19 @@ func (p property) Bind(variable any, t st.PropertyValueType) {
126127
}
127128

128129
func (e *Entity) Property(name string) st.Property {
129-
ok := e.class.serializer.checkFieldName(name)
130-
if !ok {
131-
return nil
132-
}
130+
if e.propCache[name] == nil {
131+
ok := e.class.serializer.checkFieldName(name)
132+
if !ok {
133+
return nil
134+
}
133135

134-
return property{
135-
entity: e,
136-
name: name,
136+
e.propCache[name] = property{
137+
entity: e,
138+
name: name,
139+
}
137140
}
141+
142+
return e.propCache[name]
138143
}
139144

140145
func (e *Entity) BindProperty(prop string, variable any, t st.PropertyValueType) {
@@ -258,6 +263,7 @@ func newEntity(index, serial int32, class *class) *Entity {
258263
onCreateFinished: nil,
259264
onDestroy: nil,
260265
updateHandlers: make(map[string][]st.PropertyUpdateHandler),
266+
propCache: map[string]st.Property{},
261267
}
262268
}
263269

@@ -406,10 +412,10 @@ func (p *Parser) FilterEntity(fb func(*Entity) bool) []*Entity {
406412
return entities
407413
}
408414

409-
func (e *Entity) readFields(r *reader) {
410-
fps := readFieldPaths(r)
415+
func (e *Entity) readFields(r *reader, paths *[]*fieldPath) {
416+
readFieldPaths(r, paths)
411417

412-
for _, fp := range fps {
418+
for _, fp := range *paths {
413419
decoder := e.class.serializer.getDecoderForFieldPath(fp, 0)
414420

415421
val := decoder(r)
@@ -456,7 +462,10 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
456462
op st.EntityOp
457463
}
458464

459-
var tuples []tuple
465+
var (
466+
tuples []tuple
467+
paths = make([]*fieldPath, 0)
468+
)
460469

461470
for ; updates > 0; updates-- {
462471
var (
@@ -487,8 +496,11 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
487496
e = newEntity(index, serial, class)
488497
p.entities[index] = e
489498

490-
e.readFields(newReader(baseline))
491-
e.readFields(r)
499+
e.readFields(newReader(baseline), &paths)
500+
paths = paths[:0]
501+
502+
e.readFields(r, &paths)
503+
paths = paths[:0]
492504

493505
// Fire created-handlers so update-handlers can be registered
494506
for _, h := range class.createdHandlers {
@@ -512,7 +524,8 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
512524
op |= st.EntityOpEntered
513525
}
514526

515-
e.readFields(r)
527+
e.readFields(r, &paths)
528+
paths = paths[:0]
516529
}
517530
} else {
518531
e = p.entities[index]

pkg/demoinfocs/sendtables2/field_path.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,36 +306,34 @@ func (fp *fieldPath) release() {
306306
}
307307

308308
// readFieldPaths reads a new slice of fieldPath values from the given reader
309-
func readFieldPaths(r *reader) []*fieldPath {
309+
func readFieldPaths(r *reader, paths *[]*fieldPath) {
310310
fp := newFieldPath()
311311

312312
node := huffTree
313313

314-
paths := []*fieldPath{}
315-
316314
for !fp.done {
317315
var next huffmanTree
318316

319-
if r.readBits(1) == 1 {
317+
if r.readBoolean() {
320318
next = node.Right()
321319
} else {
322320
next = node.Left()
323321
}
324322

325323
if next.IsLeaf() {
326324
node = huffTree
325+
327326
fieldPathTable[next.Value()].fn(r, fp)
327+
328328
if !fp.done {
329-
paths = append(paths, fp.copy())
329+
*paths = append(*paths, fp.copy())
330330
}
331331
} else {
332332
node = next
333333
}
334334
}
335335

336336
fp.release()
337-
338-
return paths
339337
}
340338

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

pkg/demoinfocs/sendtables2/quantizedfloat.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ func (qfd *quantizedFloatDecoder) validateFlags() {
6464
}
6565
}
6666

67+
var qFloatMultipliers = []float32{0.9999, 0.99, 0.9, 0.8, 0.7}
68+
6769
// Assign multipliers
6870
func (qfd *quantizedFloatDecoder) assignMultipliers(steps uint32) {
6971
qfd.HighLowMul = 0.0
@@ -85,9 +87,8 @@ func (qfd *quantizedFloatDecoder) assignMultipliers(steps uint32) {
8587

8688
// Adjust precision
8789
if (HighMul*Range > float32(High)) || (float64(HighMul*Range) > float64(High)) {
88-
multipliers := []float32{0.9999, 0.99, 0.9, 0.8, 0.7}
8990

90-
for _, mult := range multipliers {
91+
for _, mult := range qFloatMultipliers {
9192
HighMul = float32(High) / Range * mult
9293

9394
if (HighMul*Range > float32(High)) || (float64(HighMul*Range) > float64(High)) {

0 commit comments

Comments
 (0)