-
Notifications
You must be signed in to change notification settings - Fork 0
/
scene.go
96 lines (78 loc) · 2.24 KB
/
scene.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package unitysceneanalysis
import (
"bufio"
"io"
"sort"
"strings"
)
type Scene struct {
Sections []Section
TotalMemory uint64
ObjectSummaries []ObjectSummary
}
type ObjectSummary struct {
Name string
Memory uint64
Count int
}
type ObjectSummarySizeDescending []ObjectSummary
func (a ObjectSummarySizeDescending) Len() int { return len(a) }
func (a ObjectSummarySizeDescending) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ObjectSummarySizeDescending) Less(i, j int) bool { return a[i].Memory > a[j].Memory }
func eatHeader(scanner *bufio.Scanner) {
scanner.Scan()
scanner.Scan()
}
func ReadScene(reader io.Reader) (*Scene, error) {
scene := &Scene{}
workingSummaries := map[string]*ObjectSummary{}
scanner := bufio.NewScanner(reader)
buf := make([]byte, 1024*1024*100)
scanner.Buffer(buf, 1024*1024*100)
eatHeader(scanner)
var section *Section = nil
curLine := 2
for scanner.Scan() {
line := scanner.Text()
curLine++
if strings.HasPrefix(line, "--- !u!") {
if section != nil {
scene.Sections = append(scene.Sections, *section)
}
section = &Section{}
scanner.Scan()
curLine++
section.Name = scanner.Text()
section.Name = section.Name[:len(section.Name)-1]
if _, ok := workingSummaries[section.Name]; !ok {
workingSummaries[section.Name] = &ObjectSummary{
Name: section.Name,
Memory: 0,
Count: 0,
}
}
workingSummaries[section.Name].Count += 1
section.StartingLine = curLine
continue
}
if strings.HasPrefix(line, " m_Script: ") {
section.Info = "Script: " + strings.TrimPrefix(line, " m_Script: ")
}
if strings.HasPrefix(line, " m_SourcePrefab: ") {
section.Info = "Source Prefab: " + strings.TrimPrefix(line, " m_SourcePrefab: ")
}
section.Lines += 1
section.Size += uint64(len(line))
workingSummaries[section.Name].Memory += uint64(len(line))
scene.TotalMemory += uint64(len(line))
}
if section != nil {
scene.Sections = append(scene.Sections, *section)
}
for _, summary := range workingSummaries {
scene.ObjectSummaries = append(scene.ObjectSummaries, *summary)
}
sort.Sort(SectionBySizeDescending(scene.Sections))
sort.Sort(ObjectSummarySizeDescending(scene.ObjectSummaries))
return scene, scanner.Err()
}