2014-01-07 8 views
0

Ctrl + Alt + Del을 한 후 장치를 재설정하고 거기 일을하지만 난 그냥 거기에서 메시지가 :Directx9와 : 나는 경계선 창을 jusing 및 유튜브 비디오에서 장치를 재설정 코드를 복사하고있어

if(FAILED(hr)){ 
    MessageBox(0, "Failed to reset device!", 0, 0); 
    return; 
} 

내가 뭐 잘못 했니? InvalidateDeviceObjects()에서 뭔가를 잊었습니까? 너무 길기 때문에 더 많은 코드를 제공 할 수는 있지만 모든 것을 제공 할 수는 없습니다. 정말 도움이 필요 ...

리셋 장치 :

void Render(){ 

if(HandleDeviceLost/*VK_F1*/){ 
    if(DeviceLost){ 
     Sleep(100); 
     if(FAILED(hr=d3ddev->TestCooperativeLevel())){ 

      if(hr==D3DERR_DEVICELOST){ 
       return; 
      } 
      if(hr==D3DERR_DEVICENOTRESET){ 

       //clean 
       InvalidateDeviceObjects(); 

       //reset device 
       hr=d3ddev->Reset(&d3dpp); 

       if(FAILED(hr)){ 
        MessageBox(0, "Failed to reset device!", 0, 0); 
        return; 
       } 

       //restore 
       RestoreDeviceObjects(); 
      } 
      return; 
     } 
    } 
} 
DeviceLost=0; 

/* 
    Stuff 
*/ 

hr=d3ddev->Present(NULL, NULL, NULL, NULL); 
if(hr==D3DERR_DEVICELOST){ 
    DeviceLost=1; 
} 
} 


출시 개체 : 작동하면 링크 된 샘플에서

void InvalidateDeviceObjects(){ 

    buffShipMaterial->Release(); 
    Wall_large->Release(); 
    Wall_small->Release(); 
    space_text->Release(); 
    meshWall->Release(); 
    menuText->Release(); 
    menuText2->Release(); 
    menuText3->Release(); 
    text_cpu->Release(); 
    text_player->Release(); 
    text_player2->Release(); 
    number_0->Release(); 
    number_1->Release(); 
    number_2->Release(); 
    number_3->Release(); 
    number_4->Release(); 
    number_5->Release(); 
    number_6->Release(); 
    number_7->Release(); 
    number_8->Release(); 
    number_9->Release(); 
    number_10->Release(); 
} 
+1

사용자를 전환하거나 화면을 잠글 때 XP에서이 문제가 발생했습니다. 드라이버 문제인 것처럼 보였습니다. 유일한 수정은 응용 프로그램을 시작한 것처럼 전체 DX9 시스템을 다시 작성하고 다시 작성하는 것입니다. 다른 gfx 카드를 사용하는 비슷한 시스템도 괜찮 았습니다. –

+0

기기를 재설정하고 간단한 게임을 다운로드 (다운로드)했기 때문에 코드에있는 것 같습니다. – Vider7CC

+0

그래서이 간단한 게임의 소스 코드가 작동 했나요? 그렇다면 비교할 수 있습니다. 내가 볼 수있는 유일한 것은 첫 번째 'Reset'이 실패하면 'InvalidateRect'가 정상적으로 다시 페인트를 가져 와서 다시 시도한다는 것입니다. –

답변

2

, Reset에 오류가 결과는 return이고 render 함수는 다시 호출됩니다. 이는 정상적인 현상입니다. Reset이 첫 번째 호출에서 성공해야하는 이유가 없으므로 코드에 오류 메시지가 표시되지 않고 다시 시도하는 것이 일반적입니다.

예를 들어 메시지 루프에서 렌더링하는 경우 동일한 작업을 수행하십시오. 오류가 발생하면 중지하지 마십시오.

메시지 루프에서 렌더링하지 않고 WM_PAINT 메서드를 사용하는 경우 이는 일반적으로 사용하는 패턴입니다. 가끔 InvalidateRect을 호출하는 대신 타이머를 설정하기는하지만 앱에 따라 다릅니다. 많은 응용 분야에서 충분히 견고합니다. 첫 번째 실패시 오류 메시지를 표시하는 대신 Reset이 실패시 반복되는 방식을 확인할 수 있습니다. 또한,

void CMyClass::DrawScene() 
{ 
    // perform all dx9 scene drawing 
    HRESULT hr; 

    // if device was lost, try to restore it 
    if (m_bDeviceLost) 
    { 
     // is it ok to render again yet? 
     if (FAILED(hr = m_pD3DDevice->TestCooperativeLevel())) 
     { 
      // the device has been lost but cannot be reset at this time 
      if (hr == D3DERR_DEVICELOST) 
      { 
       // request repaint and exit 
       InvalidateRect(NULL); 
       return; 
      } 

      // the device has been lost and can be reset 
      if (hr == D3DERR_DEVICENOTRESET) 
      { 
       // do lost/reset/restore cycle 
       OnLostDevice(); 
       hr = m_pD3DDevice->Reset(&m_pD3Dpp); 
       if (FAILED(hr)) 
       { 
        // reset failed, try again later 
        InvalidateRect(NULL); 
        return; 
       } 
       OnResetDevice(); 
      } 
     } 

     // flag device status ok now 
     m_bDeviceLost = false; 
    } 

    // ... clear to background and do the drawing ... 

    // display scene 
    hr = m_pD3DDevice->Present(NULL, NULL, GetSafeHwnd(), NULL); 
    m_bDeviceLost = (hr == D3DERR_DEVICELOST); 

    // request repaint if device has been lost 
    if (m_bDeviceLost) 
    { 
     InvalidateRect(NULL); 
    } 
} 

당신은 TestCooperativeLevelReset이 장치를 만드는 데 사용 된 동일한 스레드에서 호출되어 있는지 확인해야합니다 :이 패턴을 채택하는 생각이 될 수 있습니다.

+0

감사하지만 그것을 시도하고 재설정에 실패하고 2 InvalidateDeviceObjects()/OnLostDevice()에서 추락. InvalidateDeviceObjects()/OnLostDevice()를 사용하기 위해 무언가를 한 번만 추가했는데 (잘못 되었습니까?)하지만 모든 재설정에는 실패합니다. 나는 쓰레드를 사용하지 않는다. – Vider7CC

+0

목록 또는 무엇인가> -> release()/delete 또는 -> onlostdevice()입니까? 텍스쳐, 글꼴 또는 스프라이트는 사용하지 않습니다. 그냥 메쉬와 빛. – Vider7CC

+0

@ Vider7CC 네, 여기에서 인용 (http://msdn.microsoft.com/en-us/library/windows/desktop/bb174425(v=vs.85)asp.aspx) - * "IDirect3DDevice9 :: Reset 모든 텍스처 메모리 표면을 잃어 버리게하고, 관리되는 텍스처를 비디오 메모리에서 플러시하고, 모든 상태 정보를 잃어 버리게한다. 장치에 대한 IDirect3DDevice9 :: Reset 메서드를 호출하기 전에, 응용 프로그램은 명시 적 렌더링 대상, 깊이 스텐실 표면 , 추가 스왑 체인, 상태 블록 및 장치와 관련된 D3DPOOL_DEFAULT 리소스가 있습니다. " –