![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
В теме "Запись видео с рабочего стола", которую я создал в разделе Общие вопросы посоветовали обратиться сюда по поводу работы с видеопамятью.
comcon1 предложил такую идею для записи видео с рабочего стола?
Как вы думаете можно это реализовать и какие средства для работы с видеопамятью предоставляет WinAPI? |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
С помощью этой функции можно получить дескриптор окна. Через дескриптор - контекст устройства (HDC), а через него все биты рабочего стола. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
А что-нибудь вроде размещения в видеопамяти куска информации?
|
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
В Windows напрямую с видеопамятью работать нельзя. |
|||
|
||||
| JoyEx |
|
||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
А DirectX тогда для чего? DirectDraw может отобразить нужный "кусок" видеопамяти в твой процесс. Leksey С помощью HDC ничего не выйдет с захватом видео, если её выводят аппаратно, через OVERLAY. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||
|
|||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
JoyEx А как выйдет?
К тому же мне важно изображение моего окна на рабочем столе, и я не использую OVERLAY. И как мне найти нужный кусок видеопамяти в котором изображение рабочего стола? |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Ты будешь смеяться, я пересмотрел все темы, которые были на этом форуме по данной теме: все приходили к выводу, что даже с помощью DD видео не ухватить А нужно ли это?.. Про видео ничего не говорилось. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Что самое обидное софта который делает аналогичные вещи просто навал ом в Интернете.
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 1 Всего: 93 |
Это вроде как раз потому, что видео в основном играется через оверлеи. А оверлеи эта такая хитрая штука, которая обрабатывается на аппаратном уровне и само изображение может находится в любой области видеопамяти. -------------------- Да. Именно так. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Leksey
Если нету overlay, то тогда нет ничего проще HDC - это описатель для "куска" видеопамяти, а Windows обычно работает с одной видеостраницей (все, что видно на экране на ней и находится) и поэтому, получив контект HDC своего Рабочего стола (тебе же ManiaK говорил уже) можешь спокойно сохранять картинку. В MSDN April 2003 есть пример "Storing an Image" (Windows GDI). Маленькие "куски" с Рабочего стола (- это тоже окно) в режиме приближенному к реальному времени можно таким образом сграбить, правда, это еще не видео, но вышесказанное можно спокойно сделать на WinAPI.
Вот Пример 1 Пример 2 Пример 3 Пример 4 там еще есть много чего ... -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
[quote]
правда, это еще не видео [quote] Вот, а нужно именно видео и чтобы во время записи не было тормозов на среднестатистическом компе. С фоткой проблем нет. Попробовал напрямую копировать рабочий целиком без всякой оптимизации в Avi поток .При расширении 1024x768 тормоза жуткие. Добавлено @ 20:42 [quote] правда, это еще не видео [quote] Вот, а нужно именно видео и чтобы во время записи не было тормозов на среднестатистическом компе. С фоткой проблем нет. Попробовал напрямую копировать рабочий целиком без всякой оптимизации в Avi поток .При расширении 1024x768 тормоза жуткие. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Тогда просмотри внимательнее мой предыдущий ответ (Часть 2), где ссылки ПримерX
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Так ты что хочешь?
1) Записать (скопировать) видео, которое воспроизводится? Или 2) Записать видео про то, как окошки открываются, мышка двигается и тп. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Вот вот оно самое!!! |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Ловишь указатель на Раб Стол (GetDesctopWindow), организуешь класс ДД на него, получаешь указатель на память и копируешь каждые х*100 мсек видеодамп. Скорость 24 Гц - в не надо. Достаточно 6-12 - сам смотри. И делай преобразование в 8 битную картинку. Для начала просто набор бмп-шек гони, потом можно и видео делать. Просто надо будет узнать, как кодеки юзать.
Это сообщение отредактировал(а) Fixin - 3.8.2005, 22:15 |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Fixin сразу на диск писать не получается это слишком медленно.
Сделал по таймеру 1с запись всего рабочего стола в Avi поток, тормозит ужасно |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Первый пример уловка, там грабление происходит не из проигрывателя, а из самого файла, насколько понял. Остальные интересней, спасибо |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Написал захват изображения в лоб по кадрам.
Беру по таймеру изображение в прямоугольнике и записываю в Avi поток по кадрам. Неплохо получается при небольших размерах прямоугольника, но если весь рабочий стол,то жуткие тормоза. Вот только курсор самому надо рисовать. Возникает глюк- в MS Paint курсор карандаш, а у меня обычная стрелка?! Пользуюсь функцией GetCursor(),а рисую DrawIconEx. Никто не знает как это исправить? Еще нашел в интернете пару ActiveX контролов,которые позволяют добавить в приложение запись экрана монитора, но они все платные. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
И еще как можно избежать повторного копирования:
BitBlt GetDIBits AVIStreamWrite Можно ли пропустить промежуточный шаг? |
|||
|
||||
| Fixin |
|
||||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Сразу? Естественно. Надо по несколько кадров кучей и в отдельном потоке (программном). Поток AVI тормозит из-за сжатия (возможно). Я бы делал собственный формат - один заголовок и далее набор кадров. В любом случае, кадры нужно буферизировать. Добавлено @ 20:58
|
||||||
|
|||||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Порылся в МСДН, но искал я всега плохо...
|
|||
|
||||
| JoyEx |
|
||||||||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
p0s0l У тебя получается как в анекдоте, в военкомате:
К примеру, Пример 1: FrameGrabberdemo.zip – это проект для DirectShow Чтобы скомпилировать этот проект: 0) Пропиши в VC++ пути к DirectX 9.0 SDK 1) Если будет fatal error LNK1181: cannot open input file 'Strmbase.lib', то тогда иди в \DX90SDK\Samples\C++\DirectShow\BaseClasses\ и компилируй проект, получишь Strmbase.lib, StrmbaseD.lib У себя в проекте добавь в .cpp
или в св-вах проекта (через диалог) 2) Если компилятор не найдет CLSID-ы и IID-ы, то тогда следует подсунуть ему strmiids.lib 3) В функции CFrameGrabberDemoDlg::DoExtractFrame() исправь код, чтобы было примерно так:
т.е. в переменную size необходимо записывать размер картинки и токо потом в битмап (через buffer) засовывать что-то. 4) В mt.subtype = MEDIASUBTYPE_RGB??? укажи правильный подтип, в зависмости от bpp экрана. Видео обычно выводится через оверлей, но если видяха не поддерживает его аппаратно, то тогда программно эмулируется оверлей, а это значит, что тебе DirectX не нужен: из видеопамяти Рабочего стола, через HDC можно сграбить картинку. Ну, а если вывод осуществляется аппаратно, то тогда приходит на помощь интерфейс ISampleGrabber (чтобы увидеть окно с оверлеем - pVideoWindow->put_AutoShow(OATRUE);), т.е. проигрываешь видео и с помощью фильтров делаешь что хочешь. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||||||||
|
|||||||||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Модератор: Кхе-кхе... не отклоняемся от темы, господа
Добавлено @ 10:14 Смотрим сюды: http://forum.vingrad.ru/index.php?showtopi...40&st=0&hl=jpeg Тырим код кодирования изображения в JPG. Далаем вот это:
Только кодируя на лету. Из каждого кадра в 3 мега получаем примерно 40-50 кб. Тормоза должны уйти. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Fixin я пробовал и с сжатием и без сжатия.
Если кодек нормальный то разница не очень большая. А вообще хранить кадры целиком в виде кучи не очень красиво. Слишком большой рост занимаемой оперативной памяти будет. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Ой я ошибся попробовал с кодеками Microsoft MPEG4- загрузка ЦП 100%, в то время как полные кадры 50% при захвате прямоугольника 500x500.
Maniak зачем самому кодировать,если можно использвать готовые кодеки? |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Мне не очень понятно как эти кодеки могут работать. Как ты делаешь?.. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
С помощью AviCompressedStream функции получаю указатель на stream/
Потом просто кадры не сжатые в него пишу.Если выбрать нормальный кодек, то размер файла получается очень маленький. Кстати протестил две программки, которые тоже самое делают, они тоже сильно тормозят, когда 1024X768. еще когда прямоугольник маленький они увеличивают количество кадров в секунду. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Как-то можно юзать DirectX для этих целей.
Недавно тестил программку, которая тем же занимается, она при 1024X768 30% процессора хавает, но почему то курсор мыши при этом мигает. Правда из DirectDraw импортирует только DirectDrawCreate,как узнать как она это делает? Похоже пора перемещаться на раздел DirectX. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Leksey проблема интересная, перемещайся
|
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
А те 4 примера, что ты привел не работают для этой цели... Первый пример - не то чтобы не граббит оверлеи, он даже из фильма не хочет грабить (запускал готовый .exe), да и причем здесь фильм ? Второй и третий пример - это получение изображений с различных устройств. Или есть возможность захватить то, что идёт на монитор ? Вряд ли... (эти примеры не стал пробовать...) Четвертый пример - автор даже не упомянул об оверлеях... Впрочем, для пущей убедительности, я навсякий случай скачал пример и запустил - оверлеи не граббятся...
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
p0s0l
Самый простой вариант это перехватить API-вызов DirectDrawCreate() в чужом (или своём) процессе и тем самым получить интерфейс IDirectDraw, а затем можно с помощью lpDirectDraw->EnumSurfaces() найти оверлейную поверхность и lpDDSurface->GetDC (&hdc). Всё! Имея HDC оверлея делай чё хочешь Если это подходит, то завтра дам пример. PS Чё "бородатый" анектод рассказать нинзя?! -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
А в том примере №1, если не исправить ошибку (в п.4 я говорил уже о ней), то ничего не будет работать у "родного" FrameGrabberDemo.exe.
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| JoyEx |
|
||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
P0S0L
Если в kernel-mode лезть, то тогда можно: хучить в VideoPort драйвере DriverInit(,DataPointer ,), из DataPointer получишь адреса DdUpdateOverlay(), DdXXX и т.п...
И всё же Посмотри аттачи, там мой bin1.zip и bin2.zip (для WinXP) – там loader.exe запускает overlay.exe и грузит в него spy.dll, которая перехватывает вызов DirectDrawCreate()¸тоже самое можно сделать и с CoCreateInstance(), а чтобы не пропустить более ранние процессы надо "пораньше вставать". Это сообщение отредактировал(а) JoyEx - 8.8.2005, 13:40 Присоединённый файл ( Кол-во скачиваний: 15 )
bin1.zip 31,80 Kb-------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||
|
|||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Вот второй .zip
Это сообщение отредактировал(а) JoyEx - 8.8.2005, 13:40 Присоединённый файл ( Кол-во скачиваний: 16 )
bin2.zip 17,33 Kb-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
За старания, конечно, спасибо! Я б и сам давно уже накатал бы, но это не катит, как я и говорил уже. Вставать пораньше не годиться... Вернее, это годиться, но не для всех задач...
Если уж вставать по-раньше, то проще вначале создать оверлейную поверхность, тогда уже другие программы будут обходиться без неё (это конечно шутка!) PS: Архивы я скачал, но как там хоть какой-то результат-то получить ? В кернел моде хучить - тоже плохой выход -------------------- С уважением, г-н Посол. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
- Перед запуском Loader.exe не должен быть запущен overlay.exe, а если overlay.exe не может создать оверлей, то тогда закрой, например, проигрыватель с оверлеем или типа того. В Win9X мой пример работать не будет. Это сообщение отредактировал(а) JoyEx - 7.8.2005, 15:27 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
Я так-то сразу и запускал loader... Щас убедился, что в процессах нет overlay.exe, запустил loader. Проигрыватели не запущены...
Лучше скажи, что я должен увидеть ? Когда запускаю лоадер, в процессах на долю секунды появляется overlay.exe и исчезает... У меня WinXP... -------------------- С уважением, г-н Посол. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
overlay.exe создает в левом-верхнем углу оверлей типа "Hello, P0S0L! ...", а когда запускаешь через loader.exe - грузится spy.dll (через CreateRemoteThread()), вот она и подменяет адрес ф. DirectDrawCreate() на свой (в таблице импорта overlay.exe) и ждет, когда будет вызов DirectDrawCreate(). Ну вот, когда overlay.exe обратится к DirectDrawCreate(), то попадет в spy.dll и примерно через 1 сек. в оверлее меняется надпись на "Hello from Spy.dll".
p0s0l, тысяча извинений! Я там перепутал первую букву. Уже исправил и переаттачил zip-ы. Это сообщение отредактировал(а) JoyEx - 7.8.2005, 17:00 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
JoyEx, сейчас вроде получше, я хоть что-то вижу
Во, выдаёт: Присоединённый файл ( Кол-во скачиваний: 39 )
err.gif 4,31 Kb-------------------- С уважением, г-н Посол. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Завтра вечером исправлю
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Leksey |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
p0s0l и
JoyEx я надеюсь ,что не помешаю вам. Написал два теста. Один на DirectX, другой WinAPI: WinAPI
DirectX
Как вы думаете какой быстрее работает? А вот и не угадали!!! Быстрее работает первый! Может кто-нибудь сможет объяснить? |
||||
|
|||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Автор топика имеет полное право требовать закрытия флейма. Но мне показалась их беседа полезна - вдруг, наконец, решат?.. Мне кажется тут из разряда "кувалдой кнопки вбивать". Скопировать изображение с рабочего стола, что на WinAPI, что на DX - одно и тоже. Никаких вычислений не требуется. Но в DX может быть куча всего, что тормозит в прогах вроде твоей. Первое, что бросается в глаза - вызовы функций Lock/Unlock. Даже если время на их вызов тратится незначительное при твоей скорости сканирования экрана это может оказаться весомым тормозом. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Leksey
Всё зависит от того, где размещены hMemDC и lpDDS. Если в системной памяти, то будет медленно, а если в видеопамяти – быстро, а самое главное - DirectX может сделать синхронизацию по кадрам (VSync!). Попробуй Lock/Unlock сделать вне while. p0s0l Я уже исправил и переаттачил zip-ы. Это сообщение отредактировал(а) JoyEx - 8.8.2005, 14:55 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
JoyEx не поверишь.
Задавал при создании внеэкранной поверхности размещение в видеопамяти. На моем компе все равно через HDC быстрее было(Загруз процессора меньше). А попробовал на другом компе на котором встроенная видюха, и не позволяет создавать в видеопамяти внеэкранную поверхность(создаю в системной, видеопамяти не хватает). На нем вариант с DirectX быстрее работал,но только меню и курсор мыши мигают почему-то? |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Windows получая прерывания от мышки пытается нарисовать курсор на экране, а в этот момент уже DirectX, наверное, заблокировала 1 видеостраницу. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
А как это исправить?
Если получается создать внеэкранную поверхность в видеопамяти, то мерцания не наблюдается. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
JoyEx, теперь другая ошибка - 88760104...
(видяха поддерживает оверлеи, FX5600)... Ладно уж буди не мучайся -------------------- С уважением, г-н Посол. |
|||
|
||||
| JoyEx |
|
||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
- до запуска проги уже кто-то юзает оверлей :-)
- тогда остается токо делать фильтры-кодеки -------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 3 Всего: 112 |
-------------------- С уважением, г-н Посол. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Ok. Leksey Почему напрямую не берешь картинку из GDI-поверхности (из своей lpDDSurface, первичной?), через ddsd.lpSurface – это же базовый адрес “куска” видеопамяти (поверхности), который DirectDraw отобразил в твой процесс?! Будет же быстрее. Токо вот, когда работаешь через HDC не надо думать о структуре видеопамяти, а если будешь делать типа memset(ddsd.lpSurface, 0x80, логич. ширина экрана * кол-во строк), то в режиме TrueColor24 (формат пикселя - 8:8:8), TrueColor32(8:8:8:8) всё будет хорошо, а вот в HiColor15 (1:5:5:5) или HiColor16(5:6:5) уже будут проблемы. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Будет быстрее, но будет происходить мерцание меню.
Я так пробовал . У MSVS менюшки дрожат. Добавлено @ 13:16 JoyEx а почему будут проблемы с 16-битным режимом? И еще почему картинка получается вверх ногами? |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Leksey
1) 0x80 - серый цвет для 24, 32 bpp экрана, а для 16bpp уже...е не серенький 2) BITMAPINFO > BITMAPINFOHEADER:
Это сообщение отредактировал(а) JoyEx - 9.8.2005, 14:30 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Я говорю про пример на DirectX. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Дык формат хранения один и тот же должон быть. Разницы никакой.
|
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
Видеопамять отображается на экран монитора слева направо и сверху вниз, если битмап аппаратно-зависимый (HBITMAP), то тогда у него структура картинки такая же как и у видеопамяти.
Ф-цию GetDIBits() можно "попросить", чтобы она вернула перевернутую картинку, и даже заказать другой bpp. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |