![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 - всё работало независимо от размера.
Возможно, большая поверхность не влезает в видеопамять, и из-за этого проблемы, хотя теоретически их не должно быть, за исключением меньшей скорости.
По количеству поверхностей - вроде ограничений нет. Но создание множества мелких поверхностей медленнее (может занять несколько секунд - в книге Краснова был пример на эту тему), чем одной большой.