【解決済み】変数の割合計算方法について
【解決済み】変数の割合計算方法について
トピックを失礼致します。
初歩的な質問かもしれないのですが、変数を2/3にしたい場合、私は現状、「変数の操作 乗算 定数 3」→「変数の操作 除算 定数 2」という2つの操作を行っています。
これでも計算はできるのですが、できるだけ処理は減らしたいので1つの操作で計算する方法があれば教えて頂ければと思います。
また、同様に変数を80%~100%にしたい場合、現状、「変数の操作 乗算 定数 100」→「変数の操作 除算 乱数 80~100」という2つの操作を行っておりますので、こちらも1つの操作で計算する方法があれば教えて頂ければと思います。
もし不可能でしたら不可能であることを教えて頂けるだけでも助かります。
初歩的な質問かもしれないのですが、変数を2/3にしたい場合、私は現状、「変数の操作 乗算 定数 3」→「変数の操作 除算 定数 2」という2つの操作を行っています。
これでも計算はできるのですが、できるだけ処理は減らしたいので1つの操作で計算する方法があれば教えて頂ければと思います。
また、同様に変数を80%~100%にしたい場合、現状、「変数の操作 乗算 定数 100」→「変数の操作 除算 乱数 80~100」という2つの操作を行っておりますので、こちらも1つの操作で計算する方法があれば教えて頂ければと思います。
もし不可能でしたら不可能であることを教えて頂けるだけでも助かります。
最後に編集したユーザー 白白白 [ 2024年11月14日(木) 09:34 ], 累計 2 回
Re: 変数の割合計算方法について
「変数の操作」のスクリプト欄を活用してください。白白白 さんが書きました:初歩的な質問かもしれないのですが、変数を2/3にしたい場合、私は現状、「変数の操作 乗算 定数 3」→「変数の操作 除算 定数 2」という2つの操作を行っています。
これでも計算はできるのですが、できるだけ処理は減らしたいので1つの操作で計算する方法があれば教えて頂ければと思います。
また、同様に変数を80%~100%にしたい場合、現状、「変数の操作 乗算 定数 100」→「変数の操作 除算 乱数 80~100」という2つの操作を行っておりますので、こちらも1つの操作で計算する方法があれば教えて頂ければと思います。
コード: 全て選択
◆注釈:2/3にする場合
◆変数の操作:#0001 汎用a *= 2/3
◆注釈:80-100%の補正を掛ける場合
◆変数の操作:#0001 汎用a *= Math.random() * 0.2 + 0.8
Math.random()とは0≦N<1に収まる乱数を返す関数です。
Math.random() * 乱数幅 + 乱数下限とする事で0.8≦N<1.0の乱数を取り出す事が出来ます。
これだと100%は絶対に出ませんが概ね問題無いと思います
100%まで含める場合は四捨五入を式に混ぜれば可能ですけど
Javascriptに用意された組み込み関数の範囲だと式が煩雑になるので用途に合わせて加減してください。
コード: 全て選択
// 小数第二位で四捨五入処理を追加
Math.round(Math.random() * 0.2 * 100) / 100 + 0.8
Re: 変数の割合計算方法について
>>名無し蛙 さん
ご教示を頂きありがとうございます。
まさに求めていた答えで素晴らしいです。
新たな疑問があり質問をさせて頂ければと思います。
スクリプトというのは処理が重いイメージがあるのですが、「変数の操作 乗算 定数 3」→「変数の操作 除算 定数 2」の2回より、「変数の操作 スクリプト #0001 汎用a *= 2/3」の1回で済ませた方が処理は軽いと思ってよいのでしょうか?(80-100%の補正を掛ける場合も同様に)
ご教示を頂きありがとうございます。
まさに求めていた答えで素晴らしいです。
新たな疑問があり質問をさせて頂ければと思います。
スクリプトというのは処理が重いイメージがあるのですが、「変数の操作 乗算 定数 3」→「変数の操作 除算 定数 2」の2回より、「変数の操作 スクリプト #0001 汎用a *= 2/3」の1回で済ませた方が処理は軽いと思ってよいのでしょうか?(80-100%の補正を掛ける場合も同様に)
Re: 変数の割合計算方法について
スクリプトというよりも内部で使用しているeval処理(与えられた文字列をjavascriptとして評価する処理)が
一般的に重いとされていますけど誤差の範囲、というか
ここを気にするレベルならプラグイン化&プラグインコマンド呼び出しで対応するべきって話ですね。
Console APIで処理時間を計測出来るので気になるのであればこれを使って確認してください。
イベントコマンド>スクリプトから任意のタイミングでconsole.time("タイマー名");で計測開始。
同様の方法で任意のタイミングでconsole.timeEnd("タイマー名");で同一タイマー名を指定して止めてください
結果はF8で出てくるコンソール画面に表示されます。
msというのはミリ秒の事で0.1ms掛かった場合は0.0001秒掛かったという事です。
一般的に重いとされていますけど誤差の範囲、というか
ここを気にするレベルならプラグイン化&プラグインコマンド呼び出しで対応するべきって話ですね。
Console APIで処理時間を計測出来るので気になるのであればこれを使って確認してください。
コード: 全て選択
// タイマースタート
console.time("タイマー名");
// タイマーを止めずに途中時間表示
console.timeLog("タイマー名");
// タイマーを止めて時間表示
console.timeEnd("タイマー名");
同様の方法で任意のタイミングでconsole.timeEnd("タイマー名");で同一タイマー名を指定して止めてください
結果はF8で出てくるコンソール画面に表示されます。
msというのはミリ秒の事で0.1ms掛かった場合は0.0001秒掛かったという事です。
Re: 変数の割合計算方法について
>> 名無し蛙 さん
ご回答を頂きありがとうございます。
漠然としたイメージだったスクリプトの処理についてを詳しく教えて頂きありがとうございます。
プラグインはさらに処理が重いと思い込んでおり、プラグインにした方が軽いというのは目から鱗でした。
また、処理時間を計測する方法を教えて頂けたのがとても助かります。(プレイした方に重いと言われたものの自分のPCでは重さが分からずどう確かめようかと...)
出来ればアドバイス通りにプラグイン化&プラグインコマンド呼び出しで対応したいのですが、私に全く知識がなく方法が分からず、可能でしたら「◯/◯にする」「◯-◯%の補正を掛ける」というプラグインを作成して頂くことはできないでしょうか?
ご回答を頂きありがとうございます。
漠然としたイメージだったスクリプトの処理についてを詳しく教えて頂きありがとうございます。
プラグインはさらに処理が重いと思い込んでおり、プラグインにした方が軽いというのは目から鱗でした。
また、処理時間を計測する方法を教えて頂けたのがとても助かります。(プレイした方に重いと言われたものの自分のPCでは重さが分からずどう確かめようかと...)
出来ればアドバイス通りにプラグイン化&プラグインコマンド呼び出しで対応したいのですが、私に全く知識がなく方法が分からず、可能でしたら「◯/◯にする」「◯-◯%の補正を掛ける」というプラグインを作成して頂くことはできないでしょうか?
Re: 変数の割合計算方法について
追記を失礼致します。
ご教示頂いた方法で
console.time("タイマー名");
変数操作 (試しに四則演算を10回)
console.timeEnd("タイマー名");
という並びで計測し、F8で確認したところ、計測結果が0msだったのですが、これは0.1msすらかかっていない(処理時間が短すぎて計測不能)ということでよいのでしょうか?
また、一応のご報告ですが「console.timeLog("タイマー名");」を入れるとエラーが発生しました。
ご教示頂いた方法で
console.time("タイマー名");
変数操作 (試しに四則演算を10回)
console.timeEnd("タイマー名");
という並びで計測し、F8で確認したところ、計測結果が0msだったのですが、これは0.1msすらかかっていない(処理時間が短すぎて計測不能)ということでよいのでしょうか?
また、一応のご報告ですが「console.timeLog("タイマー名");」を入れるとエラーが発生しました。
Re: 変数の割合計算方法について
一応補足ですけど必要最小限を比較した場合の話です。白白白 さんが書きました:プラグインはさらに処理が重いと思い込んでおり、プラグインにした方が軽いというのは目から鱗でした。
基本的に余計な機能が付いた総合プラグインだったり
挙動の理解が浅くて未熟なプラグイン素材を利用すると却って遅くなります。
また、後述のケースも遅くなりますね。
通常ベンチマークテストをする場合は1000~10000回ほど処理を繰り返して計測します。白白白 さんが書きました:という並びで計測し、F8で確認したところ、計測結果が0msだったのですが、これは0.1msすらかかっていない(処理時間が短すぎて計測不能)ということでよいのでしょうか?
また、一応のご報告ですが「console.timeLog("タイマー名");」を入れるとエラーが発生しました。
こんな感じのループ構造を作って計測してください。
console.timeLogに関してはMZでは使用可能ですがMVでは使用不可能のようです。
おそらく使用しているnode.jsのバージョンに拠るものだと思います。
コード: 全て選択
◆変数の操作:#0004 ループカウンタ = 0
◆スクリプト:console.time("ベンチマークテスト");
◆ループ
◆変数の操作:#0004 ループカウンタ += 1
◆条件分岐:ループカウンタ ≥ 1000
◆ループの中断
◆
:分岐終了
◆
:以上繰り返し
◆スクリプト:console.timeEnd("ベンチマークテスト");
パッと思い浮かんだのはこんな感じですかね。白白白 さんが書きました:出来ればアドバイス通りにプラグイン化&プラグインコマンド呼び出しで対応したいのですが、私に全く知識がなく方法が分からず、可能でしたら「◯/◯にする」「◯-◯%の補正を掛ける」というプラグインを作成して頂くことはできないでしょうか?
ただ先に書いておくと単純比較するとこっちの方が遅いと思います。
理由は簡単に言えば処理が短すぎるからです。
例えば補正を掛けて何をしたいのか?、もっと大きなブロックで処理を切り出して
プラグインに処理を委譲すれば最適化に繋がると思いますけど
この部分だけプラグインに任せても呼び出しコストの方が高くつきますね。
状況に合わせて利便性と処理速度を天秤に掛ける事が肝要だと思います。
コード: 全て選択
(() => {
'use strict'
const pluginMethods = {};
const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
if (pluginMethods[command]) {
pluginMethods[command](...(args.map(Number)));
} else {
_Game_Interpreter_pluginCommand.apply(this, arguments);
}
};
// 変数ID, 分子, 分母
pluginMethods.method1 = function(varId, n, d) {
if ( d === 0 ) {
console.error("method1で0除算を検知しました");
} else {
let value = $gameVariables.value(varId);
value *= n / d;
$gameVariables.setValue(varId, Math.round(value));
}
}
// 変数ID, 乱数下限, 乱数幅
pluginMethods.method2 = function(varId, min, volume) {
let value = $gameVariables.value(varId);
value *= min + Math.random() * volume;
$gameVariables.setValue(varId, Math.round(value));
}
})();
method1 2 3 4
とした場合、「変数2番に対して3/4の補正を掛ける」というコマンドになります。
つまり「method1 変数ID 分子 分母」の指定順です。
method2 2 0.8 0.2
とした場合、「変数2番に対して下限0.8、乱数幅0.2の補正を掛ける(80-100%)」というコマンドになります。
つまり「method2 変数ID 乱数下限 乱数幅」の指定順です。
先に触れましたがこれ自体はあまり実用的とは言い難く、プラグイン自作時の参考例程度にしてください。
特にmethod1、method2とか分かりづらいですけど
pluginMethods.method1の部分を適当に書き換えればそれがプラグインコマンド名に反映される仕組みなので。
改造する場合は例えばプラグインファイルの下段に
コード: 全て選択
pluginMethods.新プラグインコマンド名 = function(第一引数, 第二引数, 第n引数) {
// 適当な処理
}
「新プラグインコマンド名 第一引数 第二引数 第n引数」と書く事で
新しい自作プラグインコマンドを呼び出す事が出来ます。
引数はいくつ増やしても良いし、逆に0個でも良いです。
Re: 変数の割合計算方法について
>> 名無し蛙 さん
ご返信を頂きありがとうございます。
ベンチマークテストのやり方すら分からずにお手数をお掛けしました。
ご教示頂いたループ構造で検証したところ、無事に計測することができました。
一応の結果報告としまして、変数スクリプト1回よりも変数操作2回の方が早いようです。
プラグインについてもご用意頂きありがとうございます。
この部分だけでは処理が短すぎるということですが、記述を追加する方法まで教えて頂き、この機会にプラグインの作成をしてみようと思いました。
無知な私に丁寧な対応をして頂き感謝に堪えません。
本当にありがとうございました。
ご返信を頂きありがとうございます。
ベンチマークテストのやり方すら分からずにお手数をお掛けしました。
ご教示頂いたループ構造で検証したところ、無事に計測することができました。
一応の結果報告としまして、変数スクリプト1回よりも変数操作2回の方が早いようです。
プラグインについてもご用意頂きありがとうございます。
この部分だけでは処理が短すぎるということですが、記述を追加する方法まで教えて頂き、この機会にプラグインの作成をしてみようと思いました。
無知な私に丁寧な対応をして頂き感謝に堪えません。
本当にありがとうございました。
Re: 【解決済み】変数の割合計算方法について
解決済みの所、ちょっと失礼します。
「変数の割合計算方法について」というタイトルの内容については解決済みで問題ないと思いますが、
デベロッパーツール(F8またはF12)の「Performance」タブで処理時間の録画(?)が出来ますので、それを見ることで、どの処理に時間がかかっているのか、つまり、どの処理が重いと考えられるのか……が分かると思います。
気が向いたら確認してみてください。
とりあえず余談ではありますが以上です。
「変数の割合計算方法について」というタイトルの内容については解決済みで問題ないと思いますが、
というのが本当にやりたいことだとした場合、(プレイした方に重いと言われたものの自分のPCでは重さが分からずどう確かめようかと...)
デベロッパーツール(F8またはF12)の「Performance」タブで処理時間の録画(?)が出来ますので、それを見ることで、どの処理に時間がかかっているのか、つまり、どの処理が重いと考えられるのか……が分かると思います。
気が向いたら確認してみてください。
とりあえず余談ではありますが以上です。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
https://twitter.com/kuroudo119
Re: 【解決済み】変数の割合計算方法について
>> くろうど さん
補足をして頂きありがとうございます。
ご教示頂いた「Performance」タブにて起動から変数処理までを録画してみました。
無知ながら、動作をした時に色がモリッと増えるところ(特にバーが長いところ?)の負荷が高いのだと理解することができました。
こちらの機能を使用して今後は処理の計測と改善を行うことができそうです。
ご教示を頂きありがとうございました。
補足をして頂きありがとうございます。
ご教示頂いた「Performance」タブにて起動から変数処理までを録画してみました。
無知ながら、動作をした時に色がモリッと増えるところ(特にバーが長いところ?)の負荷が高いのだと理解することができました。
こちらの機能を使用して今後は処理の計測と改善を行うことができそうです。
ご教示を頂きありがとうございました。