NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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