Performance improvments
Add the performance improvments used during the ZeratoR Trackmania Cup: - Refresh the Map Ranking each 2 second using a variable to store as a cache the Current Ranking
This commit is contained in:
		@@ -43,7 +43,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
	 * Constants
 | 
			
		||||
	 */
 | 
			
		||||
	const ID                                  = 7;
 | 
			
		||||
	const VERSION                             = 0.82;
 | 
			
		||||
	const VERSION                             = 0.83;
 | 
			
		||||
	const NAME                                = 'Local Records Plugin';
 | 
			
		||||
	const AUTHOR                              = 'MCTeam';
 | 
			
		||||
	const MLID_RECORDS                        = 'ml_local_records';
 | 
			
		||||
@@ -78,6 +78,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
	private $updateManialink = false;
 | 
			
		||||
	private $checkpoints     = array();
 | 
			
		||||
	private $scriptName      = 'TimeAttack';
 | 
			
		||||
	private $mapranking      = array();
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @see \ManiaControl\Plugins\Plugin::prepare()
 | 
			
		||||
@@ -160,7 +161,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MULTILAP_SAVE_SINGLE, false);
 | 
			
		||||
 | 
			
		||||
		// Callbacks
 | 
			
		||||
		$this->maniaControl->getTimerManager()->registerTimerListening($this, 'handle1Second', 1000);
 | 
			
		||||
		$this->maniaControl->getTimerManager()->registerTimerListening($this, 'handle2Seconds', 2000);
 | 
			
		||||
		$this->maniaControl->getTimerManager()->registerTimerListening($this, 'handle1Minute', 60000);
 | 
			
		||||
 | 
			
		||||
		$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERINIT, $this, 'handleAfterInit');
 | 
			
		||||
@@ -226,21 +227,23 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
	 * @internal
 | 
			
		||||
	 */
 | 
			
		||||
	public function handleAfterInit() {
 | 
			
		||||
		$this->updateMapRanking();
 | 
			
		||||
		$this->updateManialink = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Handle 1 Second Callback
 | 
			
		||||
	 * Handle 2 Seconds Callback
 | 
			
		||||
	 *
 | 
			
		||||
	 * @internal
 | 
			
		||||
	 */
 | 
			
		||||
	public function handle1Second() {
 | 
			
		||||
	public function handle2Seconds() {
 | 
			
		||||
		if (!$this->updateManialink) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$this->updateManialink = false;
 | 
			
		||||
		if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_ENABLE)) {
 | 
			
		||||
			$this->updateMapRanking();
 | 
			
		||||
			$this->sendWidgetManiaLink();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -276,7 +279,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
		$quadStyle          = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadStyle();
 | 
			
		||||
		$quadSubstyle       = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadSubstyle();
 | 
			
		||||
 | 
			
		||||
		$records = $this->getLocalRecords($map, 1000); //TODO limit setting
 | 
			
		||||
		$records = $this->mapranking;
 | 
			
		||||
		if (!is_array($records)) {
 | 
			
		||||
			Logger::logError("Couldn't fetch player records.");
 | 
			
		||||
			return null;
 | 
			
		||||
@@ -351,7 +354,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
				$playersWithoutRecord[] = $player;
 | 
			
		||||
				$sendManiaLink          = false;
 | 
			
		||||
			} else {
 | 
			
		||||
				if ($record = $this->getLocalRecord($map, $player)) {
 | 
			
		||||
				if ($record = $this->getLocalRecordCache($map, $player)) {
 | 
			
		||||
					$record->nickname = $player->nickname;
 | 
			
		||||
					$recordFrame      = $preGeneratedRecordsFrameWithRecord;
 | 
			
		||||
					$listFrame->addChild($recordFrame);
 | 
			
		||||
@@ -401,21 +404,23 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
	public function getLocalRecords(Map $map, $limit = -1) {
 | 
			
		||||
		$mysqli = $this->maniaControl->getDatabase()->getMysqli();
 | 
			
		||||
		$limit  = ($limit > 0 ? 'LIMIT ' . $limit : '');
 | 
			
		||||
		$query  = "SELECT * FROM (
 | 
			
		||||
					SELECT recs.*, @rank := @rank + 1 as `rank` FROM `" . self::TABLE_RECORDS . "` recs, (SELECT @rank := 0) ra
 | 
			
		||||
		$query  = "SELECT * FROM  `" . self::TABLE_RECORDS . "` recs
 | 
			
		||||
					LEFT JOIN `" . PlayerManager::TABLE_PLAYERS . "` players
 | 
			
		||||
					ON recs.`playerIndex` = players.`index`
 | 
			
		||||
					WHERE recs.`mapIndex` = {$map->index}
 | 
			
		||||
					ORDER BY recs.`time` ASC
 | 
			
		||||
					{$limit}) records
 | 
			
		||||
				LEFT JOIN `" . PlayerManager::TABLE_PLAYERS . "` players
 | 
			
		||||
				ON records.`playerIndex` = players.`index`;";
 | 
			
		||||
					{$limit};";
 | 
			
		||||
		$result = $mysqli->query($query);
 | 
			
		||||
		if ($mysqli->error) {
 | 
			
		||||
			trigger_error($mysqli->error);
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		$records = array();
 | 
			
		||||
		$rank    = 1;
 | 
			
		||||
		while ($record = $result->fetch_object()) {
 | 
			
		||||
			$record->{"rank"} = "$rank";
 | 
			
		||||
			array_push($records, $record);
 | 
			
		||||
			$rank++;
 | 
			
		||||
		}
 | 
			
		||||
		$result->free();
 | 
			
		||||
		return $records;
 | 
			
		||||
@@ -664,6 +669,30 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
		return $record;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Retrieve the local record for the given map and login using the Cache
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param Player $player
 | 
			
		||||
	 * @param Map    $map
 | 
			
		||||
	 * @return mixed
 | 
			
		||||
	 * @api
 | 
			
		||||
	 */
 | 
			
		||||
	public function getLocalRecordCache(Map $map, Player $player) {
 | 
			
		||||
 | 
			
		||||
		$searchedValue = $player->index;
 | 
			
		||||
		$record        = array_filter($this->mapranking, function ($e) use ($searchedValue) {
 | 
			
		||||
			return $e->index == $searchedValue;
 | 
			
		||||
		});
 | 
			
		||||
		if (isset($record)) {
 | 
			
		||||
			if (isset($record[0])) {
 | 
			
		||||
				$record = $record[0];
 | 
			
		||||
			} else {
 | 
			
		||||
				$record = null;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return $record;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Handle Player Connect Callback
 | 
			
		||||
	 *
 | 
			
		||||
@@ -989,4 +1018,33 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
 | 
			
		||||
		$this->recordWidget->setLineHeight($lineHeight);
 | 
			
		||||
		$this->updateManialink = true;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Update the Map Ranking
 | 
			
		||||
	 */
 | 
			
		||||
	private function updateMapRanking() {
 | 
			
		||||
		$mysqli = $this->maniaControl->getDatabase()->getMysqli();
 | 
			
		||||
		$map    = $this->maniaControl->getMapManager()->getCurrentMap();
 | 
			
		||||
 | 
			
		||||
		$query = "SELECT players.nickname, players.`index`, recs.time, recs.`index`, recs.playerIndex, recs.mapIndex FROM  `" . self::TABLE_RECORDS . "` recs
 | 
			
		||||
				LEFT JOIN `" . PlayerManager::TABLE_PLAYERS . "` players
 | 
			
		||||
				ON recs.`playerIndex` = players.`index`
 | 
			
		||||
				WHERE recs.`mapIndex` = {$map->index}
 | 
			
		||||
				ORDER BY recs.`time` ASC;";
 | 
			
		||||
 | 
			
		||||
		$result = $mysqli->query($query);
 | 
			
		||||
		if ($mysqli->error) {
 | 
			
		||||
			trigger_error($mysqli->error);
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		$this->mapranking = array();
 | 
			
		||||
		$rank             = 1;
 | 
			
		||||
		while ($record = $result->fetch_object()) {
 | 
			
		||||
 | 
			
		||||
			$record->{"rank"} = "$rank";
 | 
			
		||||
			array_push($this->mapranking, $record);
 | 
			
		||||
			$rank++;
 | 
			
		||||
		}
 | 
			
		||||
		$result->free();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user