//============================================================================= // NRP_EventLightLoad.js //============================================================================= /*: * @target MV MZ * @plugindesc v1.00 Lightweight event processing. * @author Takeshi Sunagawa (http://newrpg.seesaa.net/) * @url https://newrpg.seesaa.net/article/499543048.html * * @help The following actions will lighten the processing of events * It is effective on maps where a large number of events are placed. * * 1. Stop Draw Out of Screen * Reduces the load by stopping unnecessary * drawing processing for off-screen events. * * 2. Cache Event Running * Cache the process of checking the running status of events, * so that it is executed only once every 1/60th of a second. * This can be especially effective when used in conjunction * with StopSelfMovementWithPlayer.js, etc. * * ------------------------------------------------------------------- * [Usage] * ------------------------------------------------------------------- * Just apply and it will take effect. * * Each feature has been verified to not cause problems * in the author's environment, * but can be turned on or off in case problems arise. * * ------------------------------------------------------------------- * [Terms] * ------------------------------------------------------------------- * There are no restrictions. * Modification, redistribution freedom, commercial availability, * and rights indication are also optional. * The author is not responsible, * but will deal with defects to the extent possible. * * @------------------------------------------------------------------ * @ [Plugin Parameters] * @------------------------------------------------------------------ * * @param StopDrawOutOfScreen * @type boolean * @default true * @desc Stops the drawing process for off-screen events. * * @param OutOfScreenMargin * @parent StopDrawOutOfScreen * @type number * @default 100 * @desc The margin width (in pixels) that is considered off-screen. * * @param CacheEventRunning * @type boolean * @default true * @desc Caches the running status of events and suppresses unnecessary reacquisition processing. */ /*:ja * @target MV MZ * @plugindesc v1.00 イベントの処理を軽量化します。 * @author 砂川赳(http://newrpg.seesaa.net/) * @url https://newrpg.seesaa.net/article/499543048.html * * @help 以下の対応によってイベントの処理を軽量化します。 * 大量のイベントが配置されたマップ上で効果的です。 * * 1.画面外のイベント描画停止 * 画面外のイベントに対する不要な描画処理を * 停止することで負荷を軽減します。 * * 2.起動状況をキャッシュ * イベントの起動状況の確認処理をキャッシュし、 * 1/60秒に一度のみに限定して実行するようにします。 * 特にStopSelfMovementWithPlayer.jsなどとの * 併用時は大きな効果が見込めます。 * * ------------------------------------------------------------------- * ■使用方法 * ------------------------------------------------------------------- * 適用するだけで有効になります。 * * 各機能は作者環境で問題が起きないことを確認していますが、 * 問題が起きた時のためにオンオフできるようにしています。 * * ------------------------------------------------------------------- * ■利用規約 * ------------------------------------------------------------------- * 特に制約はありません。 * 改変、再配布自由、商用可、権利表示も任意です。 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。 * * @------------------------------------------------------------------ * @ プラグインパラメータ * @------------------------------------------------------------------ * * @param StopDrawOutOfScreen * @text 画面外のイベント描画停止 * @type boolean * @default true * @desc 画面外のイベントの描画処理を停止します。 * * @param OutOfScreenMargin * @parent StopDrawOutOfScreen * @text 画面外の余裕幅 * @type number * @default 100 * @desc 画面外と見なす余裕の幅(ピクセル)です。 * 数値分だけ画面外にはみ出していても停止しません。 * * @param CacheEventRunning * @text 起動状況をキャッシュ * @type boolean * @default true * @desc イベントの起動状況をキャッシュし、不要な再取得処理を抑制します。 */ (function() { "use strict"; function toBoolean(str, def) { if (str === true || str === "true") { return true; } else if (str === false || str === "false") { return false; } return def; } function toNumber(str, def) { if (str == undefined || str == "") { return def; } return isNaN(str) ? def : +(str || def); } function setDefault(str, def) { if (str == undefined || str == "") { return def; } return str; } const PLUGIN_NAME = "NRP_EventLightLoad"; const parameters = PluginManager.parameters(PLUGIN_NAME); const pStopDrawOutOfScreen = toBoolean(parameters["StopDrawOutOfScreen"], false); const pOutOfScreenMargin = toNumber(parameters["OutOfScreenMargin"], 0); const pCacheEventRunning = toBoolean(parameters["CacheEventRunning"], false); // ---------------------------------------------------------------------------- // 画面外イベントの描画停止 // ---------------------------------------------------------------------------- if (pStopDrawOutOfScreen) { const _Sprite_Character_update = Sprite_Character.prototype.update; Sprite_Character.prototype.update = function() { // 移動命令中は除外、画面外なら最小限の情報だけを更新 if (!this._character.isMoveRouteForcing() && isOutOfScreenSprite(this)) { this.setFrame(0, 0, 0, 0); this.updatePosition(); return; } _Sprite_Character_update.apply(this, arguments); }; /** * ●スプライトの位置が画面内かどうか? */ function isOutOfScreenSprite(sprite) { const x = sprite.x; const y = sprite.y; // 画像の幅を考慮 let halfWidth = 0; let height = 0; if (sprite.bitmap) { halfWidth = sprite.bitmap.width / 2 * sprite.scale.x; height = sprite.bitmap.height * sprite.scale.y; } // X座標は中央、Y座標は足元が基準なのでそこも考慮 // ズームアウト処理も考慮 if (x + halfWidth + pOutOfScreenMargin < 0 || x - halfWidth - pOutOfScreenMargin > (Graphics.width / $gameScreen.zoomScale()) || y + pOutOfScreenMargin < 0 || y - height - pOutOfScreenMargin > (Graphics.height / $gameScreen.zoomScale())) { return true; } return false; } } // ---------------------------------------------------------------------------- // 起動状況をキャッシュ // ※$gameMap.isEventRunningのキャッシュ化 // ---------------------------------------------------------------------------- if (pCacheEventRunning) { // イベントの実行判定 let mIsEventRunning = null; /** * ●更新 */ const _Scene_Map_update = Scene_Map.prototype.update; Scene_Map.prototype.update = function() { // 毎フレームクリア mIsEventRunning = null; _Scene_Map_update.apply(this, arguments); }; /** * ●イベントの実行判定 */ const _Game_Map_isEventRunning = Game_Map.prototype.isEventRunning; Game_Map.prototype.isEventRunning = function() { // 最初の1回だけ実行する。 if (mIsEventRunning === null) { mIsEventRunning = _Game_Map_isEventRunning.apply(this, arguments); } return mIsEventRunning; }; } })();