всем привет. при снятии скринов экрана (видео), с помощью как бы аппаратной BitBlt, получаем ~15-20 fps, что маловато, также не показывается оверлейное видео. возможно, что процедуру тормозит копирование из видео в оп память (или в своп). как получить хотя бы 30-40 fps и "соскринить" оверлей?
nMaxwell Есть там просто код такой,под ваши цели подходящий,я думал вы именно в этих целях интересуетесь.
я возможно плохо искал, но большинство реализаций тормознутые, также коряво используют BitBlt. качественнее всех работает Radmin (DirectScreenTransfer - используется драйвер), но его исходников нет
nMaxwell Radmin юзает имено драйвер-фильтр (video). Вы сначала опишите подробно что вам надо. Может есть что попроще драйвер-фильтра ... ЗЫ. Radmin 3.x тоже не совершенен, если включить видео поток в оверлее (тормоза те ещё).
T800 подробнее некуда: удаленное управление десктопом, как вы верно подметили, фильтр писать не хочется. этот драйвер позволяет делать несколько сотен кадров в секунду, мне хватит и 30-40
reverser тут, по моему, используется dxgi + dx10-11, что для хрюши и старого гпу неподъемная ноша... а счастье было так близко 2all: может можно реализовать с помощью dshow? судя по тому, что в нете ничего не нашел и никто не отвечает, буду пробовать использовать драйвер. для детектирования изменений на экране поможет mirror driver, а вот как сделать скрин?
nMaxwell А вы не задавались вопросом, какая пропускная способность сети должна быть, чтобы передавать "сырые" скриншоты. radmin их пакует и всячески пытается уменьшить в объеме, передавая только изменения.
valterg давно задавался и делаю все постепенно: сначала реализовал через bitblt и сжатие с помощью xvid / mpeg. локальные 12-20 fps не особо радовали. сейчас хочу хотя бы 25-30 кадров. буду фиксировать изменения через ddk-шный mirror driver, в памяти гпу находить измененные квадраты, жать их mpeg'ом, вроде он же для этих целей и создавался
в общем, почти все это уже реализовано в TightVNC, осталось допилить сжатие. но ради спортивного интереса вопрос остается открытым: как из драйвера в памяти гпу копировать экран и редактировать там же его
Тут нет каких то API от MS. На старых видюхах можно было как то работать с видео памятью, т.к. она была линейной. Но на современных монстрах она не линейна и всё это не документировано и меняется. ЗЫ. Эту тему сам мусолил год назад. Даже Great подключался (я за основу взял его дров: http://www.wasm.ru/forum/viewtopic.php?id=30224 ).
Стоит признать из вас не кто не знает виндовс. вам бы только всякие гуано повторять и прочей буйней маятся... BitBlt ну уж не как не апаратна. и может быть актуальной для 5X ядра / Что же касается 6X тут дело обстоят иначе.. На сцену (со своей сценой и адаптерами + вирт дефайсами) вступает 9,10X -> переходящий в 11 X/ В Ядре снять экран моно через такую поепоту: http://msdn.microsoft.com/en-us/library/aa480220.aspx Что же касательно перехвата для ядро гуано дебаггер(типо сусера) Сплайсим ZwLoadDriver на предмет DXGKrnl -> IRP_MJ_INTERNAL_DEVICE_CONTROL + установить сплайс для DxgkInitialize. При спайсинге DxgkInitialize DxgkDdiSetVidPnSourceAddress DxgkDdiCreateAllocation DxgkDdiDestroyAllocation DxgkDdiSetVidPnSourceVisibility Вообще кто знает тот поймет ... User M0de. (Или унылый мод) Делает инжект dwm.exe (Если не знаем как то идем срать керпечами) Спайсим две функты D3D10CreateDevice1 CreateDXGIFactory Подстовляем прокси ... CreateDXGIFactory -> Мониторим ProxyDXGIFactory::QueryInterface() На предмет запроса { 0x713F394E, 0x92CA, 0x47E7, { 0xAB, 0x81, 0x11, 0x59, 0xC2, 0x79, 0x1E, 0x54 } }; -> InterfaceDWM InterfaceDWM { virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, VOID **ppvObject ); virtual ULONG STDMETHODCALLTYPE AddRef(void); virtual ULONG STDMETHODCALLTYPE Release(void); STDMETHOD(CreateSwapChain)( IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChainDWM ); } struct IDXGISwapChainDWM : public IDXGIDeviceSubObject { STDMETHOD(Present)( UINT SyncInterval, UINT Flags ) = 0; STDMETHOD(GetBuffer)( UINT Buffer, REFIID riid, void **ppSurface) = 0; STDMETHOD(GetDesc)( DXGI_SWAP_CHAIN_DESC *pDesc ) = 0; STDMETHOD(ResizeBuffers)( UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags ) = 0; STDMETHOD(ResizeTarget)( const DXGI_MODE_DESC *pNewTargetParameters ) = 0; STDMETHOD(GetContainingOutput)( IDXGIOutput **ppOutput ) = 0; STDMETHOD(GetFrameStatistics)( DXGI_FRAME_STATISTICS *pStats ) = 0; STDMETHOD(GetLastPresentCount)( UINT *pLastPresentCount ) = 0; STDMETHOD(SetFullscreenState)( BOOL Fullscreen, IDXGIOutput *pTarget ) = 0; STDMETHOD(GetFullscreenState)( BOOL *pFullscreen, IDXGIOutput **ppTarget ) = 0; }; ProxyIDXGISwapChainDWM::Present( Дальше понадобится вытащить (или перехватить ) SourceScrene (ID3D10Texture2D *) ... Идея думаю ясна ... вообще все это буйня копибара не нужна ... вот как то так! П.С Я не говорю что мои слова или же текста (или просто буквы) основываются на какомто смысле и их стоит воспренимать в серъез... Но посмотреть можно особенно погуглить и будет дело... Ну если и так не получается значит просто руки очень кривые ... или полнейшее пустота в голове ...