したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール まとめる | |

改造・制作スレ part8

1 名無しさん@桜花爛漫 :2016/05/21(土) 22:17:05 ID:1hw1nxVw
改造・オリシナ制作などはこちらで。
過去に似たような質問があるかもしれないので、極力調べてから質問しましょう。

ヴァーレントゥーガまとめwiki シナリオ製作講座
http://www28.atwiki.jp/vahren_ency/pages/411.html


改造・制作スレ
http://jbbs.livedoor.jp/bbs/read.cgi/computer/42292/1250722590/l50
改造・制作スレ part2
http://jbbs.livedoor.jp/bbs/read.cgi/computer/42292/1282244590/l50
改造・制作スレ part3
http://jbbs.livedoor.jp/bbs/read.cgi/computer/42292/1305281909/l50
改造・制作スレ part4
http://jbbs.livedoor.jp/bbs/read.cgi/computer/42292/1331214703/
改造・制作スレ part5
http://jbbs.livedoor.jp/bbs/read.cgi/computer/42292/1350187379/
改造・制作スレ part6
http://jbbs.shitaraba.net/bbs/read.cgi/computer/42292/1372172557/
改造・制作スレ part7
http://jbbs.shitaraba.net/bbs/read.cgi/computer/42292/1396009373/

712 名無しさん@寒露 :2017/10/29(日) 10:29:20 ID:???
細やかな検証だね
私は支持するよ

713 名無しさん@寒露 :2017/10/29(日) 11:11:45 ID:???
>>711
自分の環境でデフォのバージョンは7.0ダウンロードした日17.8.29で40fpsだったよ
ここらあたりで上下してたから固定されてるっぽい
40fpsというのは外部ソフトでFPS表示と弓スピード100のレンジ500の同じ状況で検証
矢が出た瞬間停止録画開始と同時に停止解除、矢が消えたと同時に録画停止大体12秒ちょい計算上は12.5秒かかるはずだからまぁこんなものでしょう
昔のスクリプトでいじれるデータでのけてあるのが5.6あたりでそちらで試しても同じだったそれより前のバージョンはフリームのやつだったりHDDクラッシュでバイバイしてるからしらない
そっちで本当に10秒だとしたら環境で速度が変わってる可能性もあるしそれよりも前のバージョンだと違ったのかもしれない

後昨日いうかどうか悩んだけど多分自分はもう触れないだろうし最後に一つだけいっておくけども
最近ずっと独り言状態になってるけど前のごたごたで嫌われてるかもしれないから聞いても返ってこないかもしれないよ

714 名無しさん@寒露 :2017/10/29(日) 21:34:25 ID:???
>>713
検証実験ありがとうございます。他の人の実験結果は参考になります。おかげで「環境で速度が変わる」可能性を見落としてたことに思い至りました。

私は新参者で、過去にどんなごたごたがあったのかは知りませんが、最近は開発者が全く書き込んでませんね。ヴァーレントゥーガ作品群のファンとして、開発者やオリシナ作者の手助けになればと思って、いろいろ調べてます。


開発者(ななあし様)はゲームの動作速度について何 FPS かを明記してません。はっきりしてるのは「戦闘中の経過時間の表示がフレーム数の 1/10 である」という関係だけです。本家シナリオでの標準戦闘時間は500なので、一回の戦闘は5000フレームで構成されています。

ということは、FPS を知るには実際の戦闘時間を時計で測ればいい訳です。私の実験環境(効果音もBGMも無い、一番軽い状態)ではだいたい1分40秒でした。つまり、経過時間500で100秒だから、5000÷100=50 fps という計算です。しかし、こうやって計測できる FPS は環境や動作状況によって異なります。ゲーム動画を撮ってみようかと、FPS表示する撮影ソフトを試してたら、45 fps ぐらいまで遅くなりました。どうも、50 fps というのは理論上の最高値であって、実際のプレイ環境ではもっと下がるようです。

どうしてそうなるかというと、ヴァーレントゥーガにはフレームスキップ機能が無いからだと思います。パソコンが遅かったり、他に重いソフトが動いてたり、描画に時間がかかったり、ユニット数が多かったり、スキルのエフェクトが派手だったりすると、ゲームの動作速度自体が遅くなります。ゲームの中には重い処理を自動的にスキップ(コマ落ち)して、体感速度を一定に保とうという仕組みのもありますが、ヴァーレントゥーガはそのまま1フレームずつ着実に動かします。

要するに、戦闘中に重い処理があると、全体の動きがスローモーションになって、経過時間もゆっくりと進みます。戦闘時間は同じ 500 でも、終わるのに2分かかったなら、5000÷120=42 fps ということになります。何年も前の古いパソコンで、派手な戦闘をしたなら、25 fps しか出なかった、というのも十分考えられます。つまり、厳密に何フレームだから何秒という固定された関係にはなってません。だいたい1秒間に25〜50フレームぐらい進むけど、ゲーム内容やプレイする環境によって変動します。オリシナを作る際は戦闘経過時間(戦闘カウント、フレーム数)と実時間(秒)が一定しないことを考慮に入れる必要がありそうです。

715 名無しさん@寒露 :2017/10/29(日) 22:40:03 ID:???
まさかそうとるとはおもわなかったから本当に最後にいうけどあなたが嫌われてるっていう意味だよ
過疎なのか嫌われてるのかは知らないけど今までほとんど返答なしで答えなければwikiいじるぞっていうのはやめておいたほうがいいってことだよ

716 名無しさん@寒露 :2017/10/30(月) 08:07:12 ID:???
答えがないのは誰も答えを知らないからだろ

717 名無しさん@寒露 :2017/10/30(月) 09:13:56 ID:???
別に嫌ってないけどな
それどころかよくやると感心してたぞ
そういう風に喧嘩売るのやめなよ
そして答えてないのは語ることを持たないから

718 名無しさん@寒露 :2017/10/30(月) 10:12:58 ID:???
とりあえず一人やたら因縁つけてる奴がいるのは分かった

719 名無しさん@寒露 :2017/10/30(月) 14:02:17 ID:???
正直、同じレベルの検証ができないからありがとう以上の言葉を持てないんだよ
俺はこうやっていろいろ試して解明してくれてるのは非常に助かってるし嬉しいと思ってる

720 名無しさん@寒露 :2017/10/30(月) 15:41:24 ID:???
返答なし=嫌われてるってすごい理論だな
wikiって誰でも編集できることに意味があるんだから正しい情報に書き換えるのは別にいいでしょ
前のごたごたも何のことだか分からないし独り言状態ってぽつぽつ反応やお礼があるんだが

721 名無しさん@寒露 :2017/10/30(月) 16:48:26 ID:???
前のゴタゴタがすぐ上のことなら、自分の気に食わない人を同一人物と決めつけて、それに対する自分の意見を総意とする人がいるのはやだな
このスレは質問も検証も基本的に有意なことだと思うし、是非色々試して欲しい

722 名無しさん@寒露 :2017/10/30(月) 23:19:36 ID:???
加入ユニットに関して質問です

addUnitを使ってユニット加入イベントを作りたいのですが、領土1・その領土のキャパが1部隊という状態で、スクリプトを使って人材ユニットを陪臣でない状態で部隊に加入させる方法はないでしょうか?
どうしても陪臣でない状態で加入させたいと考えています

723 名無しさん@寒露 :2017/10/31(火) 04:11:14 ID:hT6ogIMA
>>722
非人材ユニットを領地に追加。これに部隊リーダーだった人材1をメンバーとして追加してさらに人材2を追加。
この部隊のリーダーユニットを削除してやればできるのでは。

724 名無しさん@寒露 :2017/10/31(火) 21:25:19 ID:???
>>723
addPower(POWER)
addUnit(MASTER,SPOT)
addUnit(DUMMY,POWER)
addUnit(NAKAMA,DUMMY)

storeLeaderOfPower( POWER , @aaa)

set(idx,0)
while(idx<count(@aaa)){

index(@aaa,idx,@aaa_get)
msg(&idx&の&@aaa_get&)
if(isTalent(@aaa_get)==0){
msg(加入)

addUnit(@aaa_get,MASTER)
}

add(idx,1)
}

changeMaster(MASTER)


こんな感じでやりましたが、加入の後のaddUnitが動かないですね
加入は表示されるので、通ってはいるみたいですが
間違ってる部分あったらごめんなさい

725 名無しさん@寒露 :2017/10/31(火) 21:29:06 ID:???
あ、厳密にはうごいてるみたいですが、DUMMYが人材じゃないためにMASTERの下に別のDUMMYが加入してしまうみたいです(キャパ1なのでよく見えてなかった)

また、そのあとにaddUnit(NAKAMA,MASTER)も試しましたが陪臣になりました

726 名無しさん@寒露 :2017/10/31(火) 21:57:32 ID:???
DUMMYがclass構造体ならそりゃ別のがaddunitされるよ

addPower(POWER)
addUnit(MASTER,SPOT)
addUnit(DUMMY,POWER)
storeLeaderOfPower( POWER , @aaa)
addUnit(NAKAMA,@aaa)
(以下略)

これでどう

というかそのよくわからないwhileは何ぞ
他のユニットがいるところで弄る想定なの?

727 名無しさん@寒露 :2017/10/31(火) 21:59:42 ID:???
>>726
unit DUMMY
{
name = 陪臣ダミー
}

こんな感じですね
classではないです
talentじゃないという意味で人材じゃないと言いました

728 名無しさん@寒露 :2017/10/31(火) 22:00:59 ID:???
whileに関しては別の領地を新しく発生させてみても同じだったので、まあこれでいいかな?って感じです
いじるの自体はどこででもOKです。最終的にSPOTが1つであれば問題ありません

729 名無しさん@寒露 :2017/10/31(火) 22:03:28 ID:???
連投すいません

addPower(POWER)
addUnit(MASTER,SPOT)
addUnit(DUMMY,POWER)
storeLeaderOfPower( POWER , @aaa)
addUnit(NAKAMA,@aaa)
(以下略)

これも試してみましたが、addUnitの部分で結局別のDUMMYがMASTERの下についちゃいますね

730 名無しさん@寒露 :2017/10/31(火) 22:06:45 ID:???
じゃあわからないな
ごめんよ

731 名無しさん@寒露 :2017/10/31(火) 22:11:11 ID:???
いえいえ、ありがとうございます
やってるうちに何かみつかったり、他の方の回答で解決するかもなので、もう少しがんばってみます!

732 名無しさん@寒露 :2017/10/31(火) 22:24:28 ID:???
>>723の解釈を間違ってないか
DUMMYにMASTERとNAKAMAを追加してDUMMYを消すのでは

733 名無しさん@寒露 :2017/10/31(火) 22:37:30 ID:???
>>732
DUMMYをMASTERに追加してみましたが、マスターなので追加できないみたいです

changeMasterは念のためやってるだけですね

最終手段はNAKAMAを全部タレント属性抜きにしてそもそも陪臣にならないようにするぐらいですが、その他のデメリットがヤバい感じです

734 名無しさん@寒露 :2017/10/31(火) 23:05:37 ID:???
やってるうちに不具合っぽいものを見つけたのでご報告

talentでないユニットにマスターをやらせて、そのマスターをそのまま別勢力の人材下に加入させると、何故か陪臣になりました

735 名無しさん@寒露 :2017/11/01(水) 00:30:01 ID:E6zj026E
人材ユニットを追加する部隊リーダー人材がマスターであるときも考慮しないといけなかったのか。
だとすると、人材ユニットを追加する部隊のリーダーがマスターであった場合は、ダミーの人材ユニットを適当な領地に追加してこれにマスターを引き継がせます。
さらに非人材のダミーユニットを人材ユニットを追加する部隊がいる領地に追加します。
このダミーユニットの部隊にマスターとメンバーにする人材ユニットの順で追加します。
この部隊からリーダーユニットを削除したあとで勢力マスターを元の人材に戻します。
マスターを代行させていたダミーの人材ユニットを適当に邪魔にならない領地に飛ばします。
この方法でいけませんかね。
ただし、ダミーのユニットが処理の過程で発生するのでメンバーが最低二つは空きがないとだめですけど。たしか溢れたメンバーは削除されていたはず。

736 名無しさん@寒露 :2017/11/01(水) 00:33:06 ID:E6zj026E
>>735訂正
>このダミーユニットの部隊にマスターとメンバーにする人材ユニットの順で追加します。
正しくは
>このダミーユニットの部隊にマスターだった人材とメンバーにする人材ユニットの順で追加します。

>>733
その解釈でアタリです。

737 名無しさん@寒露 :2017/11/01(水) 00:36:16 ID:E6zj026E
>>736の訂正。
レス番は733ではなく732に対してです。連ミスごめん。

738 名無しさん@寒露 :2017/11/01(水) 01:20:03 ID:???
>>735
ありがとうございます
早速やってみました

addPower(POWER)
addSpot(DUMMYSPOT,POWER)
addUnit(TALENTDUMMY,DUMMYSPOT)
showSpot(DUMMYSPOT)
changeMaster(TALENTDUMMY)
addUnit(NOTALENTDUMMY,SPOT)
addUnit(MASTER,NOTALENTDUMMY)
addUnit(NAKAMA,NOTALENTDUMMY)
storeUnitOfPower(POWER,@POWER_units)
set(idx,0)
while(idx<count(@POWER_units)){
index(@POWER_units,idx,@POWER_units_get)

if(isTalent(@POWER_units_get)== 0){
//NOTALENTDUMMYのみが該当
eraseUnit(@POWER_units_get)
}

add(idx,1)
}
removeSpot(DUMMYSPOT)
changeMaster(MASTER)


このままだとマスター(マスター)・ナカマ(陪臣)という部隊になります
changeMasterをコメントアウトすると、非人材ダミー・マスター・ナカマという部隊になります
eraseUnitをコメントアウトすると、非人材ダミー・ナカマの部隊とマスターの部隊に分かれました

どうやら非人材部隊に所属した時点で陪臣になっているという問題があるようです

理解が間違ってたらごめんなさい

739 名無しさん@寒露 :2017/11/01(水) 19:31:47 ID:???
>>715
これは申し訳ありませんでした。
wikiをいじってはいけないとは知らなかったので、情報が不正確なら訂正した方がいいと思ってました。しかし、私は軽率で間違うことが多いので、wikiに関しては慎重な方にお任せします。

その他の閲覧者へ
こういう掲示板のマナーには疎いもので、私の行動を不快に感じた方にはあやまります。他に問題がありましたら、寛容な方は今後ともご指摘ください。
私の実験は、私が試した範囲内での観測結果に過ぎないので、推測や結論が間違ってるかもしれません。実際のゲーム内の動作とは異なる可能性があるので、あくまで参考レベルに留めてください。


スキルを試す為に何度も戦闘させてて感じたのですが、守備側(COM勢力)が、戦闘開始直後から迎撃してくる時と、初期位置で待ち構えてる時があります。実験条件を同じにする為には、毎回どちらか一方に固定したいので、どういう条件で挙動が変わるのかを調べてみました。

まず第一に、マスターの好戦値(kosen)が高いほど迎撃します。(マスターが存在しない勢力なら、その勢力に設定された好戦値)
マスターの kosen 値を指定しない場合、40回攻め込んで、迎撃してきたのは 21回でした。(5割ぐらい)
マスターの kosen = 100 にした場合、40回攻め込んで、迎撃してきたのは 31回でした。(8割ぐらい)
マスターの kosen = 80 にした場合、40回攻め込んで、迎撃してきたのは 26回でした。(6割ぐらい)
マスターの kosen = 50 にした場合、40回攻め込んで、迎撃してきたのは 16回でした。(4割ぐらい)
マスターの kosen = 30 にした場合、40回攻め込んで、迎撃してきたのは 12回でした。(3割ぐらい)
マスターの kosen = 10 にした場合、40回攻め込んで、迎撃してきたのは 3回でした。(1割ぐらい)
サンプル数が少ないのか乱数分布のせいか、うまく比例しませんが、だいたい kosen 値に依存してます。

kosen 値が 100 でも迎撃しないことがあるのは、btl_counter が関係してるみたいです。kosen = 100 にした上で、btl_counter = 80 だと、50回攻め込んで、迎撃してきたのは 41回でした。試しに btl_counter = 50 に減らすと、50回攻め込んで、迎撃してきたのは 30回でした。更に btl_counter = 20 に減らすと、50回攻め込んで、迎撃してきたのは 11回でした。シード値によって乱数にばらつきがあるのか、他にも要因があるのか、試行回数を増やしても正比例しませんが、迎撃する確率に差があるので、第二の条件は btl_counter と言えます。

それなら、btl_counter が高ければ kosen が低くても迎撃するのかと、kosen = 1, btl_counter = 100 でどうなるか試してみましたが、50回攻め込んで、迎撃してきたのは 3回でした。迎撃しやすいのは、kosen と btl_counter の両方が高い場合のようです。それで、kosen = 100, btl_counter = 100 にしたら常に迎撃するようになりました。

740 名無しさん@寒露 :2017/11/01(水) 19:32:21 ID:???
あと、戦力値も比較してるようで、守備側の戦力値が、攻撃側の半分以下だと、好戦値に関係なく迎撃しません。半分より少しでも上回ると、迎撃するようになります。また、守備側の戦力値が極端に低い場合は、戦闘開始直後に逃げ出します。どのくらい少なければ逃げるかも、マスターの好戦値に依存していて、前衛同士なら、kosen = 100 なら 4.3倍、kosen = 70 なら 3.2倍、kosen = 50 なら 2.2倍、kosen = 30 や 10 なら 2倍、ぐらいの戦力差で開幕逃亡するみたいです。好戦値が極端に低い場合でも、戦力差が2倍以下なら逃げませんが、2倍を少しでも上回ると逃げるようになります。ただ、前衛と後衛で微妙に違うし、判定基準はわかりませんでした。

また、攻撃側の戦力値が、守備側に比べて btl_intercept のパーセント未満なら、kosen に関係なく迎撃します。btl_intercept の値が大きいほど、少しでも戦力差があれば迎撃します。btl_intercept の値が小さいほど、少ない戦力で攻めても待機します。例えば、標準では btl_intercept = 50 なので、攻撃側の戦力が半分未満なら、攻撃側は必ず迎撃してきます。これは戦闘開始後に双方の戦力値が変動した場合も、適用されるみたいで、部隊を少しずつ退却させていくと、攻撃側の戦力値が半分を切った時点で、待機してた守備側が迎撃に転じます。

とりあえず、COM に必ず迎撃してきて欲しい場合は、kosen と btl_counter の値を両方とも 100 にして、攻撃側の戦力値を守備側の4倍以下にすればいいです。逆に、COM にその場で待機しといて欲しい場合は、kosen を -1 にして、攻撃側の戦力値を守備側に対して btl_intercept %以上にすればいいです。kosen を下げると戦力差で逃げ出しやすくなりますが、攻撃側の戦力値を守備側の2倍以下にすれば逃げません。戦力値と逃亡の関係は btl_retreat_coe の2番目の値が怪しいのですが、どういう仕組みなのかわかりませんでした。

btl_counter や btl_intercept は全ての戦いに反映されるので、実験目的以外で変更すると、予想外の影響があるかもしれません。オリシナ作者が勢力に個性を出したい場合は、好戦値で調節するといいです。本家シナリオの設定値を見てると、ななあし様が種族や勢力の特徴をよく考えてるなあ、と感心します。

741 名無しさん@寒露 :2017/11/01(水) 21:16:13 ID:???
ちゃんと投稿できたか見てたら、内容に書き間違いを発見しました。
(誤) 標準では btl_intercept = 50 なので、攻撃側の戦力が半分未満なら、攻撃側は必ず迎撃してきます。
(正) 標準では btl_intercept = 50 なので、攻撃側の戦力が半分未満なら、守備側は必ず迎撃してきます。
投稿前にもっとよく見直すべきでした。何遍もミスしてすみません。

742 名無しさん@寒露 :2017/11/02(木) 23:01:25 ID:???
また740番の訂正です。自分で条件を書いといて結論に含めるのを忘れてました。戦力差4倍は逃亡させない条件で、迎撃してもらうには2倍未満にしないといけないんでした。
(誤) COM に必ず迎撃してきて欲しい場合は、kosen と btl_counter の値を両方とも 100 にして、攻撃側の戦力値を守備側の4倍以下にすればいいです。
(正) COM に必ず迎撃してきて欲しい場合は、kosen と btl_counter の値を両方とも 100 にして、攻撃側の戦力値を守備側の2倍未満にすればいいです。
他にもミスしてるかもしれませんが、気付いたら訂正します。

743 名無しさん@寒露 :2017/11/03(金) 23:03:48 ID:???
今まで不明だったパラメータを検証してもらえるの有り難い

744 名無しさん@寒露 :2017/11/06(月) 22:53:47 ID:???
うーむ、すごい検証数だ。お疲れ様です

745 名無しさん@寒露 :2017/11/07(火) 00:16:53 ID:???
ユニットを出し過ぎて大規模戦闘をし過ぎるとクラッシュする対策はないでしょうか
確か死んだユニットにも何かデータ割り当ててたと思うのですが、それを無効にしたりなど出来ませんか

746 名無しさん@寒露 :2017/11/07(火) 19:49:23 ID:???
参考までに聞きたいのですが、ユニット出しすぎって何体くらいでなりましたか?

747 名無しさん@寒露 :2017/11/09(木) 20:52:33 ID:???
>>745
自分は本家シナリオや「きのたけ」で召喚しまくっても、ユニット数の制限で出せなくなる事はあっても、クラッシュはしませんでした。それで不思議に思って、召喚しまくる実験をしてみました。

陣営ごとのユニット制限を btl_unitmax = 1000 に増やした上で、敵ユニットに範囲攻撃を使わせて、召喚されたユニットを一気に掃除することで、ユニット数の制限に関わらずに、大量に召喚することができます。(掃除しないと、表示されてるユニット数が制限を越えた時点で、それ以上の召喚ができなくなる。)召喚し続けると Vahren.exe のメモリー消費量が増えて行き、ユニット数が多過ぎるとゲームが落ちました。終了時に OS のエラー通知が無かったので、アプリケーション側で状況を見て自ら正常終了した感じです。

次に実験データを例示し、最後に私の結論を載せます。メモリー消費量はタスクマネージャーの数値ですが、微妙に上下するので厳密ではありません。戦場のオブジェクトやエフェクト、BGM、効果音、顔絵などで、実際のゲームではもっと消費が増えるはずです。スキルやエフェクトによる違いは試してないので、それらがユニット数に影響するかはわかりません。

748 名無しさん@寒露 :2017/11/09(木) 20:53:27 ID:???
[ 最新の v7.00 2017-10-12版 ]
敵は1ユニット、自軍は8ユニットで 1000 * 8 = 8000ユニット召喚しました。メモリー消費量は、召喚前は 332,748 KB、召喚終了時は 1,315,692 KB でした。(1315692 - 332748) / 8000 = 122.7 なので1ユニット当たり 123 KB ぐらいです。

敵は1ユニット、自軍は8ユニットで 1400 * 8 = 11200ユニット召喚しました。メモリー消費量は、召喚前は 326,152 KB、召喚終了時は 1,701,876 KB でした。ユニットを召喚するたびに増えるメモリー量は 123 KB で一定してます。

敵は1ユニット、自軍は8ユニットで 1440 * 8 = 11520ユニット召喚しました。メモリー消費量は、召喚前は 326,228 KB、召喚終了時は 1,741,600 KB でした。

敵は1ユニット、自軍は8ユニットで 1450 * 8 = 11600ユニット召喚しようとすると、途中で落ちました。召喚できるユニット数の限界は 11500 ぐらいのようです。

敵ユニットを1体から80に増やしてみました。敵は80ユニット、自軍は8ユニットで 1420 * 8 = 11360ユニット召喚しました。メモリー消費量は、召喚前は 336,484 KB、召喚終了時は 1,732,724 KB でした。

敵は80ユニット、自軍は8ユニットで 1430 * 8 = 11440ユニット召喚しようとすると、途中で落ちました。初期配置ユニットが多いと、召喚できるユニット数が減るようです。

味方ユニットも8体から80に増やしてみました。敵は80ユニット、自軍も80ユニットで 141 * 80 = 11280ユニット召喚しました。メモリー消費量は、召喚前は 345,092 KB、召喚終了時は 1,731,812 KB でした。

敵は80ユニット、自軍も80ユニットで 142 * 80 = 11360ユニット召喚しようとすると、途中で落ちました。陣営や召喚かに関係なく、戦場に登場した累計ユニット数に限界があるようです。

[ v7.00 の古い 2017-08-28版 ]
敵は1ユニット、自軍は8ユニットで 1000 * 8 = 8000ユニット召喚しました。メモリー消費量は、召喚前は 326,920 KB、召喚終了時は 558,408 KB でした。古いバージョンの方が、明らかにメモリー消費量が少ないです。

敵は1ユニット、自軍は8ユニットで 1400 * 8 = 11200ユニット召喚しました。メモリー消費量は、召喚前は 326,832 KB、召喚終了時は 650,632 KB でした。(650632 - 326832) / 11200 = 28.9 なので1ユニット当たり 29 KB ぐらいです。

敵は1ユニット、自軍は8ユニットで 1440 * 8 = 11520ユニット召喚しました。メモリー消費量は、召喚前は 326,912 KB、召喚終了時は 659,420 KB でした。古いバージョンでは、ユニットを召喚するたびに増えるメモリー量は 29 KB で一定してます。

敵は1ユニット、自軍は8ユニットで 1450 * 8 = 11600ユニット召喚しようとすると、途中で落ちました。メモリー消費量が少なくても、同じように落ちるので、メモリー不足はクラッシュの原因じゃないです。

敵ユニットを1体から80に増やしてみました。敵は80ユニット、自軍は8ユニットで 1430 * 8 = 11440ユニット召喚しました。メモリー消費量は、召喚前は 330,204 KB、召喚終了時は 660,548 KB でした。新バージョンだと落ちたのに、古いバージョンだと、最後まで召喚できました。

敵は80ユニット、自軍は8ユニットで 1440 * 8 = 11520ユニット召喚しようとすると、途中で落ちました。最大数は微妙に違いますが、古いバージョンでも、累計ユニット数には限界がありました。

味方ユニットも8体から80に増やしてみました。敵は80ユニット、自軍も80ユニットで 142 * 80 = 11360ユニット召喚しました。メモリー消費量は、召喚前は 331,240 KB、召喚終了時は 661,620 KB でした。やはり、古いバージョンの方が少し多くユニットを出せます。

敵は80ユニット、自軍も80ユニットで 143 * 80 = 11440ユニット召喚しようとすると、途中で落ちました。80 + 80 + 11440 = 11600 なので、累計ユニット数は 11500 ぐらいまでみたいです。

[ 開発版の v6.85v 2017-06-16版 ]
敵は1ユニット、自軍は8ユニットで 1440 * 8 = 11520ユニット召喚しました。メモリー消費量は、召喚前は 329,340 KB、召喚終了時は 661,108 KB でした。

敵は1ユニット、自軍は8ユニットで 1450 * 8 = 11600ユニット召喚しようとすると、途中で落ちました。メモリー消費量や限界は 2017-08-28版と同じようです。

[ 正式版の v6.90 2017-03-27版 ]
敵は80ユニット、自軍も80ユニットで 142 * 80 = 11360ユニット召喚しました。メモリー消費量は、召喚前は 331,492 KB、召喚終了時は 662,436 KB でした。

敵は80ユニット、自軍も80ユニットで 143 * 80 = 11440ユニット召喚しようとすると、途中で落ちました。メモリー消費量や限界は 2017-08-28版と同じようです。

749 名無しさん@寒露 :2017/11/09(木) 20:54:30 ID:???
実験の結果、最新版(2017-10-12) の問題点を発見しました。ユニット・データのメモリー消費量が古いバージョンに比べて4倍もあります。古いバージョンは1ユニットごとに 29 KB ぐらいだけど、最新版では1ユニットごとに 123 KB ぐらいです。したがって、ユニットを大量に出したいなら、最新版(2017-10-12) を使わない方がいいです。64-bit OS ならともかく、メモリー空間が狭い上に共有されてる 32-bit OS では、ユニット数の限界が来る前に、メモリー不足で動かなくなります。古いバージョンでも1ユニットに 29 KB もメモリーを使ってるのは謎です。数値データだけならもっと少ない筈なので、ユニットごとに画像データを保持してるのか、あるいは不要になったスプライトを解放してないのかもしれません。context や class の設定を変えたり、画像の大きさを変えたりしてみましたが、特に違いはありませんでした。

どうも、「死んだユニットにも何かデータ割り当ててる」のではなく、死んでもデータが丸ごと残ってるような気がします。その証拠に、スクリプトでは死亡ユニットのデータも取得できますし、死亡ユニットにスキルを使わせることもできるみたいですし、死体が消えずに残る不具合(沈んだユニット画像の上端が残る)もあります。スクリプトでユニットを取り除いた場合も、単に死亡扱いになるだけで、データは残ってました。ユニット数の限界に関しては、バグでは無いので、開発者に対応してもらうのは難しいように思います。

とりあえず、オリシナ作者ができる大規模戦闘時のクラッシュ対策としては、戦場に登場する累計ユニット数を 11500 ぐらいまでにするしかありません。守備側の初期配置数や援軍、攻撃側の出撃数や増援、それに双方が召喚する、全てのユニット数の合計です。無限召喚スキル(遠隔攻撃から召喚への連鎖)は、召喚数自体は設定できませんが、スキル使用間隔と連射数から、戦闘時間内に出せる数が決まります。予め、どれだけのユニットが戦場に出てくるかを計算して、その合計が限界以内に収まるようにすれば、クラッシュを避けれるでしょう。

750 名無しさん@寒露 :2017/11/10(金) 06:36:19 ID:???
これはかなり参考になるデータ
ありがたいです

751 名無しさん@寒露 :2017/11/10(金) 16:13:02 ID:???
メモリ的な限界は予想できてなかったのでうれしい

752 名無しさん@寒露 :2017/11/10(金) 17:16:04 ID:???
いや、メモリ的な限界が1番考えられただろ
その限界がどこまでかいまいちわからんかったのが問題だったわけで
それにしてもありがてえ検証だ

753 名無しさん@寒露 :2017/11/14(火) 17:00:11 ID:5622DLwA
setStatus(unit,move,hoge)が上手く動きません
talent=offのユニットだとうまく動かないでしょうか?それともほかの原因がありますか?

754 名無しさん@寒露 :2017/11/14(火) 17:27:13 ID:5622DLwA
少し気になって実験したのですが

unit notlnt
{
talent = off
name = ノータレ
}

setv(@aaa,notlnt)
msg(&notlnt&)→notlntと出力される

setv(@wanko,notlnt)
//この勢力にnotlntが存在するとする
storeUnitOfPower(pow,@bbb)
set(idx,0)
while(idx<count(@bbb)){
index(@bbb,idx,@bbb_get)

msg(&@bbb_get&)→notlntに当たった場合ノータレと出力される

if(@bbb_get == @wanko){

msg(同じものだよ!)→notlntが存在するはずなのに@wankoに合致するものがない
}

add(idx,1)
}

どういった問題を解決すればいいでしょうか・・・

755 名無しさん@寒露 :2017/11/14(火) 17:29:42 ID:???
連投すいません
目的としては、データベースとして使用しているtalent=onのユニットのステータスをtalent=offのユニットに移行するという目的です
データベースのmprecの数値でunitの種類を特定し、addUnitして追加したユニットにその他ステータスを落とし込むというのをやりたいと思っています

756 名無しさん@寒露 :2017/11/14(火) 17:55:36 ID:???
さらにすいません
>>754
誤;msg(&notlnt&)→notlntと出力される
正:msg(&@aaa&)→notlntと出力される
でした

757 名無しさん@寒露 :2017/11/14(火) 19:54:34 ID:???
unit構造体で定義された人材じゃないユニットを後からスクリプトでどうこうしようとするととんでもなく厄介だった記憶がある
dead_eventに疑似死亡イベント(レベルリセットして隠し領地に移動とか)を仕込んだ人材とかにした方が楽じゃないだろうか

758 名無しさん@寒露 :2017/11/14(火) 20:15:02 ID:???
>>757
talentなユニットだと困ることがあるのであえて外しています
具体的にはaddUnitした際に陪臣になってしまうことがやりたいシステムに致命的な邪魔になってしまうので

先日色々やってみましたが無理だったので、talentを外す方向で対応しました

とりあえずstoreUnitOfPowerとかで取得したユニットとして使えばマトモに使えて、setvで直接文字列突っ込んだのは使えないって感じになってますね

で、ユニットを外して入れ直す際のやり取りが

1・talent=onのダミーユニットを隠しspotに入れる
2・talent=offのユニット(以下メインユニット)のステータスを取得してダミーユニットに性能をコピー
3・メインユニットをeraseUnitで全部消す
4・メインユニットを再び発生させる、この際ダミーユニットを参照
5・ダミーのステータスを取得してメインユニットに反映

で、setLevelがこれまたダミーユニットにうまいこと反映しないみたいで、これはaddLevelを1づつするしかないのかな

759 <あぼーん> :<あぼーん>
<あぼーん>

760 名無しさん@寒露 :2017/11/15(水) 20:42:51 ID:???
>754
unit 構造体の名前(notlnt)と、ユニットの名前(ノータレ)の使い分けが難しいです。

wiki によると、setv は文字変数に文字列を代入します。
>> setv(@wanko,notlnt)
この行では @wanko に構造体の名前として「notlnt」を代入してます。

その一方で、storeUnitOfPower は「ユニットの識別子」を文字変数に代入します。そして、unit/classの識別子における文字変数要素とは name で指定した文字列のようです。
>> index(@bbb,idx,@bbb_get)
この行では @bbb_get にユニット名として「ノータレ」を代入してます。

>> if(@bbb_get == @wanko){
「notlnt」と「ノータレ」は異なるので、この比較で合致しない訳です。setv(@wanko,ノータレ) として、ユニット名で探したらどうでしょうか。

761 名無しさん@寒露 :2017/11/16(木) 16:52:33 ID:???
>>760
なるほど、全角文字をスクリプトでも使えるのですね
ちょっとそれ念頭においてやってみます

色々目からウロコでした、ありがとうございます〜


新着レスの表示


名前: E-mail(省略可)


■ したらば のおすすめアイテム ■

刑務所なう。 - 堀江 貴文

     ミミ ヽヽヽヽヽヽリリノノノノノノノ
    ミ               彡
    ミ   ,,、,、,、,、,、,、,、,、,,、,、,、,、、 彡
     l  i''"            i彡
    .| 」  /          |
    ,r-/     ● (__人_) ●  |  オリンパス事件どうなの?
    l                  | 
    丶_              ノ
   /~~    ´~ ̄(⌒)(⌒) ヽ
  /          ヽ`ニニ'ノ  ノ

この欄のアイテムは掲示板管理メニューから自由に変更可能です。


掲示板管理者へ連絡 無料レンタル掲示板 powered by Seesaa