: http://www.ring3circus.com/gameprogramming/case-study-fraps/ 을하고 나는이 정말 잘못되고 있음을, 그것이 얼마나 오래된 부여 (그리고 저자는 심지어 자신의 코드를 사용에 대한 제안) 실현 왔어요 스위트 룸에 들어갈 필요가 없습니다 (하나, C#, 둘, DX9 용). DirectX 게임 창을 사각형으로 캡처하고 참조 할 수있는 일종의 스트리밍 비디오 메모리로 가져 오려고합니다. 창은 전경이 보이지 않거나 보이지 않는 경우 (다른 창 뒤에 묻혀있을 때) 캡처 할 수 있어야합니다. C# 라이브러리 (EasyHook 및 SlimDX로 만든 라이브러리)를 사용해 보았지만 64 비트에서 DirectX 11 게임을 사용하여 한 번만 성공적으로 작업 할 수있었습니다 (그 이후로는 재현 할 수 없었습니다). 그 당시에도 포착률은 눈을 피로하게 느리게 나타났습니다. DirectX에 오버레이를 적용하는 많은 다른 것들과 함께 (필자는 필요하지 않음). 캡쳐가 될 때까지는 무엇을하는지 모방하고 싶습니다만, 모든 부분이 아닌 사각형 영역이 필요합니다. 파일에 쓰지 않아도됩니다. DX9 트로프 DX11에서 작동하는 C#의 게임 창의 주어진 사각형의 빠른 프레임 캡처를 관리하는 방법에 대한 코드 샘플을 얻을 수 있습니까?DX9 캡처 C#을 나는이 arcile 읽고 있었다
1
A
답변
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 framebuffer capture (C++, no Win32 or D3DX)
이것은 좋은 질문이다. DX9와 다른 관련없는 솔루션 아래에 묻혀있는 인터넷에서 쉽게 답변을 찾을 수 있습니다. – jheriko