Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Вывод fps в чужой игре

Вывод fps в чужой игре

Поделиться
Advanced: Тема повышенной сложности или важная.
wmaster575Постоялецwww2 ноя. 201711:49#0
Всем добрый день. Хочу сделать вывод fps в чужой игре. Внедряюсь в процесс игры, в данном случае приложение DirectX 11 - демка от Unity.
Запускаю демку, ставлю оконный режим 800x600. Далее подгружаю туда свою dll-ку. Всё отлично, счётчик кадров рисуется.
Если перейти в полноэкранный режим (Alt+Enter), то счётчик пропадает, то есть не рисуется на экране. Если перейти обратно,
то в оконном режиме он снова выводится нормально.
Если запустить демку сразу в полноэкранном режиме на разрешении равном разрешению экрана (у меня это 1440 на 900), то счётчик
отображается нормально.

В чём может быть причина? У меня такое впечатление, что там две текстуры, в которые происходит рендеринг, и в зависимости от разрешения
выводится одна из них?
Вот данные SwapChain после перехвата Present():

DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
hr = swap->GetDesc(&swapChainDesc);

swapChainDesc.BufferDesc.Width = 800
swapChainDesc.BufferDesc.Height = 600
swapChainDesc.BufferDesc.RefreshRate.Numerator = 0 
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1 
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM (28)
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED (0)
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED (0)

swapChainDesc.SampleDesc.Count = 2
swapChainDesc.SampleDesc.Quality = 0 

swapChainDesc.BufferUsage = 48
swapChainDesc.BufferCount = 1
swapChainDesc.OutputWindow = 0x000000000006087c {unused=71304240 }
swapChainDesc.Windowed = 1
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD (0)
swapChainDesc.Flags = 2

Я так подозреваю, что на это влияет параметр: swapChainDesc.SampleDesc.Count = 2
И что тогда делать? Как выводить текст?
Это Multi-Sample Anti-Aliasing влияет на это или нет?

В окне (800x600):
01 | Вывод fps в чужой игре

В полноэкранном режиме (800x600):
02 | Вывод fps в чужой игре

В полноэкранном режиме (1440x900, разрешение экрана):
03 | Вывод fps в чужой игре

g-contПостоялецwww2 ноя. 201714:32#1
У фрапса тоже счётчик пропадает в фуллскрин?
wmaster575Постоялецwww2 ноя. 201717:04#2
g-cont
Фрапс не пробовал. Пробовал oCam, bandicam. У них показывается нормально в полноэкранном.
Фрапс думаю тоже без проблем будет показывать.

Правка: 2 ноя. 2017 17:29

wmaster575Постоялецwww11 ноя. 201721:55#3
Я написал отдельную функцию MyPresentFunc4, в которой я только очищаю экран и всё, вызов ClearRenderTargetView().
HRESULT STDMETHODCALLTYPE MyPresent(IDXGISwapChain *swap, UINT SyncInterval, UINT Flags)
{
  HRESULT hr = S_OK;
  
  hr = MyPresentFunc4(swap, SyncInterval, Flags);

  hr = g_pOldPresent(swap, SyncInterval, Flags);
  return hr;
}

HRESULT STDMETHODCALLTYPE MyPresentFunc4(IDXGISwapChain *swap, UINT SyncInterval, UINT Flags)
{
  HRESULT hr = S_OK;
  bool bNext = true;
  ID3D11Device *pDevice = 0;
  ID3D11DeviceContext *pDeviceContext = 0;
  
  hr = swap->GetDevice(__uuidof(ID3D11Device), (void **)&pDevice);
  if (FAILED(hr))
  {
    bNext = false;
  }
  else
  {
    // Контекст.
    pDevice->GetImmediateContext(&pDeviceContext);
  }

  if (!bNext) return E_FAIL;

  ID3D11RenderTargetView *pRenderTargets[MAX_RENDER_TARGETS];
  pDeviceContext->OMGetRenderTargets(MAX_RENDER_TARGETS, pRenderTargets, NULL);

  float ClearColor[4] = { 0.0f, 0.0f, 1.0f, 1.0f };

  for (size_t i = 0; i < MAX_RENDER_TARGETS; i++)
  {
    if (pRenderTargets[i])
    {
      pDeviceContext->ClearRenderTargetView(pRenderTargets[i], ClearColor);
    }
  }

  for (size_t i = 0; i < MAX_RENDER_TARGETS; i++)
  {
    if (pRenderTargets[i]) pRenderTargets[i]->Release();
  }

  pDevice->Release();
  pDeviceContext->Release();

  return S_OK;
}

В оконном режиме экран очищается, но когда я перехожу в полноэкранный (ALT+ENTER), программа снова рисует как ни в чём не бывало.

Окно (640x480):
1_01_s.jpg | Вывод fps в чужой игре

Полный экран (1440x900):
1_02_s.jpg | Вывод fps в чужой игре

Видеозапись: https://youtu.be/zifrKGHJ3TA

Что это за магия DirectX?

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр