2

私はこのアルチレを読んでいました:http: //www.ring3circus.com/gameprogramming/case-study-fraps/ そして、それがどれほど古いかを考えると(そして作者は彼のコードを使用しないことを提案している)、これは本当に私のニーズに合わないことに気づきました(1つはC#、2つはDX9用です)。DirectXゲームウィンドウの長方形のキャプチャを取得し、参照できるある種のストリーミングビデオとしてメモリに保存しようとしています。ウィンドウは、フォアグラウンドにない場合、または表示されている場合(他のウィンドウの後ろに埋め込まれている場合)でもキャプチャできる必要があります。そのC#ライブラリ(EasyHookとSlimDXで作成されたもの)を試しましたが、64ビット未満のDirectX 11ゲームでデモを正常に動作させることができたのは1回だけです(それ以降は再現できません)。それでも、捕獲率は目を見張るほど遅かった。DirectXへのオーバーレイ(私は必要ありません)をカバーした他の多くのものと一緒に。私' dキャプチャに関しては、フラップが行うことを模倣したいのですが、ゲーム全体ではなく、ゲームの長方形の領域が必要であり、ファイルに書き込む必要はありません。DX9トラフDX11で機能するC#で、ゲームウィンドウの特定の長方形の高速フレームキャプチャを取得する方法のコードサンプルを入手できますか?

4

1 に答える 1

3

これが同じ問題の私のC++コードです。

ID3D11Texture2D* pSurface;
HRESULT hr = m_swapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), reinterpret_cast< void** >( &pSurface ) );
if( pSurface )
{
    const int width = static_cast<int>(m_window->Bounds.Width * m_dpi / 96.0f);
    const int height = static_cast<int>(m_window->Bounds.Height * m_dpi / 96.0f);
    unsigned int size = width * height;
    if( m_captureData )
    {
        freeFramebufferData( m_captureData );
    }
    m_captureData = new unsigned char[ width * height * 4 ];

    ID3D11Texture2D* pNewTexture = NULL;

    D3D11_TEXTURE2D_DESC description;
    pSurface->GetDesc( &description );
    description.BindFlags = 0;
    description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
    description.Usage = D3D11_USAGE_STAGING;

    HRESULT hr = m_d3dDevice->CreateTexture2D( &description, NULL, &pNewTexture );
    if( pNewTexture )
    {
        m_d3dContext->CopyResource( pNewTexture, pSurface );
        D3D11_MAPPED_SUBRESOURCE resource;
        unsigned int subresource = D3D11CalcSubresource( 0, 0, 0 );
        HRESULT hr = m_d3dContext->Map( pNewTexture, subresource, D3D11_MAP_READ_WRITE, 0, &resource );
        //resource.pData; // TEXTURE DATA IS HERE

        const int pitch = width << 2;
        const unsigned char* source = static_cast< const unsigned char* >( resource.pData );
        unsigned char* dest = m_captureData;
        for( int i = 0; i < height; ++i )
        {
            memcpy( dest, source, width * 4 );
            source += pitch;
            dest += pitch;
        }

        m_captureSize = size;
        m_captureWidth = width;
        m_captureHeight = height;

        return;
    }

    freeFramebufferData( m_captureData );
}

これをC#に移植するか、少なくともライブラリでラップできる可能性があります。同様の質問をしましたが、答えが見つかりました:DirectX 11フレームバッファキャプチャ(C ++、Win32またはD3DXなし)

于 2012-05-16T18:12:52.813 に答える