Главной называется поверхность, видимая пользователем на мониторе. Она идентифицируется флагом DDSCAPS_PRIMARYSURFACE. Вы можете иметь только одну главную поверхность для каждого объекта DirectDraw. При создании главной поверхности помните, что ее размеры соответствуют режиму экрана. Однако, вам не надо указывать ее размер при создании. Если вы сделаете это, вызов функции создания поверхности вернется с ошибкой, даже если вы укажете правильную информацию, соответствующую режиму экрана. Вот пример задания описания главной поверхности перед ее созданием:
Здесь ddsd - это тип DDSURFACEDESC2, в который заносится информация о поверхности. Чаще всего он используется перед совершением какого-либо действия над поверхностями. После задания описания, вызывается метод создания поверхности DirectDraw7.CreateSurface с параметром, указывающим на заполненную структуру DDSURFACEDESC2
Задний буфер - это как бы полотно, на котором происходит "сбор" спрайтов, фона, эффектов и т.п. очередного кадра. Затем, задний буфер полностью "переводится" на главную поверхность. Эта операция называется флиппинг. Задний буфер обычно создают вместе с главной поверхностью, он получается как бы прикрепленным к ней. Такой "симбиоз" главной поверхности с одним или несколько задним буфером называется flipping-chain. Набор поверхностей, создаваемых одним вызовом метода CreateSurface называется комплексной поверхностью. Такие поверхности могут управляться также только одним вызовом метода. Создание flipping-chain наиболее частое применение комплексных поверхностей. Вот пример, как можно создать главную поверхность с прикрепленным задним буфером:
Здесь caps - это тип DDCAPS2, dd - DirectDraw7, Primary и BackBuffer - DirectDrawSurface7
Оффскринные (невидимые) поверхности часто используются для хранения (кэширования) изображений, которые потом будут перенесены на задний буфер. Вы должны объявить размеры оффскринной поверхности, включив флаги DDSC_WIDTH и DDSD_HEIGHT, а также значения членов lWidth и lHeight структуры DDSURFACEDESC2. Еще, вы должны указать флаг DDSCAPS_OFFSCREENPLAIN, в типе DDSCAPS, содержащемся в структуре DDSURFACEDESC2. По-умолчанию, DirectDraw создает поверхность в видеопамяти, если только она полностью не занята. В противном случае, поверхность создается в системной памяти. Вы сами можете указать в какой памяти создавать поверхность, указав флаги DDSCAPS_SYSTEMMEMORY или DDSCAPS_VIDEOMEMORY в типе DDSCAPS, содержащемся в структуре DDSURFACEDESC2. В этом примере показано как подготовить создание простой оффскринной поверхности 100x100:
DirectDraw начиная с версии DirectX 5 позволяет создавать оффскринные поверхности, которые больше, чем главная поверхность. Однако это возможно только тогда, когда дисплейное оборудование позволяет делать это. Чтобы проверить, поддерживает ли оборудование пользователя большие поверхности, вызовите метод DirectDraw7.GetCaps и посмотрите на наличие флага DDCAPS2_WIDESURFACES в члене lCaps2 первой структуры DDCAPS, которую вы передали при вызове. Если флаг присутствует, вы можете создавать большие поверхности. |