:opengl_vsyncオプションの提案

47 views
Skip to first unread message

biangle

unread,
Jun 17, 2010, 1:34:51 AM6/17/10
to Star Ruby
はじめまして。

StarRuby、使いやすくていいですね。RPGの作成に利用しているのですが、
インタフェースがシンプルで、ドキュメントも整備されているので重宝しています。

ただ残念なことに、私の環境ではSDL_Flip()がうまく垂直同期を取ってくれず、
ティアリングが発生してしまいます。RPGの壁のような、縦方向の直線を横に
スクロールさせるアニメーションを描画すると画面の乱れが顕著になり困っています。

そこでSDL_OPENGL、SDL_GL_SWAP_CONTROLフラグを利用して垂直同期を
とるパッチを作成してみました。

以下のようにGame#runのオプションを指定することで、OpenGLを利用した
垂直同期が有効になります。

reqquire 'starruby'

StarRuby::Game.run(640, 480, :opengl => true, :opengl_vsync => true)
do |game|
...
end

パッチをアップロードしましたので、取り込みを検討いただけないでしょうか。
(内容の詳細は同梱のREADMEをご覧下さい)

以下、取り込みのメリット・デメリットを挙げてみます。

メリット:
・これまで垂直同期がとれなかった環境でも簡単に垂直同期が取れるようになる。
 (OpenGLが使えれば)

デメリット:
・モニタ周波数以上のFPS(90fpsなど)を指定しても強制的にモニタ周波数でゲームが動いてしまう。
・ビルドにOpenGLライブラリが必要になる。
・コードが複雑になる。Game構造体で管理するリソースが増える。
(既存の描画処理には手を加えないよう心がけましたが・・・うーん、どうでしょう?)

さほど大きなデメリットではないと考えていますが、いかがでしょうか。

また、1つ気がかりとして、OpenGLが使えない環境で:opengl => trueを指定した場合の仕様を
どうするか、ということがあります。現状のパッチではStarRubyErrorで落ちるはずですが、失敗したら
通常モードで起動を試みるほうがユーザに優しいかもしれません。合わせて検討いただければと
思います。

以上、よろしくお願いします。

Hajime Hoshi

unread,
Jun 19, 2010, 11:58:52 AM6/19/10
to star...@googlegroups.com
星です。

返信が遅れてしまい申し訳ありません。

> StarRuby、使いやすくていいですね。RPGの作成に利用しているのですが、
> インタフェースがシンプルで、ドキュメントも整備されているので重宝しています。

ありがとうございます。ドキュメントはまだまだ改善の余地があってなんとかしなきゃなあとは思っていますが。

> ただ残念なことに、私の環境ではSDL_Flip()がうまく垂直同期を取ってくれず、
> ティアリングが発生してしまいます。RPGの壁のような、縦方向の直線を横に
> スクロールさせるアニメーションを描画すると画面の乱れが顕著になり困っています。

どのような環境でしょうか。ディスプレイの垂直同期周波数はいくらでしょう。また、ゲームの FPS はいくらに設定されていますか。

SDL_Flip だと垂直同期しない環境があるのですね…。うーむ。

StarRuby の想定している環境で OpenGL が使えない環境というのをしらないので、 :opengl
オプションは要らないんじゃないでしょうか。 :vsync => true だけでよいかと。 Windows, Mac, Linux
だったら大抵 OpenGL が動くのではないかと思うのですが。

気になった点はそれくらいなので、若干の修正の上取り込みたいとおもいます。

ありがとうございました。

--
Hajime Hoshi <hajim...@gmail.com>

biangle

unread,
Jun 20, 2010, 5:11:18 AM6/20/10
to Star Ruby
星さん

返信ありがとうございます。

> > ただ残念なことに、私の環境ではSDL_Flip()がうまく垂直同期を取ってくれず、
> > ティアリングが発生してしまいます。RPGの壁のような、縦方向の直線を横に
> > スクロールさせるアニメーションを描画すると画面の乱れが顕著になり困っています。
>
> どのような環境でしょうか。ディスプレイの垂直同期周波数はいくらでしょう。また、ゲームの FPS はいくらに設定されていますか。

まず垂直同期周波数ですが、ディスプレイのハード側の設定が60Hz、Windows側の
モニタの設定(*1)も60Hzに設定しています。

ゲームのFPSは30Hz / 60Hzの両方を試してみましたが、どちらもティアリングが
発生します。またウインドウモード、フルスクリーンの両方で発生を確認しました。

 (*1) 画面のプロパティ -> 詳細設定 -> モニタ -> 画面のリフレッシュレート

> SDL_Flip だと垂直同期しない環境があるのですね…。うーむ。

気になって調べてみたところ、私の環境では SDL_HWSURFACE を要求しても
SDL_SetVideoMode() の返したサーフェスに SDL_HWSURFACE ビットが
立っていませんでした。

つまりウインドウモード・フルスクリーンモード共に、常にソフトウェアサーフェスが
使われています。SDL_Flip() はソフトウェアサーフェスに対しては垂直同期を
取らずに SDL_UpdateRect() を呼び出すだけらしいので(*2)、その結果ティアリングが
発生しているのではないでしょうか。

 (*2) http://www.libsdl.org/cgi/docwiki.cgi/SDL_Flip

> StarRuby の想定している環境で OpenGL が使えない環境というのをしらないので、 :opengl
> オプションは要らないんじゃないでしょうか。 :vsync => true だけでよいかと。 Windows, Mac, Linux
> だったら大抵 OpenGL が動くのではないかと思うのですが。

なるほど。確かにそうですね。私の考えすぎでした。

> 気になった点はそれくらいなので、若干の修正の上取り込みたいとおもいます。
>
> ありがとうございました。

おお!これまでパッチを送った経験がなかったので実は少しドキドキしていました。
採用ありがとうございます。

Rubyにもいろいろなゲーム開発ライブラリがありますが、私はStarRubyの
シンプルさが好きです。これかれも頑張って下さい。
Reply all
Reply to author
Forward
0 new messages