Timings: be more intelligent about shortening timer names

non-pocketmine classes may reuse the names of pocketmine core classes. We don't want timers to get erroneously reused in this case.
This commit is contained in:
Dylan K. Taylor 2023-04-14 18:24:53 +01:00
parent bf7975da57
commit 6c6f686f8e
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -250,29 +250,42 @@ abstract class Timings{
return self::$pluginTaskTimingMap[$name]; return self::$pluginTaskTimingMap[$name];
} }
/**
* @phpstan-template T of object
* @phpstan-param class-string<T> $class
*/
private static function shortenCoreClassName(string $class, string $prefix) : string{
if(str_starts_with($class, $prefix)){
return (new \ReflectionClass($class))->getShortName();
}
return $class;
}
public static function getEntityTimings(Entity $entity) : TimingsHandler{ public static function getEntityTimings(Entity $entity) : TimingsHandler{
$reflect = new \ReflectionClass($entity); if(!isset(self::$entityTypeTimingMap[$entity::class])){
$entityType = $reflect->getShortName(); if($entity instanceof Player){
if(!isset(self::$entityTypeTimingMap[$entityType])){ //the timings viewer calculates average player count by looking at this timer, so we need to ensure it has
//the timings viewer calculates average player count by looking at this timer, so we need to ensure it has //a name it can identify. However, we also want to make it obvious if this is a custom Player class.
//a name it can identify. However, we also want to make it obvious if this is a custom Player class. $displayName = $entity::class !== Player::class ? "Player (" . $entity::class . ")" : "Player";
$displayName = $entityType; }else{
if($entity instanceof Player && $reflect->getName() !== Player::class){ $displayName = self::shortenCoreClassName($entity::class, "pocketmine\\entity\\");
$displayName = "Player (" . $reflect->getName() . ")";
} }
self::$entityTypeTimingMap[$entityType] = new TimingsHandler("Entity Tick - " . $displayName, self::$tickEntity, group: self::GROUP_BREAKDOWN); self::$entityTypeTimingMap[$entity::class] = new TimingsHandler("Entity Tick - " . $displayName, self::$tickEntity, group: self::GROUP_BREAKDOWN);
} }
return self::$entityTypeTimingMap[$entityType]; return self::$entityTypeTimingMap[$entity::class];
} }
public static function getTileEntityTimings(Tile $tile) : TimingsHandler{ public static function getTileEntityTimings(Tile $tile) : TimingsHandler{
$tileType = (new \ReflectionClass($tile))->getShortName(); if(!isset(self::$tileEntityTypeTimingMap[$tile::class])){
if(!isset(self::$tileEntityTypeTimingMap[$tileType])){ self::$tileEntityTypeTimingMap[$tile::class] = new TimingsHandler(
self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler("Block Entity Tick - " . $tileType, self::$tickTileEntity, group: self::GROUP_BREAKDOWN); "Block Entity Tick - " . self::shortenCoreClassName($tile::class, "pocketmine\\block\\tile\\"),
self::$tickTileEntity,
group: self::GROUP_BREAKDOWN
);
} }
return self::$tileEntityTypeTimingMap[$tileType]; return self::$tileEntityTypeTimingMap[$tile::class];
} }
public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{
@ -318,12 +331,7 @@ abstract class Timings{
public static function getEventTimings(Event $event) : TimingsHandler{ public static function getEventTimings(Event $event) : TimingsHandler{
$eventClass = get_class($event); $eventClass = get_class($event);
if(!isset(self::$events[$eventClass])){ if(!isset(self::$events[$eventClass])){
if(str_starts_with($eventClass, "pocketmine\\event\\")){ self::$events[$eventClass] = new TimingsHandler(self::shortenCoreClassName($eventClass, "pocketmine\\event\\"), group: "Events");
$name = (new \ReflectionClass($event))->getShortName();
}else{
$name = $eventClass;
}
self::$events[$eventClass] = new TimingsHandler($name, group: "Events");
} }
return self::$events[$eventClass]; return self::$events[$eventClass];