Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DirectDraw - есть ли ограничения на размер и к-во поверхностей ? [Delphi, Windows]


Blondin ©   (2006-07-12 11:03:00) 

Добрый день.
Пишу небольшое приложение с исп. DirectDraw.
Для анимации все кадры пихал в одну bmp, ее грузил на поверхность,
а при выводе копировал из нее нужные кадры (BltFast) на первичную.
На некоторых машинах работает2 прекрасно, на некоторых анимация
не выводится.
 Давно еще я читал (но непомню где), что некоторые видеокарты
не позволяют работать со вторичн. проверхностью, если она
больше первичной. Так ли это ?
 Допустим я каждый кадр анимации загружу на отдельную поверхность,
но кадров много, получиться несколько сотен пов., будет ли оно
работать, нет ли ограничений на их к-во ?

Спасибо.


Blondin   (2006-07-17 13:37:00) [1]

Sapersky   (13.07.06 16:19) [4]

да, действительно, стормозил я конкретно.
пока обнаружил, что также везде работает, если для большой
поверхности при создании указать размещение в системной памяти.
скорость для меня приемлема, пока остановлюсь на этом


Don Nikola   (2006-07-15 04:10:00) [2]

Кстати, можно пихать кадры в простыню не горизонтально, а вертикально, так вроде пооптимальнее будет - не будет размазанных на пару метров кадров, да и проблем со слишком широкими поверхностями не должно возникать.


Sapersky   (2006-07-13 16:19:00) [3]

Если всё работает - это хорошо, но я вообще-то имел в виду не флаг при создании поверхности, а проверку вроде такой:

Var DDCaps : TDDCaps;

ZeroMemory(@DDCaps, SizeOf(TDDCaps));
DDCaps.dwSize := SizeOf(TDDCaps);
DDraw.GetCaps(@DDCaps, nil);

If (DDCaps.dwCaps2 and DDCAPS2_WIDESURFACES) = 0 then ShowMessage('Большие поверхности не поддерживаются');

А если при создании поверхности, то это получился (в зависимости от того, в dwCaps или в dwCaps2) какой-то другой флаг. Какой именно - можно посмотреть в DirectDraw.pas, с учётом того, что
DDCAPS2_WIDESURFACES            = $00001000;
Например, для ddsCaps.dwCaps:
DDSCAPS_TEXTURE                         = $00001000;
Для ddsCaps.dwCaps2:
DDSCAPS2_CUBEMAP_POSITIVEY              = $00001000;


Blondin   (2006-07-13 12:09:00) [4]

Получилось !
при создании пов. указал флаг DDCAPS2_WIDESURFACES
и все пошло

Sapersky, великое спасибо !


Blondin   (2006-07-12 15:06:00) [5]

Спасибо, с флагом поиграюсь.

>Вообще видеокарты с ограничением на размер поверхности наверняка уже вымерли
я пробовал на радеоне 9000 - не выводилось.


Sapersky   (2006-07-12 13:54:00) [6]

Вообще видеокарты с ограничением на размер поверхности наверняка уже вымерли. Но можно на всякий случай проверить флаг DDCAPS2_WIDESURFACES в DDCaps.dwCaps2.
Сам сталкивался с такой вещью - ограничение макс. размера поверхности, с которой можно сделать stretch (= макс. размеру текстуры, напр. 2048*2048; видимо, stretch реализован через D3D). Но если без stretch - всё работало независимо от размера.
Возможно, большая поверхность не влезает в видеопамять, и из-за этого проблемы, хотя теоретически их не должно быть, за исключением меньшей скорости.
По количеству поверхностей - вроде ограничений нет. Но создание множества мелких поверхностей медленнее (может занять несколько секунд - в книге Краснова был пример на эту тему), чем одной большой.


Наверх

Титульная страница Поиск, карта сайта Написать письмо