Buddhi Chaturanga Ответов: 1

Получить FPS программы из внешней программы?


Я разрабатываю программу Win32 C++ , которая создает дочерний процесс игровой программы(т. е. "Game.exe"),с помощью CreateProcess(...) функция в Windows API.

(Эта игра была разработана внешней стороной, поэтому у меня нет исходного кода программы, а также она использует direct3D для 3D-рисования и nvidia Physx для моделирования физики.)

- Ответственность моей программы заключается в том, чтобы запустить эту игровую программу, собрать
данные для бенчмаркинга игры, а затем завершить игру всякий раз, когда
требуемый.

Чтобы воспроизвести правильные результаты бенчмарка, мне нужно посчитать КАДР той игровой программы, которая обрабатывается как дочерний процесс.Это означает, что каким-то образом моя программа(родительский процесс) должна иметь механизм для захвата количества кадров в секунду из этой игровой программы.

- Мой вопрос в том,что если мы напишем программу Visual C++ для бенчмарка игры, как мы можем подсчитать fps этой игры?

(Самый популярный Фрапс программа делает это, будучи внешней программой, она может подсчитывать fps любой игры, запущенной на ОС, мне нужно знать, как они достигают этого механизма? и запечатлейте этот механизм в моей программе, чтобы получить fps.)

Для вашего удобства пожалуйста обратитесь к :-

1. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=против 85). aspx
2. http://www.fraps.com/

Что я уже пробовал:

Я пытался добиться fps через Windows, но это не сработало.

1 Ответов

Рейтинг:
2

David 'dex' Schwartz

Я понимаю, что это не очень здорово-просто разместить ссылку, но контент длинный.
Инструментирование приложений Direct3D

Вот краткий отрывок из первых шагов по достижению вашей цели.

Предоставленный нами код запускает целевой процесс в приостановленном режиме и подключает точку входа Direct3DCreate9 в d3d9.dll.

Once we catch a Direct3DCreate9 call, we can use the returned IDirect3D9 pointer to index the VTable. Since the call occurred in the target process address space, we cannot use the pointer directly in our host application; however, we can use Deviare’s functions to read the hooked process memory (starting with the IDirect3D9 pointer) to get the method addresses. This is a very interesting and useful technique which avoids sending address data from the intercepted process to the host processes.


Buddhi Chaturanga

Спасибо за ответ, я попробую это решение и проверю его как ответ позже.Очень ценю ваши мысли.