Я бы хотел «зацепиться» за работающую игру, скажем Mario Bros, и захватить каждый отрендеренный кадр ... сохранив этот кадр в файл изображения. Хорошим примером чего-то подобного является FRAPS. - Примечание: я не хочу снимать весь экран / рабочий стол. Я хочу захватить целевое окно.
Я посмотрел на OBS (Open Broadcasting Software), но это не особенно быстро. Не поймите меня неправильно, это отличное программное обеспечение, но, к сожалению, нет / плохой документации, что делает массивный проект, написанный на c и c ++, практически недоступным для начинающего программиста на c ++.
Я также взглянул на GamingAnywhere , но, к сожалению, я не могу заставить его работать, документации очень мало / нет, она работает только на VS2010 и грязная (с плохим именованием переменных). Тем не менее, это исследовательский проект, и поэтому он по понятным причинам недокументирован и грязен.
Я знаю, что это можно сделать с помощью OpenGL, GDI и Direct3D, но я не могу найти несколько хороших примеров в сети.
Я читал, что можно использовать glReadlPixels (используя OpenGL), и я прочитал документацию , но в посте ничего не упоминалось о подключении к работающей графике игры / приложения.
Вопросов:
Могу ли я подключиться к графике игры, разработанной с помощью OpenGL, используя, скажем, Direct3D? Должна ли библиотека, используемая для перехвата, быть такой же, как библиотека, используемая в игре?
Как подключиться к отображаемым кадрам игры, чтобы я мог выводить эти кадры в файлы изображений или в видеофайл? (Просто несколько ссылок или краткое объяснение того, что мне нужно сделать, было бы здорово)
BackBuffer - я прочитал, что это очень быстрый доступ к BackBuffer для получения кадров. Есть ли у меня пример для меня, как это сделать с последними библиотеками? Я обнаружил, что большинство примеров устарели.
Для моих целей, есть ли какое-то однозначное «это быстрее, чем это»? Что я имею в виду, скажем, OpenGL, будет быстрее для моих целей?
Если кто-то знает о проекте с открытым исходным кодом (который, по сути, делает то, что мне нужно), который активно развивается и хорошо документируется, я бы хотел узнать об этом.
Ответы:
Можно делать то, что вы описываете, но, боюсь, это не тривиальный процесс. На самом деле, это будет очень привязано к операционным системам, на которые вы ориентируетесь, и, возможно, также потребует определенных настроек для данной игры / приложения.
Я бы начал изучать методы внедрения DLL , которые должны позволять, например, перехватывать вызовы API-интерфейсов Direct3D (Windows) или OpenGL, которые затем можно использовать для копирования кадровых буферов приложения. Быстрый поиск в Интернете обнаруживает это и это с подробным объяснением.
Однажды я написал небольшой перехватчик OpenGL в MacOS, внедрив пользовательский общий модуль, но он находился в очень контролируемых условиях и делал много предположений, таких как наличие корневых привилегий в системе, поэтому для производственного инструмента это было бы намного сложнее. Вы можете найти еще один очень интересный проект здесь о перехвате D3D API , чтобы установить автоматический бот AI на Starcraft, который должен коснуться на очень похожие понятия, что вы ищете.
Как только вам удастся перехватить базовый API рендеринга, вы можете подключить свой код к каждому
SwapBuffers
или эквивалентному вызову, чтобы просто скопировать предыдущий кадровый буфер перед свопингом, а затем сохранить его (это то, где что-то подобноеglReadPixels
вступает в игру).Эффективное копирование и сохранение кадрового буфера также является сложной задачей. Самый простой способ - просто записать каждый кадр в виде несжатого RGB-изображения, но тогда вы получите сотни гигабайт данных всего за пару минут игрового процесса, поэтому, если у вас не будет хорошего массива жестких дисков, расположенного на углу ваш стол
;)
, вам нужно как-то посмотреть на сжатие кадров.Недостаток сжатия кадров в настоящее время заключается в том, что он требует большой обработки, поэтому наивный подход может превратить некогда интерактивное приложение, которое вы пытаетесь записать, в интерактивное слайд-шоу
:(
. Так что на этом этапе вы должны начать думать об оптимизации.Не знаю ни одного проекта, предоставляющего библиотеку для эффективного захвата кадров для игр, но это, безусловно, было бы неплохо! Я думаю, что одна вещь, которая может сдерживать такой проект, состоит в том, как я упоминал в начале, что это очень системно-зависимая вещь, поэтому случаи использования, скорее всего, будут ограничены одной платформой или ОС.
источник