/// <summary> /// /// </summary> void Render3DEnvironment() { if (!DXState.DeviceCreated && m_app.DXDevice == null || m_app.ImmediateContext == null || m_app.SwapChain == null) { return; } if (IsRenderingPaused() || !IsActive || DXState.RenderingOccluded) { // ウィンドウは最小化/一時停止/閉塞/排他的ではないため、CPU時間を他のプロセスに与える //Thread.Sleep(RenderSleep); } if (UserResized) { CheckForWindowSizeChange(); UserResized = false; } // アプリの時間を秒単位で取得し時間が経過していなければレンダリングをスキップする m_app.SetOldProcessTime(m_app.ProcessTime); m_app.SetProcessTime(m_timer.Elapsed.TotalSeconds); m_app.SetEpsilonTime((float)(m_app.ProcessTime - m_app.OldProcessTime)); m_app.SetFPS(1 / m_app.EpsilonTime); // アプリケーションのフレーム移動コールバックを呼び出してシーンをアニメーション化 FrameMove(); if (!DXState.RenderingPaused) { // アプリケーションのレンダリングコールバックを呼び出してシーンをレンダリング FrameRender(m_app.ProcessTime, m_app.EpsilonTime, m_app.FPS); } // プライマリサーフェスにフレームを表示 var hr = m_app.SwapChain.Present(0, PresentFlags.None); if ((int)DXGIStatus.Occluded == hr.Code) { // 全体の描画領域をカバーするウィンドウがある // 再び表示しているまで、レンダリングしないこと DXState.RenderingOccluded = true; } if (SharpDX.DXGI.ResultCode.DeviceReset == hr) { // モードが変更された場合は、デバイスをリセットする必要があります throw new Exception("モードが変更され、デバイスをリセットができる仕様ではありません。"); } else if (SharpDX.DXGI.ResultCode.DeviceRemoved == hr) { // 新しいデバイスを探したい場合は、コールバックを使用してアプリに問い合わせます。 // デバイスが削除されたコールバックが設定されていない場合は、新しいデバイスを探します throw new Exception("新しいデバイスを構築できる仕様ではありません。"); } else if (hr != Result.Ok) { if (DXState.RenderingOccluded) { // もはや閉塞していないので、再びレンダリングすることができる DXState.RenderingOccluded = false; } } // 現在のフレーム# DXState.CurrentFrameNumber++; return; }