トップページgamedev
997コメント362KB

■吉里吉里/KAG/TJS雑談質問スレ■その25

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2011/12/16(金) 09:12:24.47ID:abdXwpcP
ノベルゲーム製作ツール吉里吉里/KAGのユーザーが雑談・質問をするスレです。
自作ゲームの進行状況や製作ツールについての話、TJS等の話題もどうぞ。
マルチポストはやめましょう。個人叩きも禁止です。

※スレで質問をするときは※
KAG/TJS/吉里吉里ドキュメント、スレの過去ログ、公式掲示板のログ、
FAQ、Google等で調べてからにしましょう。
努力の形跡が見られないとスルーされがちです。初心者?でも頑張れ!

吉里吉里スレ過去ログ倉庫
ttp://bbs.bokunatu.com/krkr/
吉里吉里2/KAG3雑談質問スレ_過去ログ
ttp://www.geocities.jp/kirikiri_log/

吉里吉里ダウンロードページ
ttp://kikyou.info/tvp/

ダウンロードしたアーカイブに含まれる「KAG System リファレンス」は
初心者にとって最も頼もしい教科書です。何度も繰り返し読みましょう。
■タグリファレンス … KAGの機能が網羅的、辞書的に載っています。
大よその機能(KAGでどんなことが出来るか)は把握しておきましょう。
■Tips/その他 … 陥り易いミスやより高度な使い方への足掛かりになる
数々のTipsが記載されています。
■TJSをもっと使うために
ゲームのインターフェイスをカスタマイズしたい、また
KAGの命令に無いことをしたくなったらまずここを読んでみよう。

必要に応じて>>3-5の公式掲示板や講座等を併用してください。
(併用に、紙媒体の参考本が欲しい人は、ダウンロードページにリストがあります)

前スレ ■吉里吉里/KAG/TJS雑談質問スレ■その24
http://toro.2ch.net/test/read.cgi/gamedev/1307083588/
0358名前は開発中のものです。2012/03/02(金) 07:54:17.60ID:sqZhAzFg
ものべのこれ吉里吉里なのかすごいな
0359名前は開発中のものです。2012/03/02(金) 08:00:11.37ID:iMtEUy5T
AsyncTriggerクラスの説明に
>AsyncTrigger クラスは、いったん吉里吉里に制御が戻った直後のイベント配信のタイミングにイベントを発生させるためのクラスです。

ってあるけど、吉里吉里に制御が戻るってどういうこと?
一行ずつtjsコード逐次実行してるんじゃないの?
イベントを全部処理し終わってアイドル状態になったときってこと?
「直後のイベント配信タイミング」って要するにいつなんだよ?
てか配信?発生と違うの?吉里吉里がイベント溜め込むのか?
そもそもイベントってマルチスレッドで並行処理されてるの?
それともイベントキューみたいなのに入るの?
さらにKAGのConductorが入ってくるともうわけわかんね

この辺突っ込んだ解説してるサイトとか本とかないですか?
0360名前は開発中のものです。2012/03/02(金) 10:25:49.28ID:h0TU5s7t
>ってあるけど、吉里吉里に制御が戻るってどういうこと?
スクリプトの実行がおわったとき
>一行ずつtjsコード逐次実行してるんじゃないの?
してます
>イベントを全部処理し終わってアイドル状態になったときってこと?
そんな感じ
>「直後のイベント配信タイミング」って要するにいつなんだよ?
他のイベントハンドラの処理が終わったとき
>てか配信?発生と違うの?吉里吉里がイベント溜め込むのか?
ためこみます
>そもそもイベントってマルチスレッドで並行処理されてるの?
されてません
>それともイベントキューみたいなのに入るの?
非同期イベントはイベントキューに入ります
>さらにKAGのConductorが入ってくるともうわけわかんね
がんば
>この辺突っ込んだ解説してるサイトとか本とかないですか?
ないです
0361名前は開発中のものです。2012/03/02(金) 18:35:45.87ID:iMtEUy5T
まさかの全レスありがとう
こういうのって経験則で掴んでいくしかないのかな
Conductorはソースあるから読めばわわかるんだろうけど
0362名前は開発中のものです。2012/03/02(金) 19:45:14.94ID:j+yb+4hj
ソースは全部あるじゃん
0363名前は開発中のものです。2012/03/02(金) 21:17:59.01ID:jYQpct92
>>357
バイナリデータをbase64とかで圧縮して送るのがわかりやすいんじゃね
0364名前は開発中のものです。2012/03/02(金) 21:18:21.61ID:jYQpct92
base64は圧縮じゃないけど、まあ
0365名前は開発中のものです。2012/03/03(土) 19:48:13.72ID:dgdqA+pF
>>360
これ俺も知りたかったサンクス
0366名前は開発中のものです。2012/03/04(日) 01:50:35.57ID:3HGpDNwg
普通に配布されてるのではないとはいえマルチスレッド吉里吉里みたいのも出てきたし、

>>そもそもイベントってマルチスレッドで並行処理されてるの?
>されてません

みたいなまとめがあるのは良いことな気がする
0367名前は開発中のものです。2012/03/04(日) 02:25:49.44ID:futbCa+6
マルチスレッド版って公式に差し替えされないの?
何か前に処理速度のサンプル募集してた気がするけど
0368名前は開発中のものです。2012/03/04(日) 03:52:28.22ID:xFJ8klA6
公式のバイナリ(開発版)には既にはいってるで>マルチスレッド版

マルチスレッドっても描画処理がマルチスレッド、でイベントモデルは従来通り
0369名前は開発中のものです。2012/03/04(日) 04:00:44.83ID:futbCa+6
おぉ、もう入ってたのか
色んな処理が全部マルチスレッドになればいいのに
つってもそんな処理速度を求められる事とかそう無いだろうけど
0370名前は開発中のものです。2012/03/04(日) 04:06:35.81ID:futbCa+6
System.drawThreadNumってのがもうあったのか、今知った
0371名前は開発中のものです。2012/03/04(日) 11:46:35.49ID:wyiUjJC/
マルチスレッドうんぬんで騒ぐ奴はこの程度の知識
マルチスレッドが何なのかも知らない
0372名前は開発中のものです。2012/03/04(日) 15:08:53.31ID:UWhW+okG
>> 334
試してみたらうちでもそうなった。
バグかも?報告してみ。
0373名前は開発中のものです。2012/03/04(日) 15:30:13.25ID:UWhW+okG
ソース見たら、System.drawThreadNum って吉里吉里 2.32では主に BeginThreadTask()
から参照されてて、レイヤーの Fill/FillColor/BlendColor/RemoveConstOpacity/
FillMask/CopyRect/Blt/InternalAffineBlt からしか使用されてないみたい。
実際設定しても、(特に自前でdll書いたりしてると)あまり変化はないね(Corei3の
2core/4threadで確認)。
こういうinternal infoってどっかにまとめておきたいなぁ…
0374名前は開発中のものです。2012/03/04(日) 15:31:42.80ID:3HGpDNwg
http://hpcgi1.nifty.com/gutchie/wifky/wifky.pl
吉里吉里系のWikiみたいのって、実質個人のWebサイトと変わらないここくらい?
0375名前は開発中のものです。2012/03/04(日) 15:51:41.76ID:O4CJQmyV
何でもかんでもマルチスレッドにすれば性能が向上するわけじゃない。自分で書いてみればわかる。
排他処理やらスレッド生成やら色々オーバーヘッドが生ずるわけだしね。
再現性低いバグが仕込まれる原因にもなる。
0376名前は開発中のものです。2012/03/04(日) 15:53:40.76ID:3HGpDNwg
基本的にはGPUに頼らないがゆえに重くなりがちな
画像処理の効果期待だよねえ
0377名前は開発中のものです。2012/03/04(日) 17:34:03.56ID:UWhW+okG
実際、画像処理は確かに重いから、自前dll書く時は自力MultiThread化を
考えた方がいいかもしれないね。ちょっと自分のdllをMultithread化して
みよう。
GetAdaptiveThreadNumの引数が(w*h, 150)とか(w*h, 84)とか(w*h, 66)とか
なんか根拠あるのかなぁ。「XXで実測した結果」とかだったら書いといて
欲しかった…。
0378名前は開発中のものです。2012/03/04(日) 18:57:33.27ID:YfdVm6Tu
>>354
遅くなりましたが、ありがとうございます。
TJSの方はまだ全く理解できていないのでがんばってみます!
0379名前は開発中のものです。2012/03/04(日) 21:09:03.54ID:gQsfb15X
>>362
オープンソースってこと忘れてた
いい機会だししーぷら覚えようかな
0380名前は開発中のものです。2012/03/04(日) 21:37:46.86ID:1YG55LbR

教えて頂きたいんですが、ボタン等を非表示にしてる最中に、
“ボタンの上にマウスが乗った”イベントが発生しない様にする方法は
ありませんか?

簡単に言うと、TJSでボタンレイヤを作成し、3つ程並べており、
更に以下の機能を設定してるとして下さい。
@.マウスカーソルが乗った場合、そのボタンの説明ウィンドウが出る。
A.ボタンをクリックすると、説明ウィンドウ含めて全て非表示にする。

んで、ボタンをクリックした瞬間にマウスを動かすと、非表示中に@の処理が
起動してしまうらしく消したはずの説明ウィンドウが表示されてしまうのです。
一般的な対象方法含め、良い方法があれば教えて頂きたく、宜しくお願いします。
0381名前は開発中のものです。2012/03/04(日) 21:39:20.74ID:UWhW+okG
>> 362
ソースがあっても、377のように「なぜそう書かれているのか」がわかんない
ことがあるから、何でも分かるわけじゃないんだよね。ご注意を。
書いた「意図」を残す意味で、コメントとか仕様書とかって大事なんだけど、
そのあたりが吉里吉里には不足しているので困ってる。
0382名前は開発中のものです。2012/03/04(日) 21:57:16.14ID:eCt8kvZy
>>380
ボタンをクリックした場合の処理の中でフラグを立ててるようにして、
マウスが乗った場合の処理の中ではフラグが立ってない場合のみ説明が出るようにする
ということでいいんじゃね
0383名前は開発中のものです。2012/03/04(日) 23:00:20.33ID:xFJ8klA6
>>381
吉里吉里は典型的な Borland C++ の VCL のForm ベースプログラムだよ
特に変なことはしてないのでわざわざ仕様として書く必要が無いんだと思われ。

そっちの仕様を把握した上で、個別機能モジュールの *Intf.h のコメントみつつ、
TTVPMainForm と TTVPWindowsForm の実装を順に追えば基本は理解できるんじゃないかな
0384名前は開発中のものです。2012/03/05(月) 00:45:05.55ID:CBgYJhyB
>>382
早急な解答ありがとう御座います。その方法で対応しました。

もう1点質問なんですが、爆発エフェクトを発生させるTJSを作成したのですが
仕様としまして、爆発の画像データを読み込んでおき、エフェクトは別途発生タイミングで
レイヤを生成、assignImagesで画像を共有し、エフェクトを表示後、廃棄としているのですが
どういう訳か、多数の廃棄を繰り返すと、開放や非表示が遅くってしまいます。
何故か、setImagePosでの表示切り替えは遅くならないのですが、非表示にする時や
レイヤを開放する時だけ遅くなり、処理落ちでは無く、しばらくしてもこの現象が治りません。

エフェクトレイヤは、Dictionary型に格納しており、開放できている事は、countで確認しております。
開放に失敗し、レイヤが異常な数になっている訳ではなさそうです。
因みに、エフェクトレイヤを3個くらいずつ作る分には、この現象はおきません。
色々試して結果、25個くらいずつで発生しております。

可能性としまして、invalidateで開放が上手くいかないパターンがある。
または、Dictionaryに随時追加&削除を大量にしているのが問題と考えましたが、
対処方法は全くわからず、困っております。
この現象の回避方法がわかりましたら、教えて頂きたく、宜しくお願いします。
0385名前は開発中のものです。2012/03/05(月) 01:07:51.24ID:WsWfRU6H
>>384
分からんけどSystem.doCompactでガベコレ走らせてみるとか
Shift+F12押せばコンソールにレイヤ構造出力されるからちゃんとレイヤなくなってるかはそれでチェックできる
0386名前は開発中のものです。2012/03/05(月) 16:38:26.92ID:ogqGQR0A
せっかくなので、ソースから読み取れる吉里吉里のイベント処理のおおまかな解説など

1. 吉里吉里本体がウインドウメッセージや内部処理からイベントを生成する
・ウインドウ/レイヤ系/サウンド系のイベントは即配信されてTJS実行
・タイマやトリガは指定の優先度で吉里吉里のイベントキューに積まれる
・プラグインからも TVPPostEvent でイベント登録可能

2. TJSイベント処理呼び出し開始タイミング
一連のウインドウメッセージの処理が終わったタイミングでアイドル処理としてTJSイベント配信処理が開始(Application->OnIdle 経由)
・contfreq=0 で continuous handler 動作中は強制でアイドル処理が呼ばれ続ける
・イベントキューにイベントがつまれた時はダミーのウインドウメッセージを発行するので必ず次のアイドル処理もおこる
・50msに一回、終了判定やガベージコレクト処理起動なども含めたイベント配信がある(TVPMainForm::SystemWatchTimerによる)

3. TJSイベント処理。処理入り口は TVPDeliverAllEvents()
(1)優先イベント>通常イベントの順でTJS呼び出し
(2)アイドル系処理
a. アイドルイベントのTJS呼び出し
  b. フラグが立っていれば continuous handler のTJS呼び出し
c. ウインドウ画面更新イベントの処理(更新があった場合それを実画面に反映)

(1)用の優先イベントがある場合はそれが無くなるまで(中途で積まれた場合も)(2)のアイドル系処理はとばされて次の回送り
(2)b. の continuous handler は以下の場合に動作フラグが立ちます
・vsync 待ち有りならその直後
・vsync 待ち無しで contfreq=0 の時は毎回
・vsync 待ち無しで contfreq>0 なら指定fps相当のインターバル経過後

画面更新はアイドル処理時のみで描画処理用にタイミングをあわせるには、continuous handler か atmAtIdle なトリガが適切ということになります。
vsync 配慮するなら continuous handler のほうがちらつきにくいタイミングになります
レイヤのトランジション処理や KAG の Mover は continuous handler を使ってます
0387名前は開発中のものです。2012/03/05(月) 16:51:16.59ID:ogqGQR0A
☆ハメポイント
・シングルスレッドモデルなのでTJS呼び出しは単純な無限ループだけで busy loop になって中断不能。
・TVPPostEvent 含めて別スレッドからの吉里吉里機能呼び出しは Windowプロシージャの経由が必要
・contfreq=0 での continuous handler は画面は更新されるがCPUを食い尽くす
・トリガでイベントを無限呼び出ししたりするとこれもCPUを食い尽くす
・優先イベントを無限呼び出しすると画面更新無いままCPUを食い尽くす

トランジション時に液晶が鳴いたりするのは、無制限呼び出しで、限界まで更新処理がはしることによるものです。
比較的新しい版の吉里吉里では -contfreq で抑制可能になっているので、多用するなら指定していたほうが良いです。

トランジション処理は selfupdate=true なら continuous handler での更新が無いので、
自前で Timer と AsyncTrigger などで処理するようにすれば continuous handler を一切使わないことも可能です。
Vista 以降だと vsync を意識する必要はなくなってるはずなので、そちらのほうがむしろ構造としてはシンプルかもしれません

0388名前は開発中のものです。2012/03/05(月) 19:27:21.66ID:ndoR4mUH
>>387
保存した。勉強になりますた。

どうせなので聞きたいのだけど、
>・TVPPostEvent 含めて別スレッドからの吉里吉里機能呼び出しは Windowプロシージャの経由が必要
別スレッドから呼んだら駄目なのは各機能がスレッドセーフでないからだと思うのだけど、
「Windowプロシージャを経由して呼び出す」のは具体的にどういった方法でしょう。
よかったら教えてください。
0389名前は開発中のものです。2012/03/05(月) 20:04:43.90ID:ogqGQR0A
>>388
ウインドウプロシージャはOSによって吉里吉里本体同様にメインスレッドで単独で走ることが保証されてるので、
・自前で不可視のウインドウクラスとそのウインドウを作ってそのプロシージャに吉里吉里を呼び出す処理を書く
・スレッドにはそのウインドウの HWND を受け渡す
・スレッドからその HWND を指定して PostMessage
これで処理できる。

吉里吉里内部だと、Borland C++ の便利関数を使ってる。
例えば win32/WaveImpl.cpp 中の以下のような処理
UtilWindow = AllocateHWnd(UtilWndProc);
これで準備した内部ウインドウに
::PostMessage(UtilWindow, WM_USER+1, 0, 0);
これでメッセージおくってる

VCで書かれたプラグインの例だと、httprequest プラグインは吉里吉里の Window を使って目的の処理を実装してる。
Window クラスに HWND とる口と、任意のメッセージIDに対するプロシージャを登録する口 ( Window.registerMessageReceiver )
があるのでそれで対応できる。

ただ、吉里吉里のウインドウはフルスクリーンまきこまれも配慮する必要があって対応が面倒くさいので、
今新規に作るのなら shellexecute プラグインでやってるように、Win32 API で自前で窓を作って対応するほうが
プラグインの独立性も保ちやすくて良いと思います
0390名前は開発中のものです。2012/03/05(月) 20:34:37.62ID:FyR5V9Dq
うーん難しいなあ
>>386の見出し1.2.3.は処理の順番?

疑問なんだけど、タイマーって時間がきたら実行されるじゃん?
そのときに吉里吉里が他のイベント(たとえばボタンクリックとか)を処理してたら
それが終わるまでonTimerは発生しないの?
でもそれだと時間どおりに実行される保証はないよね
0391名前は開発中のものです。2012/03/05(月) 20:46:50.28ID:ndoR4mUH
>>389
理解できました、ありがとうございます。
shellExecute のソースが分かりやすかった。

すると、スレッド間同期とかいらない処理(ログ出力等)はウィンドウプロシージャに次々丸投げして行けばおkなわけか。
これは目から鱗。
0392名前は開発中のものです。2012/03/05(月) 21:17:20.78ID:ogqGQR0A
>>390
その通りです。吉里吉里はリアルタイムシステムじゃありません。
Timer は「指定時間以降いつか実行される」というもので正確な時間保証は皆無です
0393名前は開発中のものです。2012/03/05(月) 21:31:52.37ID:FyR5V9Dq
.NETのタイマーに慣れてたもんで、マルチスレッドじゃないのにタイマー?
ってどうも納得いかなかったけどそういうことなのね
ひとつスッキリしたわありがとう
0394名前は開発中のものです。2012/03/05(月) 21:33:03.89ID:JZE2rLef
90年代からゲーム作ってた奴はむしろ理解しやすそうなんだけどねw
03953842012/03/05(月) 21:36:08.62ID:CBgYJhyB

>385
ご回答ありがとう御座います。
教えて頂いた方法で確認しましたが、レイヤは開放されており、
System.doCompactも効果ありませんでした。

しかしながら、タスクマネージャにて確認した所、使用メモリが
がんがん増えて行き、全く開放される気配がありませんので、
レイヤはなくなっているが、メモリの開放が行われない状態の様です。

もう少し頑張ってみます。
03963842012/03/05(月) 23:56:46.50ID:CBgYJhyB
とりあえず、原因はわかりました。
Dictionary型にアニメーション用の情報classを随時追加、削除を繰り返してるんですが
削除の時にメモリが開放されないみたいです。
classだからいけないのか、Dictionary型に大量に追加削除してるのが行けないのか・・・。

0397名前は開発中のものです。2012/03/05(月) 23:58:16.18ID:JZE2rLef
できるだけシンプルにして、それでも同一現象が起きる状況が確認できたら
コード晒してみたら?
0398名前は開発中のものです。2012/03/06(火) 09:28:54.59ID:nc9fIAbJ
KAGEXのDialogLayer.tjsなんですが
DialogLayer.addButtonメソッドの後半、linksに情報詰める所で
links[numLinks] = %[
(略)
x : [x],
(略)
];
となってるんですがどういう意味なんでしょうか?

dmでxの中身見てみたらどうも要素数1の
配列オブジェクトができてるみたいですが
普通にx:x, ではダメなのか、意図がよくわかりません。
0399名前は開発中のものです。2012/03/06(火) 10:33:43.35ID:FBndGo9D
要素の初期値指定して配列宣言してるだけ
var x = [1,2,3];
とかと同じ
コード読んでないから意図は知らない
0400名前は開発中のものです。2012/03/06(火) 13:32:41.01ID:1MnIrtpM
>>398
KAGのMessageLayerのlinksでも配列になってるからそれに合わせたんじゃね
MessageLayerの方だとハイパーリンクで実際に複数点使ってる
0401名前は開発中のものです。2012/03/06(火) 19:20:13.82ID:nc9fIAbJ
>>399
変数を[]で囲むと特別な意味があるのかと勘違いしてました。
確かに配列宣言の形ですね。お恥ずかしい・・・

>>400
MessageLayer確認しました。
そういうことだったんですね。
ありがとうございました。
0402sage2012/03/06(火) 23:03:55.75ID:wMvjlXw/
初歩的な事なのですが、吉里吉里設定を開く事ができないのですが、その様な例は
あるのでしょうか?
いろんなサイトを捜してみても、その様な自体の事を書かれているのを見つけ出す
事が出来ないのですが……
ちなみに使用していますパソコンのOSは「Windows Vista Service Pack 2」なの
ですが「krkrconf.exe」を開こうとしても「指定されたファイルは吉里吉里実行可
能ファイルではありません」と出て、開けないのですが
何か参考になる事がありましたら、お知恵をお貸し下さい
0403名前は開発中のものです。2012/03/06(火) 23:43:01.09ID:8wJHNmyJ
>>402
一応確認しておくが
[krkrconf.exe を起動]→(ファイル選択ダイアログが出てくる)→[krkr.eXe を選択して開く]
あるいは
[krkr.eXe を krkrconf.exe のアイコンにD&D]
この手順を間違いなくやっているよな?
まさか krkr.eXe 以外のファイルを krkrconf.exe で開こうとしたりしていないよな?
0404名前は開発中のものです。2012/03/06(火) 23:52:27.62ID:qLqch5LN
>>402
初心者だから見当外れだったら悪いんだけど…制作していくゲーム内の設定で良いなら、とりあえずここの手順に添って、
ttp://kagru.web.fc2.com/index.html
明日のためにその2、の項で拡張子を書き換えたConfig.tjsを触れば変えれるけど…そういうこととは違う?
0405名前は開発中のものです。2012/03/07(水) 07:42:49.38ID:olErW+j5
すみません、ちょっと教えて下さい。
下のコードを実行するとコンソールにtrace1とtrace2が表示されるのですが
trace1で停止させるにはどうすればいいのでしょうか?

[iscript]
kag.conductor.sleep();
kag.conductor.interrupt();
kag.process( ,"*test");
[endscript]
[trace exp="0"]

*test
[trace exp="1"]
[s]
[trace exp="2"]
[s]

実際には右クリックメニューを表示する際に一度KAGを止めて、
メニューに応じて該当シナリオファイルにジャンプさせたいのですが、
ジャンプ後の[s]タグで止まってくれずに困っています。
0406sage2012/03/07(水) 08:38:16.25ID:v7/O0XUO
>>403
「kirikiri2」の中にある「Tools」を開いて「krkrconf.exe」を実行したら
(ダブルクリックまたは管理者として実行するを選択)『吉里吉里実行ファ
イルの選択』が表示されるのですが、内容は「Tools」の内容と同じで、再び
「krkrconf.exe」を始めとするアイコンが表示されてしまうだけで、表示さ
れる筈の指定されている「krkr.eXe」に辿りつく事ができないのです。
これが堂々巡りで続いてしまっております。
何か勘違いをしている可能性もありますが、何卒お教えを御願いいたします。


>>404
アイコンの変更などをしたいと思っていますので、吉里吉里設定を開いて変
更を考えております。
お答えをありがとうございます。
0407名前は開発中のものです。2012/03/07(水) 08:45:02.60ID:eHaO3qaN
言ってる意味がよく分からないんだけど
その「吉里吉里実行ファイルの選択」で
指定したいkrkr.eXeの入ってるフォルダを選んでexe指定するんじゃないのか
0408名前は開発中のものです。2012/03/07(水) 18:38:23.22ID:evKFU447
>>406
それ、「ツールの使い方が分からない」じゃなくて「Windowsの使い方が分からない」だろ。

あんたは上に[ファイルの場所]のプルダウンとか[1つ上のフォルダへ]とか見えない人間なのか?
直接パスを打ち込んでファイル指定したりできない人間なのか?
ツールにファイルをD&Dして起動したりしたことない人間なのか?
やりかたは既に >>403 に書かれてるぞ。
0409名前は開発中のものです。2012/03/08(木) 03:19:56.18ID:V1H9mFWq
> [krkr.eXe を krkrconf.exe のアイコンにD&D]
これ初めて知った
一々フォルダ辿らなくて良かったのか、なんという事だ
0410sage2012/03/08(木) 07:03:17.97ID:Ki8C0egQ
>>408
>>409
> [krkr.eXe を krkrconf.exe のアイコンにD&D]

言われて、その方法があるのを思い出しました。
いろんなサイトで一般的に書かれている方法しか頭に無く、その方法を繰り返して
応用と言うか他の手段を試すのを失念していました。
ありがとうございます。
0411名前は開発中のものです。2012/03/08(木) 22:58:16.78ID:LeaoJI2v
メニューバーを自作の画像に差し替えようとしてるんだけど
弄る部分の取っ掛かりが見つからない。

何かヒントを貰えないだろうか?
0412名前は開発中のものです。2012/03/08(木) 23:57:15.22ID:f3YDfk0Q
メニューバーを非表示にするとか
0413名前は開発中のものです。2012/03/09(金) 00:15:20.61ID:kuOGSWSZ
アプリケーションのメニュー バーのことを言っているなら、あれはWindowsのGUIによるものだから
ネイティブプラグインから WinAPI を直に叩いてハック紛いのことをしないと差し替えるのは無理だろうね。

自分でデザインしたいなら >>412 の言うように Config.tjs の menu.visible を false に設定して
TJS なりで独自のメニューを組むのが常套手段。
0414名前は開発中のものです。2012/03/09(金) 12:07:09.38ID:PJQ4n6y3
>>412,413

なるほど、あの表示はOSなのか。
どうりでsystemフォルダを探しても、バーの画像や指定が見つからないわけだ。

ありがとう、ちょっと難しそうだけど非表示にして独自のを実装できるよう頑張ってみるわ。
0415名前は開発中のものです。2012/03/09(金) 22:48:44.86ID:MwJ8EbQD
kagのタグである変数が偽になったら動作させるようなものってあるのでしょうか?
またはtjsを使用すれば実装するのは可能なのでしょうか?


[eval exp="tf.hoge=true"]
[tf.hogeが偽の時に処理したいもの]←tf.hogeが真なのでまだ処理させない



[eval exp="tf.hoge=false"]←このタイミングで処理を開始する
0416名前は開発中のものです。2012/03/09(金) 22:57:09.41ID:0dNvDIdz
hoge.ksにでも処理したい内容書いておいて必要になったら[call storage=hoge.ks]するんじゃなんでダメなの?
0417名前は開発中のものです。2012/03/09(金) 23:03:30.24ID:WRzedZvN
>[eval exp="tf.hoge=false"]←このタイミングで処理を開始する

変数を自分で変えるんならこのときに一緒に呼べばいいんじゃないの?
頻発するんだったらマクロ化しちゃううとか
0418名前は開発中のものです。2012/03/10(土) 11:55:38.86ID:cEhuOf3C
何か古いツクールっぽい発想の仕方だな
あれで自作メニューとかやると、常時イベント監視させて、条件が揃うと動くような仕組みになるから
他の人が言うように、変数動かすならそのタイミングで走らせればいいだけだし
キー押された時にするなら、キーにそのイベント割り当てればいい
0419名前は開発中のものです。2012/03/10(土) 13:16:32.43ID:e93HhPq4
TJS分かるんならwaittrg使えばいいんじゃないの
0420名前は開発中のものです。2012/03/10(土) 14:30:55.26ID:Inxy9ed1
トリガ発砲するところで直接処理すればいいじゃん
0421名前は開発中のものです。2012/03/10(土) 15:34:03.36ID:RAbamJYg
377 に触発されて、自作の画像処理dllをマルチスレッド化してみた。
全然速度が上がらないから実測してみたら、CreateThread()や
_beginthreadex()が思いのほか遅く、Core2Duo 2GHzで一回あたり
0.15〜0.2msもかかるから、いろいろあわせて4threadだと生成する
だけで1ms近くかかっていたことがわかった。
スレッドをいちいち生成しないように、スレッドプール作って実行すると、
CPUコア数(HyperThreadは効果薄かった)分くらいまでは大体リニアに
性能が上がった。
今の吉里吉里もマルチスレッド対応といいながら画面分割のたびに
スレッド作ってるから、そのあたりをちょっと変えればもっと性能
出そう。
1msってたいしたことないと思うかもしれないけど、殆どの画面
処理は1ms以下で終わるから、それに比較するといちいちCreateThread()
するのは遅すぎる、という話。

自作dllのマルチスレッド化を考えてる人への参考までに。
0422名前は開発中のものです。2012/03/10(土) 15:46:29.47ID:qb2cL6Mn
ほほう。
吉里吉里本体側に汎用でコア数分のスレッドプールもっておいて、プラグインから
それの呼び出しを要求できるような口があれば一番いいのかな。
0423名前は開発中のものです。2012/03/10(土) 17:38:07.34ID:RAbamJYg
>>422
そうそう、作ってる間、そういうのがあればいいのに、と思ってた。

ただ、staticなglobalの関数を呼ぶならともかく、任意のクラスの
任意のメンバ関数を外から呼び出すのが難しいので、結局テンプレートで
作るしかないから、汎用化は難しそう。
void startThread<T>(T *instance, T::*func, void *arg);
みたいなプロトタイプならO.K.だけど、これだとスレッドプールは
クラスTごとに別になってしまうし。
# 別になってもスレッドが寝てるだけならパフォーマンスに影響しない
# からアリだけど。

結局、今はATLのCThreadPoolを継承して、上のような関数を間に
はさんでなんとかしているけれど、やっぱり少し使いにくい…。
0424名前は開発中のものです。2012/03/10(土) 17:53:53.33ID:upTpN72g
シグネチャを統一したいなら boost::function とか使ったらどう?
というか Boost.Thread を(ry
0425名前は開発中のものです。2012/03/10(土) 18:23:42.49ID:qb2cL6Mn
吉里吉里のプラグインインターフェース的には、呼び出し登録は全部C関数+voidポインタ一つ、
だけで、任意のクラスのメソッドよびたければラップ関数渡せ、でいいんじゃないかな。
他の機能でもけっこうそのスタイルのものあったと思うし

今の仕事の山が終わったらちと検討して組み込み考えてみるよ。
無事できたら取り込んでもらおう
0426名前は開発中のものです。2012/03/10(土) 18:40:58.29ID:fmDkgpuF
吉里吉里本体のマルチスレッドは、最初の一回だけCreateThread()したら、あとは破棄せずにプールしてますよ?
0427名前は開発中のものです。2012/03/10(土) 18:54:57.87ID:qb2cL6Mn
と思いつつ、作った人にきいて&眺めてみたらプールしてますがな>マルチスレッド描画
既定値とずれてるときに増減してるだけで、通常はすっとばされるはずだからこれは誤差の範囲じゃないかな……

以下を stub 側に公開すれば事足りそう

GetThreadNum/GetAdaptiveThreadNum/BeginThreadtask/ExecThreadTask/EndThreadTask
0428名前は開発中のものです。2012/03/10(土) 18:56:34.50ID:fmDkgpuF
ちなみに吉里吉里の描画スレッド処理がそこまで極端に効率の
上がらない理由は、スレッド処理が「レイヤの1命令実行単位」
になっているせいで、元々マルチスレッド化される処理の時間
単位がかなり短めなせいです。

特に吉里吉里はその部分はもともとコード最適化されちゃってるんで(^^;

重いアフィン処理を面積の大きいレイヤに対して適用すると理論値に
近い速度が出るようになりますよ。
0429名前は開発中のものです。2012/03/10(土) 19:04:34.18ID:fmDkgpuF
GetAdaptiveThreadNum() は、実際にスレッド分割する必要があるかどうかを
実行する処理の処理ピクセル数から事前予測する関数なんだけど、処理ごとに
負荷がどのくらいかピクセル数に任意の「係数」をかけて計算するという極めて
adhocな実装なので、公開してもあまり意味が無いかも…。

公開するなら GetThreadNum/BeginThreadtask/ExecThreadTask/EndThreadTask の4つで。
0430名前は開発中のものです。2012/03/10(土) 19:15:55.53ID:fmDkgpuF
ちなみにGetAdaptiveThreadNum()の実装はこんな感じ。

static tjs_int GetAdaptiveThreadNum(tjs_int pixelNum, float factor)
{
if (pixelNum >= factor * 1000)
return GetThreadNum();
else
return 1;
}

処理ピクセル数がfactorに1000掛けた値以下なら分割処理するように
してます。

一番軽いFill処理でfactorが150くらいなので、割と大きな面積でない
と分割処理がされないようになってるのがわかるかと思います。
0431名前は開発中のものです。2012/03/10(土) 19:16:24.36ID:fmDkgpuF
こういう風になっている最大の理由は、「あらゆるPC環境でパフォー
マンスの悪化を起こすことなく最大限のパフォーマンス向上を達成する
ため」です。

Corei7などの最近のCPUならこんな回りくどいことをせずに「必ず分割」
してしまっても最大限の高速化効果が得られるんですが、特に古いマルチ
コア環境の場合、スレッドを起こす処理だけでもけっこうなオーバーヘッド
があって、処理面積が小さいのにスレッド処理を行うとむしろパフォー
マンスが悪化するケースが多々ありました。

本当はスレッドを起こす速度を計測したりして個々の環境で敷居値を決定
するべきだったのですが、精密に測定する方法が思いつかなかったので断念。

吉里吉里コアは様々なPC環境で動かされるプログラムなので、古い環境で
実行速度が遅くなるような変更を加えるわけにはいかず、最大公約数的に
現在の実装に落ち着いています。
0432名前は開発中のものです。2012/03/10(土) 19:24:59.08ID:fmDkgpuF
本当はマルチスレッドの効果を最大限に得るには、吉里吉里の描画
パイプラインを見直してスレッド生かしたまま複数の描画処理を並列
実行出来るようにするべき…なんだけどシングルスレッド前提の
吉里吉里の設計で後付けでそれやるのは難し過ぎました。

吉里吉里3は最初からそういう方針で設計しているようですね。
0433名前は開発中のものです。2012/03/10(土) 19:30:10.27ID:RAbamJYg
>>426-431
説明ありがとう、よくわからなかった部分がものすごくクリアになったよ。
そうか、TVPThreadListはプールのことだったんだね。これは俺の勘違い。
みんなごめんなさい。このあたりソースにコメント一言書いてあれば…。

でも、ExecThreadTask()で呼べるのはやっぱりグローバルな関数だけ
なんだね。そのうえstaticで外から呼べないから、クラスのメンバ関数
実行したいなら、やはり自分で何か書くしかないかー。

> 公開するなら GetThreadNum/BeginThreadtask/ExecThreadTask/EndThreadTask の4つで。

これは期待。そうすれば外付けdllの作者がいろいろやりやすくなるから。
…できればメンバ関数も呼べるようにして下さい。
0434名前は開発中のものです。2012/03/10(土) 19:33:37.85ID:fmDkgpuF
メンバ関数を直接呼ぶ形式はC++的に無理があったような。
「メンバ関数へのポインタ」は、相互にキャスト不能です。
主に仮想関数の実装の関係。
0435名前は開発中のものです。2012/03/10(土) 19:34:10.04ID:w0M7k379
吉里吉里3って本当に出るの? ていうかまだ作ってるの?
0436名前は開発中のものです。2012/03/10(土) 20:16:37.69ID:RAbamJYg
> 最初の一回だけCreateThread()したら、あとは破棄せずにプールしてます
あれ、BeginThread()中でTVPThreadListからpop_back()してるから、
スレッド数を減少方向に変更する時は削除してるのではないの?

なので、いろいろ実測してみた。
画面が複雑でいろんなサイズの画像が混在する(処理毎にスレッド数が
異なるようにした)上でレイヤ毎に処理すると、それぞれの処理のために
BeginThread()でスレッドの作成(削除は待たないの?)が頻発してて、
やっぱりここはネックのひとつになってるみたい。スレッドプールがひとつ
しかなくて、これを大きくしたり小さくしたりするからじゃなかろうか。
単純に「小さくしないようにする」だけで、結構マシになった。
スリープ中のスレッドが殆どリソースを食わないなら、いっそ減少させなく
てもいいかもしれない。どうせ今最大8までに制限されてるし。
ほかにデメリットあるかしらん。

> 「メンバ関数へのポインタ」は、相互にキャスト不能です。
そう、だから自前のスレッドプールテンプレート作って、処理(というか
クラス)毎にスレッドプールを別に持った方がいいかな、と思い始めたのです。
幸か不幸か今自前のはそうやって実現しちゃったし、これなら
外付けで実装できるし。「休眠スレッドはリソースを食わない」が
前提だけど。
0437名前は開発中のものです。2012/03/10(土) 20:37:51.88ID:fmDkgpuF
あれ、プールするスレッド数は「実際に処理するスレッド数」じゃなくて
「吉里吉里に指定した描画スレッド数」を基準に決めてるはずなのですが…。
プールの増減が起こるのは理屈としては、drawThreadNumプロパティを変更
した直後の一回のみ、のはず。
0438名前は開発中のものです。2012/03/10(土) 20:56:25.93ID:RAbamJYg
あー、わかった、テスト用にdrawThreadNumを内部でいろいろ変えてた
処理が間に挟まってた。はずすと確かに、性能的にはスレッド減少
させても大丈夫になった。
>>437
指摘ありがとう!

はからずもCreateTread()が重いことはまた確認できてしまったので、
自前のdllはやっぱりスレッドプール自前で持つようにしようかなぁ…。
0439名前は開発中のものです。2012/03/10(土) 21:12:56.64ID:qb2cL6Mn
>>433
任意のメソッドをC関数にラッピングするだけなら

template<class T>
struct MethodWrapper {
MethodWrapper(T &instance, void (T::*method)()) : instance(instance), method(method) {}
T &instance;
void (T::*method)();
static void callback(void *param) {
MethodWrapper *self = (MethodWrapper*)param;
((self->instance).*(self->method))();
}
};

こういうテンプレート作っておいて

class A;
A a;
MethodWrapper<A> wrap(a, &A::method);
entrycallback(MethodWrapper<A>::callback, &wrap);

こんなかんじで任意のクラスの任意のメソッド(ただし型は固定)に対応できるよ。
真の任意メソッド対応はパラメータのバインド処理も組む必要があるのでさすがにちょっとめんどくさい

それはさておき、公式のほうは公開メソッド化しておいたので、dee さんが次にコンパイルしてくれれば反映されます。
0440名前は開発中のものです。2012/03/10(土) 23:27:21.03ID:RAbamJYg
>>439、他の皆様
いろいろありがとう!とても助かったし、勉強になりました!

テンプレートは、そんなかんじのものをすでに実装済み。もうちょっと
カッコよくできないかなー、と考え中…
0441名前は開発中のものです。2012/03/11(日) 00:26:58.65ID:E/3gazfW
枯れてるソースに深いバグ入れるリスクを負うくらいならはじめから描画にGPU使ったエンジン作ったほうがいいんじゃないの?
広く普及してメンテもほぼ止まってるソースにGPU使いたくないからマルチスレッドなコードを
プロジェクト死ぬまでメンテするとか割りに合わないと思うんだけど。
TJS以上のことをするには吉里吉里は足かせになる。
0442名前は開発中のものです。2012/03/11(日) 00:31:28.80ID:6cDD+Cbb
そーだねえ
PC版吉里吉里は基本もうこのままでいいんじゃないかなあ、
せいぜい各自のプラグイン拡張くらいで

吉里吉里3が掲げているマルチプラットフォームも
吉里吉里Javaが成功すればできそうだし
0443名前は開発中のものです。2012/03/11(日) 01:01:35.83ID:riYvEJN5
>>441
意味不明。
CPUエンジンがマルチコア対応すすめるのはむしろ既定事項じゃん
誰も古いの使うなとか言ってないわけでどう拡張しようと自由だよ
0444名前は開発中のものです。2012/03/11(日) 01:03:41.99ID:6cDD+Cbb
進めるのはいいけどメリット薄いし、「とりあえず最新の落としておくか」ってやったら
既存の安定コードまでバグ混入してて原因不明の不具合に悩まされる可能性とかは
否定できないかな
0445名前は開発中のものです。2012/03/11(日) 01:32:42.25ID:riYvEJN5
杞憂だと思う。
古いの次々消すようなプロジェクトならともかく、履歴も明らかなわけで。

問題になるとしたら、履歴が dee たんちのマシンが死亡したら
ロストする可能性があるのと、コンパイル環境が不自由なことかね>吉里吉里
0446名前は開発中のものです。2012/03/11(日) 01:33:58.41ID:P9PL1KUI
>>441
いや、上のは自作dllのマルチスレッド化の話であって、もともと吉里吉里
本体がどうという話じゃないんだよ。たまたま使える関数をexportしてくれたら
便利じゃないか?というだけで。
それと、吉里吉里にGPU使うコード入れる方がよっぽどボード依存とかを長時間
背負うことになるから、それこそやらない方がいいと思う。自作dllに入れるなら
いいと思うけど。すごい基本的な部分だけ、ならなんとか…なるかも?

つついたことがある人ならわかるけど、やっぱりGPU使うのって互換性の
問題が大きいんだよねぇ。なんで3Dいっぱいの市販ゲームってあんまり
そのあたり問題にならないのか、逆に不思議。よっぽどエンジンが頑張って
いるのかなぁ。
0447名前は開発中のものです。2012/03/11(日) 03:07:25.93ID:tIU3gfm/
KAG
サウンドノベル形式と、下の方に2・3行のウィンドウ形式って
途中で動的に切り替えできますか?
0448名前は開発中のものです。2012/03/11(日) 03:19:03.28ID:nRzJafs9
出来ます
0449名前は開発中のものです。2012/03/11(日) 03:39:04.90ID:tIU3gfm/
ありがとうございました
0450名前は開発中のものです。2012/03/11(日) 03:59:51.38ID:Zl3ckZHs
>>446
国内の3Dバリバリなゲームってほとんどコンソール向けじゃない?
海外のPCゲーはめっちゃ人と金かけてるイメージ
優秀なエンジンもたくさんあるだろうけど
0451名前は開発中のものです。2012/03/12(月) 14:57:25.02ID:05jR40rs
シナリオ走らせると、鍵括弧とか濁点とか、記号で文字が数ピクセルずれるんだが。
文字を揃える方法ってありませんか?
0452名前は開発中のものです。2012/03/12(月) 15:05:39.41ID:8BFIJXpa
等幅系のフォントつかえ
0453名前は開発中のものです。2012/03/12(月) 15:12:58.32ID:05jR40rs
>>452
なるほど。試してみます。ありがとうございました。
0454名前は開発中のものです。2012/03/14(水) 00:09:36.41ID:aNBBAB53
TVPDrawThreadNum も外から使えるようにしてほしい…
0455名前は開発中のものです。2012/03/14(水) 21:40:48.07ID:aNBBAB53
マルチスレッドの話、便乗してテストしてみた。
色々試したら、SetEvent()→WaitforMultipleObjects()がやたらと遅かった。
代わりにクリティカルセッションにする(スレッドが一つでも動作している
間はクリティカルセッションにする)と、性能がリニアに上がる。
汚いのは承知の上で、TVPPongEventListを廃止して、
ExecThreadTask()の中、func実行前にTVPRunningThreadCount++ == 0 の時は
クリティカルセッションに入り、ThreadLoop中のループ末尾に
--TVPRunningThreadCount == 0 の時はクリティカルセッションから抜ける
ようにすることで、性能は出そう。
ただ、これだと汚いのと、本当に今の吉里吉里2だけのチューンになるので
どうかな、という気はする。
まぁ、一つの実験結果、ということで。
0456名前は開発中のものです。2012/03/14(水) 21:43:26.02ID:aNBBAB53
ああ、ごめん、書き忘れてた、WaitForMultipleObject() の代わりに
EnterCriticalSection(&thread_runnning_cs);
LeaveCriticalSection(&thread_runnning_cs);
が必要。
0457名前は開発中のものです。2012/03/15(木) 17:38:33.82ID:Pkh0sbP8
どうせ Win用のチューン部だし、OKなような。コードあっぷしようぜ
■ このスレッドは過去ログ倉庫に格納されています