Я хотел бы создать фильм в режиме реального времени с помощью собственного приложения, которое делает быстрые снимки экрана, при этом часть экрана занята работающим 3D-приложением.
Мне известно, что для этого уже существует несколько приложений (например, FRAPS или Taksi) и даже выделенные фильтры DirectShow (например, UScreenCapture), но мне действительно нужно сделать это с помощью моего собственного внешнего приложения.
При правильной настройке (UScreenCapture + ffdshow) захват сжатия во весь экран не потребляет столько ресурсов ЦП, сколько вы ожидаете (около 15%), и не влияет на производительность приложения 3D.
Проблема создания захвата из внешнего приложения заключается в том, что 3D-приложение теряет Vsync и создает мохнатое, сложное в использовании 3D-приложение (3D-приложение представлено только на небольшой части экрана, остальное - GDI, DirectX)
FRAPS решает эту проблему, позволяя захватывать только одно приложение за раз (одно с фокусом). В зависимости от используемой технологии (OpenGl, DirectX, GDI), он перехватывает Vsync и производит его захват (с помощью glReadPixels, ...), не нарушая его.
Это не решит мою проблему, так как я хочу получить полностью составленное изображение экрана (включая 3D и все остальное) И гладкое 3D-приложение.
Кажется, UScreenCapture использует быстрый вызов DirectX для захвата всего экрана, но 3D-приложение openGL все еще не синхронизировано.
Выполнение BitBlt слишком медленное и потребляет процессор для получения в реальном времени 30 кадров в секунду (по крайней мере, в Windows XP, не уверен с 7)
Мой вопрос состоит в том, чтобы узнать, есть ли способ достичь моей цели с помощью Windows 7 и его совершенно нового механизма композитинга DirectX?
Windows 7 успешно отображает в реальном времени дублированные предварительные просмотры VSynced для каждого приложения (на панели задач), поэтому должен быть способ получить доступ к текущему отображаемому экранному буферу, не нарушая рендеринг приложения 3D OpenGL?
Любое другое предложение, технология?
спасибо