___
___
変数の保存処理を無効化
skriptは変数の値の変更回数をカウントしていて非同期で5分毎に合計で1000回の変更があるとcsvに保存する処理があります 変数の量が増えると保存するときに大きなラグが発生します すべての変数がラム変数である場合、すべての変数がグローバル変数のときより約2倍速かったです なのでサーバーの起動時にラム変数に変換して、終了時にグローバル変数に変換するskript作りました 起動時と終了時の速度を犠牲にする代わりに稼働中の速度を上げました ラム変数にすると500000個の変数を作って0.5秒毎に保存するようにしてもラグなく動かせました! (1個の変数が全体の速度に与える影響は非常に小さかったですが) ・コード https://pastebin.com/FhKhp09r Skriptのみ ファイル名は!.skのように先頭に!を付けて保存してください config.skのパターンを(?=-).*に書き換えてください
default:
type: CSV
pattern: (?=-).* # <- ここ!
file: ./plugins/Skript/variables.csv
backup interval: 0 # <- おすすめ!
default:
type: CSV
pattern: (?=-).* # <- ここ!
file: ./plugins/Skript/variables.csv
backup interval: 0 # <- おすすめ!
ハイフン付きの変数{-a}がグローバル変数になるようにしています 今まで通り{list::1}のように書いて大丈夫です ※稼働中に保存されないのでサーバーが正しく終了されないと変数のデータが消えるかもしれません
10 replies
全変数の操作
skript 2.5.3 で試しました skriptの変数は hashmap と treemap の2つのマップ変数で管理されています 変数の名前の最後にアスタリスク(*)が来るときは treemap から参照されて、来ないときは hashmap から参照されます * はリスト変数のサブノードを取得するために予約されているので解析時にエラーが出ますが次のコードで回避できることがわかりました
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
グローバル変数のルートノードのリストを取得するコードです 変数の名前は内部で *::* として認識されます 最後に*が付く場合は指定のノードまで進むために :: で分割されて頭から探索します ノード名が*になると直ちに探索を中止して treemap を返すので2個目以降のノード名は処理されません なので、最初と最後に*が来る名前は全て同じ振る舞いをします
*::*
*::a::*
*::a::b::*
*::a::b::c::*
*::*
*::a::*
*::a::b::*
*::a::b::c::*
以上の仕様を利用して全変数を削除するコードを書いてみました
function delete_variables():
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
loop {_rootNodes::*}:
loop indexes of {%loop-value-1%::*}:
delete_nodes("%loop-value-1%::%loop-value-2%")
delete {%loop-value-1%}

function delete_nodes(nodes: text):
loop (indexes of {%{_nodes}%::*}):
delete_nodes("%{_nodes}%::%loop-value%")
delete {%{_nodes}%}
function delete_variables():
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
loop {_rootNodes::*}:
loop indexes of {%loop-value-1%::*}:
delete_nodes("%loop-value-1%::%loop-value-2%")
delete {%loop-value-1%}

function delete_nodes(nodes: text):
loop (indexes of {%{_nodes}%::*}):
delete_nodes("%{_nodes}%::%loop-value%")
delete {%{_nodes}%}
delete_variables() すべての変数を削除します delete_nodes("a::b") a::bとそのサブノードを削除します
1 replies