ページ 11

DirectXにてClear関数を呼んだとき

Posted: 2010年7月03日(土) 22:09
by MOT
現在、DirectX9を用いてプログラムを行っています。

ですが、IDirect3DDevice9::Clearを「ウインドウを最小化」して呼ぶと、IDirect3DDevice9::Clearが
失敗して描画が出来ずにプログラムが落ちてしまいます。

Clearの前にデバイスロストの解消する処理を入れたり、TestCooperativeLevelを呼んだりしてみましたが、
どうにもうまくいきません。

ウインドウを最小化する以外では何一つ問題が無いので完全に身動きが取れなくなってしまいました。

以前に同じ症状が出た方や、対処法が分かる方はぜひアドバイスをお願いします。

環境
OS : Windows Vista Home Premiunm
ライブラリ : DirectX 9
開発環境 : Visual Studio 2008 Professional

Re:DirectXにてClear関数を呼んだとき

Posted: 2010年7月03日(土) 22:30
by シエル
私も現在DirectXでゲームを作成していますが、そのような症状は出ないですね。

DIRECT3Dデバイス作成までのコードと、Clearメソッドのコードを貼っていただけますか?

私が回答できる保障はありませんが…

Re:DirectXにてClear関数を呼んだとき

Posted: 2010年7月03日(土) 22:59
by MOT
mD3DParameters.Windowed                        = mFullScreenFlag ? FALSE : TRUE;
    mD3DParameters.BackBufferWidth                = width;
    mD3DParameters.BackBufferHeight                = height;
    mD3DParameters.BackBufferFormat                = mFullScreenFlag ? D3DFMT_A8R8G8B8 : displayMode.Format;
    mD3DParameters.BackBufferCount                = 1;
    mD3DParameters.MultiSampleType                = D3DMULTISAMPLE_NONE;
    mD3DParameters.MultiSampleQuality            = 0;
    mD3DParameters.SwapEffect                    = D3DSWAPEFFECT_DISCARD;
    mD3DParameters.EnableAutoDepthStencil        = TRUE;
    mD3DParameters.AutoDepthStencilFormat        = D3DFMT_D16;
    mD3DParameters.hDeviceWindow                = mHWnd;
    mD3DParameters.Flags                        = 0;
    mD3DParameters.FullScreen_RefreshRateInHz    = D3DPRESENT_RATE_DEFAULT;
    mD3DParameters.PresentationInterval            = D3DPRESENT_INTERVAL_DEFAULT;

    if(FAILED(mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mHWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &mD3DParameters, &mD3DDevice)))
    {
        if(FAILED(mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mHWnd, D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &mD3DParameters, &mD3DDevice)))
        {
            if(FAILED(mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mHWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &mD3DParameters, &mD3DDevice)))
            {
                if(FAILED(mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, mHWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &mD3DParameters, &mD3DDevice)))
                {
                    SAFE_RELEASE(mD3D);
                    showErrorMessage(_T("Dreamer : CreateDevice関数に失敗しました\n"));
                }
                else
                {
                    showCautionMessage(_T("Dreamer : REF & SOFTWAREにて起動します...ほとんど満足に動きません\n"));
                }
            }
            else
            {
                showCautionMessage(_T("Dreamer : HAL & SOFTWAREにて起動します...なんとかぎりぎり動くかも?\n"));
            }
        }
        else
        {
            showCautionMessage(_T("Dreamer : HAL & MIXEDにて起動します...少々見劣りしますが動きます\n"));
        }
    }
    else
    {
        showCautionMessage(_T("Dreamer : HAL & HARDWAREにて起動します...余裕に動きます\n"));
    }

Clearメソッド周り

    if(FAILED(mDevice->Clear(0, NULL, flag, color, 1.0f, 0)))
    {
        showErrorMessage(_T("CGraphicsManager : Clearに失敗しました \n"));
    }
独自関数
showCautionMessage : デバッグ出力関数
showErrorMessage : エラーダイアログ出力後例外を投げて終了

Re:DirectXにてClear関数を呼んだとき

Posted: 2010年7月04日(日) 16:21
by MOT
自己解決しました。

原因は変なところでデバイスロストからの復活の関数を呼んでいたため、おかしくなっていました。

C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 18:24
by シエル
すいません。超初歩的な質問をさせて下さい。
たまに、C言語のサンプルで下記のように「?」のマークが
出てくることがあるのですが、これはどういう意味があるのですか?
一応ググったんですけど、うまく検索されなかったので分かりませんでした。

int IAbs(int x)
{
return ((x >= 0)? x : -x);
}

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 18:30
by MNS
条件演算子といいます。
具体的には、
<条件> ? <真のときの値>:<偽のときの値>
とかきます。

return ((x >= 0)? x : -x);
このコードでは、xが0以上のときにxを、
xが0未満のときに-xを返しますから、
つまりはxの絶対値を返すということになりますね。 画像

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 18:33
by やっくん
式1 ? 式2 : 式3
このような形を条件演算子と言います。

式1にif文の条件などで使われる条件式。
この式全体の値として、
・式1がtrue(真)だったときには式2
・式1がfalse(偽)だったときには式3
が返ってきます。

>return ((x >= 0)? x : -x);
これですとxが正ならそのままの値を返し、負なら符号を反転(つまり正に)して値を返します。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 18:41
by シエル
なるほど。。
if文を違う形式で書いたような感じのものなんですね。
でもifで書いた方が分かりやすいですね。
前から気になっていたので助かりました。。
MNSさん、やっくんさん、ありがとうございました!

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 18:46
by KEYONN_
三項演算子とも言います。
それだけです。orz

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 18:49
by シエル
>>TKOZさん

ありがとうございます。覚えときます。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 21:38
by めるぽん
?:演算子を三項演算子と呼ぶのは、正確には違いますね。
項が3つ(?:演算子の場合は<条件>, <真のときの値>, <偽のときの値>の3つ)あるものを三項演算子と呼びます。
C言語には三項演算子が1つしか無いため、三項演算子と言った場合は条件演算子だということが分かるだけです。

二項演算子なんかを考えると分かりやすいですね。
a+b や a-b というように使用される + や - はどちらも二項演算子ですが、それぞれ加算演算子と減算演算子とかそんな感じで呼ばれてます。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月13日(火) 21:56
by シエル
ぬるぽんさん。詳しい説明ありがとうございます。
覚え直しときます。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 04:27
by ゆーずぃ
条件演算子で思い出したんですけど、条件演算子で処理を行う必要が無い時って皆さんどうしてます?
例えば

(max > y) ? max : max = y; //yの方が大きければmaxを更新。真の時は処理不要

のような時、自分は変数でも書いてごまかしてたんですけど(環境によっては違うのかもしれませんが、自分は何も書かないとコンパイラに怒られるのでw)他にいい方法は無いのかなと。

せっかく主さんが条件演算子についての理解を深めつつあるので、こういった条件演算子の話題はいかがかなと(o^―^o)おっつけに見えたら申し訳ない;

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 06:33
by やっくん
私はこのようになる場合はif文で処理すると思います。
条件演算子はif~else文を短く書くだけのものと捉えています。
この場合ではelseは用いずif文のみで処理できますよね、だから条件演算子を使うのは冗長に思えます。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 08:30
by シエル
条件演算子って処理する必要がない場合も何かを書いて、
ごまかさなきゃならないんですね。
私はこの条件演算子を初めて知りましたが、使おうとはまったく思っていません。

if文の方が分かりやすいし、この条件演算子を使うメリットが見えてきません。。。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 08:40
by 組木紙織
>if文の方が分かりやすいし、この条件演算子を使うメリットが見えてきません。。。

複雑なのは同意、
条件演算子は代入をするときに便利です。
例えば絶対値なんかだと。

x *= (x>0)?1:-1;
で絶対値が計算できるので。


コードにミスがあったので修正 画像

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 08:51
by toyo
条件演算子を2重にしてるプログラムも見たことがあります
a = b ? c : d ? e : f;
もう何がなにやら
しかも言語によって結果が違うという(PHPではCと異なる)
私も単純な代入やreturnの時にしか使いませんね

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 09:00
by へろりくしょん
>if文の方が分かりやすいし、この条件演算子を使うメリットが見えてきません。。。

私は割と頻繁に条件演算子を使いますね。

組木紙織さんもおっしゃってますが、やはり代入するときはとても便利です。

後は関数に渡す実引数ですとか。

たとえば、関数 hoge() に変数 foo が0の時は、変数 a を。 非0の時は、変数 b を渡したいといった場合。
if()文を使うと次のようになります。
if(foo == 0){
    hoge(a);
}else{
    hoge(b);
}
条件演算子を使えば、

hoge(foo == 0 ? a : b);

ですみますね。

Re:C言語で出てくる「?」の意味について

Posted: 2010年7月14日(水) 09:17
by シエル
なるほど。単純な条件での代入や関数に渡す引数などでは、
すっきり書けて使えそうですね。ちょっとかっこいいかも。

ですが、toyoさんがおっしゃってる通り、複雑な条件で使用するのは
やはりif文の方が分かりやすいですね。
最初に見たサンプルでは二重で使用されてたものだったので、さっぱり分かりませんでした。
演算子が「?」なので、余計に頭も「?」になりましたw

状況に応じて使い分けるようにします。

回答していただいた皆さん、お忙しいところありがとうございました!
非常に勉強になりました!