トップページ > 記事閲覧
ドラッグ中の処理
名前:あふぉぐらま 日時: 2015/02/12 20:58

お初にお目にかかります、二年ほど前から便利に DXライブラリを利用させていただいているものです。 SetAlwaysRunFlag(TRUE);としてもタイトルバードラッグ中や、枠のサイズを変えている間、 処理が行われないことについて対処法はありませんでしょうか。 オンライン化やアタリ判定の問題で処理を止めるわけにはいかず、頭を抱えております。 もしかしたらマルチスレッドやウィンドウプログラムで簡単に対処できるのかもしれませんが、 その方面に詳しくないので私では役不足のようでした。 ご教授いただけると幸いです。
メンテ

Page: 1 |

Re: ドラッグ中の処理 ( No.1 )
名前:WISTERIA 日時:2015/02/12 22:46

>SetAlwaysRunFlag(TRUE);としてもタイトルバードラッグ中や、枠のサイズを変えている間、処理が行われない ということは、その間、 ProsessMessage()あたりから抜け出してくれないということでしょうか? だとするならば、その間に止まっては困る処理を別のスレッドで動かすのが一番現実的だと思います。 ただ、DXライブラリの一部の関数はDxLib_Init()を呼んだスレッド以外では正しく機能しないものもあるので注意です
メンテ
Re: ドラッグ中の処理 ( No.2 )
名前:あふぉぐらま 日時:2015/02/12 23:18

別スレッドで動かすのは一回やってみたのですが、(私の実装が悪かったのかもしれませんが)ほぼ動きませんした その時はProcessMassage()を(DxLib_Init()と)別のスレッドに追い出した場合最初のフレームのまま移動せず、 元のスレッドでProcessMassage()を空回りさせておいて別スレッドでゲーム処理を行った場合、最初のフレームも表示されませんでした (破棄してしまったためソースを出すことができません。ごめんなさい) マルチスレッドで実装するとなればどういった実装にするべきだったのでしょうか。 サンプルソースを提示いただけると幸いです。 あと別スレッドで動かすことができない関数というのはどういったものでしょうか。 ScreenFlip()などの表画面への描画は止まってもいいのですが、MakeScreen()などで作ったスクリーンへの 描画ができないとなると結構困ってしまいます。 主なものだけでもいいのでリストアップしてください。 お願いします
メンテ
Re: ドラッグ中の処理 ( No.3 )
名前:WISTERIA 日時:2015/02/13 07:53

hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3374 や他のスレにもあるように、DXライブラリの関数群は すべて同じスレッドで呼ぶことを前提としています。 大丈夫なのは3D関連の算術演算関数や衝突検出系関数くらいじゃないでしょうか。 (DirectXやWindowsAPIに関係するわけではないので。) したがって、DXライブラリを扱うスレッド(これはドラッグ中丸ごと止まる)と、 それ以外の止まっては困る処理をするスレッドに分ければいいのではないのでしょうか。 私自身マルチスレッドを組める環境に無いのでサンプルを出せず申し訳ないです。 オンライン化でしたらWinSockを直接叩くことでもよさそうです。バッファーがあるので 多少は止まってもいい気もしますが、そんなにリアルタイム性の高いゲームを作成されて いるのでしょうか?
メンテ
Re: ドラッグ中の処理 ( No.4 )
名前:あふぉぐらま 日時:2015/02/14 00:49

なるほど、大体わかりましたが私が望むような実装は難しそうです。 オンライン化については、UDPを使った通信するときタイムアウトしたときに切断したのか処理が止まったのか 通信相手側で判定したかったわけですが、この調子だとちょっと難しそうですね。。。 アタリ判定についてはフレーム時間に合わせて秒当たりの移動距離を一定にする処理を行っているため、 処理が止まると次のフレームで貫通してしまう問題がありました。 こちらはアタリ判定を工夫すればどうにかできそうです。 (とはいっても私の力では難しいかもしれませんが。そちらは話題がそれるため 別のトピックを立るつもりです) 「ラグで落ちるのはしょうがないとしてウィンドウをドラッグしたら落とされるオンゲーなんて」と思っていましたが、 ウィンドウモードだと処理が止まるのを回避できない前提で組む必要があったのですね。 フルスクリーンにするなどまだ対応策はあると思うので根強く頑張りたいと思います。
メンテ
Re: ドラッグ中の処理 ( No.5 )
名前:管理人 日時:2015/02/15 04:19

現時点で考えられる最善の方法は 「ゲームの進行処理やUDP通信を行う処理をDXライブラリの関数を一切使わないスレッドで行い メインスレッドはDXライブラリの関数呼び出しが必要な処理だけを行うようにする」 になると思います・・・( UDP通信もDXライブラリの関数ではなく別ライブラリか WinSock を直接使用する ) 上記のようにすれば、タイトルバーを掴んだりウインドウのサイズを変更したりしている際に 画面の動きは止まってしまいますが、ゲームの進行処理やUDP通信を行っているスレッドは止まらないので、 とりあえず「タイトルバーを掴むとUDP通信も停止して通信が切断される」ことは無くなると思います・・・
メンテ
Re: ドラッグ中の処理(解決) ( No.6 )
名前:あふぉぐらま 日時:2015/02/15 11:46

ありがとうございます。参考にさせていただきます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存