gpuprofiler.py (4562B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\trinity\gpuprofiler.py 2 import locale 3 import weakref 4 import blue 5 import trinity 6 7 def _FormatGpuTime(time): 8 if time == 0: 9 return '0' 10 elif time > 1: 11 return '%.1fs' % time 12 elif time > 0.001: 13 return '%.1fms' % (time * 1000) 14 else: 15 return '%.1f\xb5s' % (time * 1000000) 16 17 18 def _ToString(name, value): 19 if name == 'GPU Time': 20 return _FormatGpuTime(value) 21 if isinstance(value, (int, long)): 22 return locale.format('%d', value, grouping=True) 23 return str(value) 24 25 26 class Tr2GpuProfilerIndexes(object): 27 OWNER = 0 28 MESSAGE = 1 29 STATS = 2 30 CHILDREN = 3 31 32 33 class RawZone(object): 34 35 def __init__(self, data, order = None): 36 self.owner = data[Tr2GpuProfilerIndexes.OWNER] 37 self.message = data[Tr2GpuProfilerIndexes.MESSAGE] 38 self.stats = data[Tr2GpuProfilerIndexes.STATS] 39 if order is None: 40 self.order = 1 41 order = [2] 42 else: 43 self.order = order[0] 44 order[0] += 1 45 self.children = [ RawZone(x, order) for x in data[Tr2GpuProfilerIndexes.CHILDREN] ] 46 47 48 class BaseProfileNode(object): 49 50 def __init__(self): 51 self.owner = None 52 self.name = '' 53 self.stats = {} 54 self.statText = {} 55 self.parent = None 56 self.children = [] 57 58 def AddChild(self, child): 59 self.children.append(child) 60 child.parent = weakref.ref(self) 61 62 def AggregateResults(self): 63 for each in self.children: 64 each.AggregateResults() 65 66 if not self.stats: 67 for each in self.children: 68 for k, v in each.stats.items(): 69 self.stats[k] = self.stats.get(k, 0) + v 70 71 self._PopulateStatText() 72 73 def GetOrder(self): 74 return '' 75 76 def _PopulateStatText(self): 77 self.statText = {k:_ToString(k, v) for k, v in self.stats.items()} 78 79 80 def _GetZoneName(zone): 81 if isinstance(zone.owner, trinity.Tr2Effect) and zone.owner.effectResource: 82 return zone.owner.effectResource.path.rsplit('/', 1)[-1] 83 elif getattr(zone.owner, 'name', ''): 84 return '%s %s' % (type(zone.owner).__name__, zone.owner.name) 85 elif zone.owner is None: 86 return zone.message or 'Unnamed' 87 else: 88 return type(zone.owner).__name__ 89 90 91 class ZoneNode(BaseProfileNode): 92 93 def __init__(self, item): 94 super(ZoneNode, self).__init__() 95 self.zone = item 96 self.owner = item.owner 97 self.name = _GetZoneName(item) 98 self.stats = item.stats 99 self._PopulateStatText() 100 101 def GetOrder(self): 102 return self.zone.order 103 104 105 class ObjectReferenceNode(BaseProfileNode): 106 107 def __init__(self, obj, label): 108 super(ObjectReferenceNode, self).__init__() 109 self.owner = obj 110 self.name = label 111 112 113 def GetStatKeys(node): 114 if node.stats: 115 return node.stats.keys() 116 for each in node.children: 117 r = GetStatKeys(each) 118 if r: 119 return r 120 121 return [] 122 123 124 def BuildZoneTree(item): 125 zone = ZoneNode(item) 126 for each in item.children: 127 zone.AddChild(BuildZoneTree(each)) 128 129 return zone 130 131 132 def _RecordRoute(start, route, label): 133 if not route: 134 return start 135 first = route[0] 136 for each in start.children: 137 if each.owner == first[0]: 138 return _RecordRoute(each, route[1:], first[2] if first[1] == 0 else '') 139 140 if not label: 141 label = getattr(first[0], 'name', '') or type(first[0]).__name__ 142 node = ObjectReferenceNode(first[0], label) 143 node.parent = start 144 start.AddChild(node) 145 return _RecordRoute(node, route[1:], first[2] if first[1] == 0 else '') 146 147 148 def _PopulateObjectTree(root, scenes, node, orphans): 149 owner = node.owner 150 parent = None 151 if owner: 152 for each in scenes: 153 routes = blue.FindRoute(each, owner) 154 if routes: 155 parent = _RecordRoute(root, routes[0] + [(owner, 0, '')], '') 156 break 157 158 if parent: 159 parent.AddChild(ZoneNode(node)) 160 elif not node.children: 161 if not orphans: 162 orphans.append(ObjectReferenceNode(None, 'Orphans')) 163 orphans[0].AddChild(ZoneNode(node)) 164 for each in node.children: 165 _PopulateObjectTree(root, scenes, each, orphans) 166 167 168 def BuildObjectTree(zones, scenes): 169 orphans = [] 170 root = ZoneNode(zones) 171 _PopulateObjectTree(root, scenes, zones, orphans) 172 if orphans: 173 root.AddChild(orphans[0]) 174 return root