|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
||||||
Вывод fps в чужой игре02.11.2017, 11:34. Показов 2484. Ответов 14
Метки нет (Все метки)
Всем добрый день. Хочу сделать вывод fps в чужой игре. Внедряюсь в процесс игры, в данном случае приложение DirectX 11 - демка от Unity.
Запускаю демку, ставлю оконный режим 800x600. Далее подгружаю туда свою dll-ку. Всё отлично, счётчик кадров рисуется. Если перейти в полноэкранный режим (Alt+Enter), то счётчик пропадает, то есть не рисуется на экране. Если перейти обратно, то в оконном режиме он снова выводится нормально. Если запустить демку сразу в полноэкранном режиме на разрешении равном разрешению экрана (у меня это 1440 на 900), то счётчик отображается нормально. В чём может быть причина? У меня такое впечатление, что там две текстуры, в которые происходит рендеринг, и в зависимости от разрешения выводится одна из них? Вот данные SwapChain после перехвата Present():
И что тогда делать? Как выводить текст? Это Multi-Sample Anti-Aliasing влияет на это или нет? В окне (800x600): В полноэкранном режиме (800x600): В полноэкранном режиме (1440x900, разрешение экрана):
0
|
||||||
| 02.11.2017, 11:34 | |
|
Ответы с готовыми решениями:
14
Альфа-смешивание в чужой игре
Падает FPS в игре |
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
||
| 02.11.2017, 21:45 | ||
|
Отрисовка текста когда происходит (в какой момент)? Каким образом текст рисуется? P.S. я в перехватах не спец))
0
|
||
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
|
| 03.11.2017, 11:33 [ТС] | |
|
Byurrrer,
1. Перехватываю Present(), подменяю своей функцией. 2. Внутри своей функции сохраняю состояние контекста, далее рисую текст (треугольники и текстура алфавита, думаю, вы поняли о чём речь), восстанавливаю контекст. 3. Вызываю оригинальный Present().
0
|
|
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
||
| 03.11.2017, 11:45 | ||
|
wmaster575, понял, могут ли быть проблемы с позицией текста?
Еще: BeginScene/EndScene должны использовать только единожды за проход рендера (если я не ошибаюсь), попробуй перехватывать EndScene. Они действительно влияют на рендер (хотя бы в dx9), у меня были некоторые проблемы в рендеер после вызова EndScene. Добавлено через 2 минуты Кстати, на своем приложении на dx11 (именно которое сам написал на чистом dx11 без использования движков) пробовал делать перехват?
0
|
||
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
||||
| 03.11.2017, 12:50 [ТС] | ||||
|
Byurrrer,
Нет, проблем с позицией текста быть не может, так как пробовал выводить в центр экрана текст, тоже самое.
0
|
||||
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
|||
| 03.11.2017, 12:58 | |||
|
Больше нет у меня никаких мыслей.
0
|
|||
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
||||||
| 11.11.2017, 21:47 [ТС] | ||||||
|
Byurrrer,
Я написал отдельную функцию MyPresentFunc4, в которой я только очищаю экран и всё, вызов ClearRenderTargetView().
Окно (640x480): Полный экран (1440x900): Видеозапись: Что это за магия DirectX?
0
|
||||||
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
||||
| 11.11.2017, 22:35 | ||||
|
wmaster575, уверен что MyPresent действительно в полноэкранном режиме вызывается? Как то узнать об этом можешь? Добавлено через 57 секунд
0
|
||||
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
||
| 12.11.2017, 08:48 [ТС] | ||
|
Byurrrer,
MAX_RENDER_TARGETS = 8, это максимальное кол-во RenderTargetView, которые можно установить для устройства D3D. Я их всех перечисляю и вызываю ClearRenderTargetView() для очистки области. Только 1 указатель имеет значение, все остальные равны NULL. На простом тестовом приложение DirectX всё выполняется, и в оконном и полноэкранном режиме.
0
|
||
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
|
| 12.11.2017, 16:31 | |
|
0
|
|
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
|||||||
| 13.11.2017, 13:53 [ТС] | |||||||
|
Да, выполняется. Но ещё раз сделаю проверку. Отпишу.
Добавлено через 20 часов 23 минуты
0
|
|||||||
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
|
| 13.11.2017, 17:53 | |
|
Тогда не могу ничего по этому поводу подсказать. Единственное что можно сделать это попытаться каким-то другим образом выводить fps, может быть через winapi?
Кстати, fraps нормально показывает свой fps в этом приложении?
0
|
|
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
|
| 13.11.2017, 23:45 [ТС] | |
|
Byurrrer, fraps не пробовал, action выводит на ура, ocam выводит.
Я нашёл прогу RenderDoc для отладки DirectX приложений, можно посмотреть какие функции вызываются, и состояние конвейера. Завтра попробую разобраться.
0
|
|
|
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
|
||||||
| 24.11.2017, 09:46 [ТС] | ||||||
|
Byurrrer, разобрался.
В чём соль? Итак, что получается. 1. Когда движок Unity рисует в окно, то он рисует сразу в цепочку переключений, назовём SwapChain. 2. Когда движок рисует в полноэкранном режиме, то здесь два случая: 1) Если размеры окна равны размеру экрана (мы переключились в полноэкранный режим из окна), то будет использован SwapChain. 2) Если размеры окна (640x480) не равны размеру экрана (1440x900), то Unity будет рисовать вначале в промежуточную текстуру, назовём Texture1 (640x480), а затем пропорционально масштабировать её во SwapChain (1440x900). Почему в Present() не получалось выводить изображение в полноэкранном режиме. Причина в следующем. Алгоритм Unity такой (далее образно, главное суть): 1. Установить Texture1 в конвейер для рисования. 2. Настройка конвейера (шейдеры, ресурсы и т. д.). 3. Рисование сцены в Texture1. 4. Установить SwapChain в конвейер. 5. Настройка конвейера (шейдеры, ресурсы и т. д.). 6. Рисование сцены во SwapChain (то изображение, что будет на экране). На этом этапе масштаб. Texture1 во SwapChain. 7. Установить Texture1 в конвейер для рисования. (!!!) 8. Вызов Present(). Отображение буфера SwpChain на экране. То есть, перед самым Present(), Unity ставит в конвейер обратно Texture1. поэтому когда я что-то рисую в перехваченном Present(), вывод идёт не на экран (SwapChain), а в промежуточную текстуру Texture1. Выход следующий, надо установить SwapChain перед рисованием. Вот примерный код функции, он рабочий. Часть функций вымышлена, приведена для примера. Комментарии в коде.
0
|
||||||
|
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
|
|
| 04.12.2017, 23:20 | |
|
wmaster575, поздравляю с найденным решением! Еще не добрался до изучения твоего решения, поставил в задачи)
0
|
|
| 04.12.2017, 23:20 | |
|
Помогаю со студенческими работами здесь
15
Скачки fps при игре Низкий FPS в игре Warface Падение FPS в игре The Witcher 3
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|