Конференция "Игры" » DirectDraw - Поверхности
 
  • max_ (21.08.07 11:20) [0]
    Всем привет. У меня такой вопрос - как лучше сделать, одну большую поверхность или  кучу маленьких (наверное все-таки большую), и еще вопрос, я читал, что лучше не создавать внеэкранные поверхности больше первичной (главной)?
    -------------------------------------------
    Спасибо
  • @!!ex © (21.08.07 14:31) [1]
    DirectDraw вроде бы изжыл себя...
    Сейчас, елси не ошибаюсь все делаеться через Direct3D.
  • homm © (21.08.07 19:36) [2]
    Просто рассуждения, не подкрепленные документально.

    Много мелких — лишний расход памяти на служебные структуры, но возможна в карточках есть какая-то оптимизация, если блитится поверхность целеком, а не кусочек.
  • max_ (21.08.07 19:46) [3]

    > Сейчас, елси не ошибаюсь все делаеться через Direct3D

    c 2D, на мой взгяд, проще работать в DirectDraw'е
  • @!!ex © (21.08.07 20:40) [4]
    > [3] max_   (21.08.07 19:46)

    Не понимаю, что может быть проще. чем нарисовать текстурированный полик... а в 2Д большего и не надо.

    По сабжу - реально не знаб ответа, работал с DD только один раз и хороших впечатлений о нем не осталось.
  • homm © (21.08.07 20:49) [5]
    > [3] max_   (21.08.07 19:46)

    В DD некоторые веши реализовываються либо очень сложно, либо очень медленно, либо и так и так сразу.
    Яркий пример — полупрозрачный блиттинг. А в 3D никто не запретит хоть шейдеры использовать.
  • DevilDevil © (22.08.07 11:22) [6]
    помоему было бы здорово совмещать....

    Нужно например отобразить фон 800x600... В 3D потребуется создавать текстуру 1024x1024. Ну и кнопочки всякие, панельки. ColorKey тоже очень быстро работает. Предполагаю, быстрее, чем через 3D. + в 3D имеет место проблема "тексель в пиксель"; я до сих пор не могу решить.

    А все остальные вещи, требующие альфу, повороты и т.д. и т.п реализовывать через 3D.

    Интересно, такое совмещение вообще осуществимо ? Ну, скажем DX7 есть же что то DD-3D-подобное...

    Единственное, что меня приводит в ужас - это восстановление поверхностей. Не знаете, можно ли обходиться без перезагрузки из файла?
  • Sapersky (22.08.07 12:14) [7]
    Нужно например отобразить фон 800x600... В 3D потребуется создавать текстуру 1024x1024.

    Сейчас многие карты поддерживают "небинарные" текстуры, во всяком случае, при выводе в 2D. Нужно проверять соотв. флаги.

    ColorKey тоже очень быстро работает. Предполагаю, быстрее, чем через 3D.

    В своё время тестировал - на большом кол-ве спрайтов D3D быстрее (если выводить их одним вызовом).

    + в 3D имеет место проблема "тексель в пиксель"

    Решается через -0.5 ко всем координатам, если не ошибаюсь.

    Интересно, такое совмещение вообще осуществимо ? Ну, скажем DX7 есть же что то DD-3D-подобное...

    Ну если очень хочется, то можно, именно в DX7. Там device D3D создаётся на базе поверхности-бэкбуфера (созданной со спец. флагом). Можно использовать как блиттинг, так и вывод через D3D. Пример могу выложить.

    Единственное, что меня приводит в ужас - это восстановление поверхностей. Не знаете, можно ли обходиться без перезагрузки из файла?

    Managed-текстуры в D3D7 поддерживаются.
  • @!!ex © (22.08.07 12:53) [8]
    > [6] DevilDevil ©   (22.08.07 11:22)

    Тексель в пиксел не проблема.
    Просто нужно учитывать разрешение при выводе полигона.
  • DevilDevil © (22.08.07 13:01) [9]
    > В своё время тестировал - на большом кол-ве спрайтов D3D
    > быстрее (если выводить их одним вызовом).


    Далеко не всегда получается выводить "массив" спрайтов, тем более, чтобы спрайты располагались на одной текстуре. Чаще приходится прибегать к DrawPrimitiveUp... да и не в этом суть! :)

    > Сейчас многие карты поддерживают "небинарные" текстуры
    что значить "небинарные" ? не кратные двойке ?
    в таком случае... карты может и есть, только их среди казуальщиков мало

    > Решается через -0.5 ко всем координатам, если не ошибаюсь.
    вроде не ошибаешься... только у меня наскоком решить не удалось

    > Ну если очень хочется, то можно, именно в DX7. Там device
    > D3D создаётся на базе поверхности-бэкбуфера (созданной со
    > спец. флагом). Можно использовать как блиттинг, так и вывод
    > через D3D. Пример могу выложить.


    Выложи, пожалуйста, очень интересно

    > Managed-текстуры в D3D7 поддерживаются.
    что это такое?
  • DevilDevil © (22.08.07 13:02) [10]
    > @!!ex ©   (22.08.07 12:53) [8]

    недопонял.
    предполагаю, ты не то имеешь ввиду :)
  • @!!ex © (22.08.07 13:10) [11]
    > [10] DevilDevil ©   (22.08.07 13:02)

    Я имею ввиду, что вывести полик на экран так, чтобы каждый тексель лег ровно в пиксель экрана - не порблема.
  • Sapersky (22.08.07 13:47) [12]
    Далеко не всегда получается выводить "массив" спрайтов, тем более, чтобы спрайты располагались на одной текстуре.

    Ну всякие там системы частиц и т.п.
    Кстати, здесь у D3D8 и более поздних есть преимущество - они поддерживают point sprites (можно указать только центр спрайта и размер - передаётся одна вершина вместо 4).

    что значить "небинарные" ? не кратные двойке ?
    в таком случае... карты может и есть, только их среди казуальщиков мало


    Не кратные, да. Поддерживаются, например, интегрированной на Intel 915, Radeon 9000, и, видимо, всеми более поздними. Флаги (в DX7) - D3DPTEXTURECAPS_POW2, D3DPTEXTURECAPS_NONPOW2CONDITIONAL.

    > Ну если очень хочется, то можно, именно в DX7. Пример могу выложить.
    Выложи, пожалуйста, очень интересно


    http://sapersky.narod.ru/files/D3D7_sprite_sample_04.rar

    > Managed-текстуры в D3D7 поддерживаются.
    что это такое?


    D3D создаёт копию текстуры в системной памяти и автоматически восстанавливает из неё ту, что в видеопамяти. Хотя основное назначение этой фичи - обеспечение нормальной производительности при нехватке видеопамяти (нужные в данный момент текстуры автоматически подгружаются в видео, ненужные выкидываются). Но расходуется системная память, которая тоже не бесконечна.
  • max_ (22.08.07 14:17) [13]
    спасибо, наверное я перейду все таки на DirectX.
  • DevilDevil © (22.08.07 15:45) [14]
    > Sapersky   (22.08.07 13:47) [12]

    очень интересное демо...

    - если нажать на крестик, то приложение закрывается, а процесс живёт и жрёт 90% времени

    - а можно например сначала блиттинг, потом 3D, потом опять блиттинг ? Блиттинг можно выполнять в момент
    BeginScene/EndScene

    ?

    - не вижу, что ты
    Clear

    вызываешь...

    - а нет ли у тебя на данной основе более функциональонго движочка?

    - так и недопонял по поводу потери поверхностей... т.е. можно както при создании поверхности, указать ей, чтобы в случае чего, сама восстановилась? С потерей текстур никогда проблем не было, не думал, что такой ценой. Логичнее хранить на диске. Ну или как минимум в очень упакованном виде...
  • DevilDevil © (22.08.07 16:52) [15]
    такой вот ещё вопрос....
    имеет ли в DX7 место вопрос вертикальной синхронизации ?
  • Sapersky (22.08.07 19:37) [16]
    - если нажать на крестик, то приложение закрывается, а процесс живёт и жрёт 90% времени

    Забыл добавить в WndProc обработку крестика (т.к. сам всегда жму Esc):
    Case msg of
     WM_CLOSE : bQuit := True;
    <...>

    - а можно например сначала блиттинг, потом 3D, потом опять блиттинг ? Блиттинг можно выполнять в момент BeginScene/EndScene ?

    Вроде бы никаких ограничений нет, хотя, наверное, для производительности не очень полезно постоянно дёргать карту из одного режима в другой.

    - не вижу, что ты Clear вызываешь...

    В данном случае незачем. Вращающийся квадрат перекрывает всё окно, Z-буфера нет.

    - а нет ли у тебя на данной основе более функциональонго движочка?

    Есть нечто немного более функциональное, кривое и недописанное. Наверное, проще писать с нуля, чем в нём разбираться.

    так и недопонял по поводу потери поверхностей

    В D3D7 и более ранних текстура = поверхность, созданная со спец. флагом. Указать, чтобы она была managed - можно, для моего примера sco := [scIsTexture, scManaged] в InitSprite, хотя этот пример всё равно не умеет восстанавливать primary, backbuffer, device...
    Если потери поверхностей так уж напрягают, см. DX10 - там ничего не теряется в принципе, т.к. видеопамять - разделяемый ресурс.

    имеет ли в DX7 место вопрос вертикальной синхронизации ?

    В смысле, можно ли включить? Так же как и обычно в DDraw (вроде по умолчанию в полноэкранном режиме она уже включена).
  • DevilDevil © (27.08.07 10:32) [17]
    > Sapersky   (22.08.07 19:37) [16]

    так и не получилось восстанавливать Primary и BackBuffer


    > Есть нечто немного более функциональное, кривое и недописанное.
    >  Наверное, проще писать с нуля, чем в нём разбираться.

    выложи всёравно - очень интересно.

    ИМХО Managed - нехороший механизм. помоему правильнее хранить в сжатом виде - памяти меньше расходуется. Лучше этот механизм самому реализовывать.
  • Sapersky (28.08.07 17:23) [18]
    ИМХО Managed - нехороший механизм. помоему правильнее хранить в сжатом виде - памяти меньше расходуется. Лучше этот механизм самому реализовывать.

    Ну и сильно ты сожмёшь? В лучшем случае раза в 2, скорее меньше.
    Может, тогда сразу использовать сжатые форматы текстур, DXT1-5. Хотя лично мне не нравится качество, которое они дают.

    Всё-таки с managed меньше проблем + быстрее выполняется копирование картинки в текстуру, что заметно при большом кол-ве и размере текстур. В DX8-9 не-managed текстуру вообще невозможно залочить, т.е. нужно доп. буфер создавать.

    выложи всёравно - очень интересно.

    Сейчас перетряхиваю этот "движок" - очень много "лишнего" исходного кода, т.е. модулей, которые используются процентов на 5. С говорящим названием вроде my_sysutils.pas.
    Попробую кое-что выкинуть.

    Пока можешь посмотреть DDUtil.pas, это некий framework для DDraw (D3D несложно прикрутить). Имеется в составе любых заголовков от Clootie или отдельно:
    http://www.clootie.ru/delphi/DirectXExamples/All_DirectDraw.zip
  • DevilDevil © (29.08.07 10:06) [19]
    > Ну и сильно ты сожмёшь? В лучшем случае раза в 2, скорее
    > меньше.


    Ну если вместо 30мб будет занимать 15 - тоже неплохо

    > Пока можешь посмотреть DDUtil.pas
    Да, интересно. Там, правда, маловато, пример один завис, при восстановление из полноэкранного режима не прорисовывается заголовок окна... но в общем очень даже ничего!

    Была бы такая же библиотечка ("движочек") для DD + D3D...
  • Sapersky (29.08.07 16:37) [20]
    http://sapersky.narod.ru/files/AnyDX2D_v0.5.rar

    Требуются стандартные заголовки DX от Clootie.

    Ещё нашёл у себя переведённый на Delphi D3D framework из DX7 SDK:

    http://sapersky.narod.ru/files/D3D7_SDK_Framework.rar
  • DevilDevil © (29.08.07 16:39) [21]
    > Sapersky   (29.08.07 16:37) [20]

    большое спасибо, очень интересно, буду изучать!
 
Конференция "Игры" » DirectDraw - Поверхности
Есть новые Нет новых   [134431   +10][b:0][p:0.001]