DxLib 改造計画



DxLibFanに戻る | DxEx Projectに戻る


予定コンテンツ^^;(いつか、本書きたいな〜〜)
  • マルチスレッドについて
  • タスク処理について
  • スクリプトについて
  • 他のライブラリといっしょに使うことについて
  • Susie Plugin に対応させる
  • データの管理について
  • マップエディタやモーションエディタ等について
  • 無理やり三次元を使うことについて・・・
  • シーンの管理について
  • エフェクトとか
2002年12月23日 発表の改造計画



研究事項

  • Q.DxLibでマルチスレッド化は可能か!

    A.DxLibの関数はスレッドセーフでないので、そのままでの使用は危険です。

    なので、CriticalSection(まぁ、スレッドをロックするものだと思ってください^^;)で守ってやる必要があるのだが、 すべてのDxLibの関数をCriticalSectionで守るコードを書くのって億劫・・・。
    それから、DxLibのたった一つの関数を呼び出すだけで、MultiThreadを犯してしまってはどうも、 MultiThread化した意味がないような気がするのだ。
    では早速、以下のような処理速度問題に付いて考えて見たいと思う。 私はどうも、CriticalSectionでDxLibの関数を毎回守ってやるのは遅いような気がするのだ。
    1秒=1000msec
    60fps出すゲームとなると1000/60は16.6666・・・およそ、1画面描画する時間が約16msec以内と考えられる。
    とりあえず、以下のようなコードで実験してみた。


    結果:
    平均CPU Clock:Debug:23539532.000000
           :Release:23304174.000000
           :DrawGraph無しRelease:6813.750000
    平均 (msec)  :Debug:13.980000
           :Release:13.940000
           :DrawGraph無しRelease:0.010000
    
    DxLibの関数を1回描画するまでに色々とあわせて、約100回呼び出すだろうと見積もり、測って見たが、 私の環境ではバリバリOK??かと思える結果が返ってきた。この調子ですべてマルチスレッド化してしまえばいいのだろうか??
    100回呼び出しで0.01msecの処理コストは安いか?ん〜〜。疑問である。
    それから、dkutilに付属されているReturn();という名にも処理をしない関数をLoop内1に入れて実験してみた。
    平均CPU Clock:Release:732.630005
    平均 (msec)  :Release:0.000000
    
    ん〜。msecの方は処理時間が短すぎて計測できないようで・・・ ちと、腑に落ちないので、もうちょっと厳密なコードを・・・。

    Returnするだけ:Release:903 
    DrawGraphだけ:23282797
    CriticalSection付きDrawGraph:23258500
    
    あれ?なんかCriticalSeciton付きの方が早いぞ!何故だ!!!!
    ・・・・・
    あ!!!Folding@homeつけっぱなしだ!!!!!!
    キタ━━━━(゚∀゚)━━━━!!
    何がきたのか分からないけど・・・再度計測
    • ソース1 DrawGraphだけ:13.830000 CriticalSection付きDrawGraph:14.060000 msec
    • ソース2 DrawGraphだけ:23021471 cpu clock CriticalSection付きDrawGraph:23413947 cpu clock
    CriticalSectionを呼び出すだけで 0.23 msec 392476 CPU clock の差。
    1ループにDxLibの関数を呼び出すのは多分、多い時に1000回なんてのもあるのかな?弾幕とかさ。
    となると、10倍で、CriticalSectionの処理だけで2msec使ってしまう。
    これはやばい。私のCPUはDDR MemoryでAthlon2000なのもここで明かしてしまうが、この環境でこのスコアは良くないのではないか?そう思う。 一回のLoopで16msecしか使えないのは前述した通りだ。
    CriticalSectionは比較的軽い処理だと言われているが、DxLibの関数をすべてCriticalSectionで覆ってしまうのは やっぱりナンセンスだと私は思う。
    後々調べたが、100回当たり判定とるだけでもたったの11 CPU clockである。
    やっぱり、何だかんだいってCriticalSectionで全部覆うのはやばい!!!
    このマルチスレッド問題に関して私は一つ、解決策を考えた。

    DxLibの関数はDxLib用のスレッドに任せて、オブジェクトの移動とかは別のスレッドに任せれば良いのではないか、 DxLibの関数の呼び出しは別スレッドが呼び出すのではなく、メッセージとして、キューに引数もろともぶち込んで、のちのちDxLib関数のスレッドに移った時実行すれば良いのではないか?と もちろん使うのはただのキューではなく二つのキューを使います。(ここがポイント)
    ではでは、この実装法に関しては後々...
    DxLibFanに戻る DxLibのダウンロードは以下から
    Dxライブラリ置き場
    DxLib Copyright(C) 山田 巧

    The program using DxLib.
    The text of this page.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送