Yanflyさん製プラグイン等が function(){ }(); で囲われていないのはなぜ?

アバター
terunon
記事: 76
登録日時: 2016年2月12日(金) 12:14
お住まい: 熊本県
連絡を取る:

Yanflyさん製プラグイン等が function(){ }(); で囲われていないのはなぜ?

投稿記事by terunon » 2016年4月04日(月) 07:54

皆様

お疲れさまです。
まず、あまりjavascriptの知識もないのに専門的な部分の質問になることをお許しください。


ツクールの多くのプラグインについて、グローバル汚染というものを起こさないよう、プラグイン全体をfunctionで囲うということがされていると存じます。
しかし、Yanflyさん製のすべてのプラグインを筆頭に、一部プラグインではそれが行われておりません。

わたしはツクールのプラグインはfunctionで囲うのが定型であると思っていたため、Yanflyさんのプラグインにすべてfunctionがついていないのを疑問に感じております。

ツクールのプラグインにおいてfunctionをつけないケースについて、どういった意図なのか等、どなたかご教示いただけないでしょうか。


(質問の背景)
現在わたしの自作ゲームが、一部環境できわめてツクールMVさんのメモリリークと思われる挙動(※)を起こしやすくなっており、原因となるプラグインの割り出しを行っていたところ、(メニュー開閉連打での感覚的な検証のため確証はあまりないのですが)functionで囲われていないプラグインが原因である可能性が疑われてきたためです。(このプラグインは、BattleManagerとGame_BattlerBaseしか変更しておらず、メモリまたはマップのスクロールに影響が出るのが少し腑に落ちません。本当に原因でない可能性もありますが……。)

※メニューを数回開閉するとマップのスクロールがひどく重くなることがあります。メニュー開閉連打であらゆるブラウザ製ゲームで再現できると思われるのですが、わたしのゲームにおいて発生率がきわめて高く、プレイに支障をきたしています。

terunon
絵描いたり、ボカロPしたり、ツクったりしてます。

ツクールMV製ローグライクアクションアドベンチャーRPG/ニコニコ自作ゲームフェス2016敢闘賞作品
『AliasAche:エイリアスエイク』 もりもり公開中です。
紹介ページ→ http://tri-nitroterunon37.wix.com/terunon#!aliasache/fyncb
すぐにブラウザプレイするならこちら→ http://html5.plicy.net/GamePlay/19919
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: Yanflyさん製プラグイン等が function(){ }(); で囲われていないのはなぜ?

投稿記事by 名無し蛙 » 2016年4月04日(月) 12:40

お疲れ様です
自分もJavaScriptは勉強中の身ですが、そうですねぇ…ItemBook.jsを例にしましょうか
function(){ }();は以降即時関数と呼びます。細かい事ですが記法は(function(){ }());と(function(){ })();の二通りのみです
あとこれから書く事はプラグイン弄りする事で実感した推測であって実際のところは知りません

スクリプトコマンドでSceneManager.push(Scene_Menu);と入力すると直接シーン遷移する事が出来ます
上記の場合だとメニュー画面に移りますね
同様にItemBook.jsを有効にしてSceneManager.push(Scene_ItemBook);と入力すると
アイテム図鑑画面に遷移せずに「Scene_ItemBook is not defined」
つまり「Scene_ItemBookが定義されていない」というエラーが出ると思います
これは厳密には定義されていないのではなく即時関数で囲われている為に
新規追加したクラスはプラグイン外から参照出来ない、つまり再利用する事が出来なくなるという事です
一般的なプラグインでは既存メソッドの再定義、あるいは新規追加したクラスでも最終的に
Game_Interpreter.prototype.pluginCommandという窓口を再定義する事で間接的に使用しています

Yanflyさんのプラグインは使ってないので詳しくはないのですが
一つのプラグインで完結せずに大掛かりにシステム変更しているのが特徴だと思います
中にはプラグインAで定義したクラスをプラグインBで使用するケースもあると思いますけど
即時関数を使用しているとこういうプラグイン間のやり取りが面倒になるのでいっそ全て廃しているのではないでしょうか
不特定多数が使用する素材としてはあまり推奨されませんが規模の大きさによってはやむを得ない場合もあります
規模が大きくなれば分割管理したくなりますが、下手に分割したせいで弊害が発生したら本末転倒です
Yanflyさんの場合は非常に長い規則性のある命名法でグローバル汚染の懸念要素である名前の衝突を回避していますね

あとはまぁ彼は公式と共に発売前からプラグイン開発していた準公式の一人なので
開発当初は単純にコーディングルールが決まっていなかったのかも知れませんね
どちらにせよメモリ問題に影響する話ではない、と思います
メモリ問題自体、非常に不透明でありそちらの環境を再現した訳でもないので断言は出来ませんが
アバター
terunon
記事: 76
登録日時: 2016年2月12日(金) 12:14
お住まい: 熊本県
連絡を取る:

Re: Yanflyさん製プラグイン等が function(){ }(); で囲われていないのはなぜ?

投稿記事by terunon » 2016年4月04日(月) 21:06

名無し蛙様

貴重な情報ありがとうございます。
他プラグインとのつながりを維持しつつも機能を切り分けるために、あえて行っていたというわけですね……!
大変納得がいきました。ありがとうございます。

質問当初、スクリプトの処理内容がグローバルの領域に放流されることでメモリやリソース等を圧迫するのではないかと推測していたのですが、そういったものではなさそうですね。

スクロールガクガク問題(マップの描画に問題が起きているようです)についても、まだ解決はできておりませんが、調査を続けていきたいと思います。

ありがとうございました。
terunon
絵描いたり、ボカロPしたり、ツクったりしてます。

ツクールMV製ローグライクアクションアドベンチャーRPG/ニコニコ自作ゲームフェス2016敢闘賞作品
『AliasAche:エイリアスエイク』 もりもり公開中です。
紹介ページ→ http://tri-nitroterunon37.wix.com/terunon#!aliasache/fyncb
すぐにブラウザプレイするならこちら→ http://html5.plicy.net/GamePlay/19919

“MV:質問” へ戻る