name = $name; if($parent instanceof TimingsHandler){ $this->parent = $parent; } self::$HANDLERS[spl_object_hash($this)] = $this; } public static function printTimings($fp){ fwrite($fp, "Minecraft" . PHP_EOL); foreach(self::$HANDLERS as $timings){ $time = $timings->totalTime; $count = $timings->count; if($count === 0){ continue; } $avg = $time / $count; fwrite($fp, " " . $timings->name . " Time: " . round($time * 1000000000) . " Count: " . $count . " Avg: " . round($avg * 1000000000) . " Violations: " . $timings->violations . PHP_EOL); } fwrite($fp, "# Version " . Server::getInstance()->getVersion() . PHP_EOL); fwrite($fp, "# " . Server::getInstance()->getName() . " " . Server::getInstance()->getPocketMineVersion() . PHP_EOL); $entities = 0; $livingEntities = 0; foreach(Server::getInstance()->getLevels() as $level){ $entities += count($level->getEntities()); foreach($level->getEntities() as $e){ if($e instanceof Living){ ++$livingEntities; } } } fwrite($fp, "# Entities " . $entities . PHP_EOL); fwrite($fp, "# LivingEntities " . $livingEntities . PHP_EOL); } public static function reload(){ if(Server::getInstance()->getPluginManager()->useTimings()){ foreach(self::$HANDLERS as $timings){ $timings->reset(); } TimingsCommand::$timingStart = microtime(true); } } public static function tick(){ if(PluginManager::$useTimings){ foreach(self::$HANDLERS as $timings){ if($timings->curTickTotal > 0.05){ $timings->violations += round($timings->curTickTotal / 0.05); } $timings->curTickTotal = 0; $timings->timingDepth = 0; } } } public function startTiming(){ if(PluginManager::$useTimings and ++$this->timingDepth === 1){ $this->start = microtime(true); if($this->parent instanceof TimingsHandler and ++$this->parent->timingDepth === 1){ $this->parent->start = $this->start; } } } public function stopTiming(){ if(PluginManager::$useTimings){ if(--$this->timingDepth !== 0 or $this->start === 0){ return; } $diff = microtime(true) - $this->start; $this->totalTime += $diff; $this->curTickTotal += $diff; $this->count++; $this->start = 0; if($this->parent instanceof TimingsHandler){ $this->parent->stopTiming(); } } } public function reset(){ $this->count = 0; $this->violations = 0; $this->curTickTotal = 0; $this->totalTime = 0; $this->start = 0; $this->timingDepth = 0; } public function remove(){ unset(self::$HANDLERS[spl_object_hash($this)]); } }