Overlay в DDraw

Тема в разделе "WASM.WIN32", создана пользователем Z3N, 24 авг 2009.

  1. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Как работать с оверлеями в DDraw???
    Я читал книгу (Трухильо 98-го года...) там всё более-менее описано, но вот тольк не про оверлеи. Я попробовал сам, но ничего не вышло. Вроде бы все поверхности нормально создаются, а вот при попытки обращения к ним я получаю FAULT. Моя видеокарта поддерживает работу с оверлеями - это точно. Я приложил исходник (я этот пример вытянул из нета и немного модифицировал), надеюсь, что там всё понятно. То есть, если всё пройдёт нормально, сверху у экрана должен появиться белый прямоугольник размером 1024х30.
    Если кому интересно почему же именно оверлей... просто я хотел рисовать поверх всех окон и чтобы это всё не моргало. Я пробовал сначала синхронизировать с развёрсткой, но ничего хорошего из этого не получилось. Вот если бы WaitForVerticalBlank действительно поддерживала нотификацию по эвенту, то тогда это может быть и сработало. Кстати, может кто-нибудь знает, зачем в функции объявлять возможность нотификации по эвенту, а потом ниже писать, что пока они это не доделали. И делают они, уже судя по всему, восемь версий директ икса :dntknw:. Потом решил блокировать нужную часть экрана, но не помогло, моё окно действительно не рисуется в залоченой части, а вот остальные приложения рисуют в неё совершенно свободно.

    И ещё один вопрос - Может кто-нибудь знает, что надо передовать в Unlock в седьмой версии DD? Раньше был лпвоид, а теперь лпрект. У меня, конечно есть предположение, что надо передовать тот же рект, который мы передовали функции Lock. Просто хотелось бы ясности.

    Может кто-нибудь знает хорошие книги по DDRAW??? Что-то я в гугле не натолкнулся (честно говоря, я недолго искал...). Я бы с удовольствием их почитал.

    P.S.:
    Но вот выводят же как-то Fraps и ATi Tray Tools фпс и ничего не моргает при этом. Я смотрел, ати трай тулз перехватыват GetProcAdress и ещё чего-то. Хотелось бы найти более легкий способ, без хуков.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Fraps хукает. Например если вместо ID3DDevice9::Present использовать ID3DDevice9::PresentEx, то он обламывается. Я оверлеи не юзал, но вот рабочий пример:DDraw Overlay
     
  3. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Спасибо за ссылку, посмотрел исходник и слегка его переделал (там стл и всякие бяки вроде классов) и что самое удивительное всё заработало! Выводит изображение даже поверх игр!!! Хотя не на всех играх стабильно работает. Вот в CNQ (доработанный клиент Q3)
    пашет без проблем, а в контре 1.6 не работает, наверно потому, что теряется сурфейс. Просто я перенёс не весь код из примера, а только самое нужное, потом как-нибудь допишу, чтобы нормально работало. Единственное, что меня огорчает, так это то, что на моей видеокарте максимальное количество оверлеев равно единице... и она поддерживает прозрачность только по колор кею, а вот альфа прозрачность осталась за бортом :dntknw:.
    Интересно, а зачем Фрапс и иже с ним перехватывают дохрена апи, если можно выводить фпс в оверлее? Накодить такое намного проще и к тому же не надо никаких грязных хуков. Единственное что меня бы могло остановить от вывода фпс в оверлее - это скорость. Неужели вывод в оверлее будет медленней??? Мне кажется, что всё должно быть наоборот, ведь не надо восстанавливать фон и всё такое....
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Выводить то можно. Но во первых надо как-то считать кадры, а во вторых если приложений несколько? И восстанавливать фон не надо, надо просто рисовать на заднем буфере перед переключением или копированием.
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Не знаю как в последних версиях Fraps, но до этого он просто сплайсил d3d**.dll, в частности создание Direct3D Create, после чего при каждом вызове Present лочил BackBuffer и на основе прошедшего числа кадров рисовал свои циферки поверх всего. Причем делал это незамысловатым способом в виде очистки прямоугольниками нужного размера (несколько десятков пикселей) и нужного цвета BackBuffer. Итого на цифру там у него выходила колбаса из массива координат в виде четырех или пяти прямоугольников на цифру, которые он и передавал на вход Clear.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    keYMax
    Всё также.