Directdraw что это за программа
Бытует ошибочное мнение, что механизм DirectDraw слишком сложен для изучения. Цель данной статьи — опровергнуть его.
Уже более пяти лет операционные системы семейства Win32 (Windows 95/98/Me/NT/2000/XP) практически безраздельно властвуют на рынке приложений для платформы Intel. Тем не менее до сих пор многие начинающие программисты не торопятся осваивать Windows. Когда дело касается создания графических приложений, требующих прямого доступа к видеопамяти, они отдают свое предпочтение MS-DOS и низкоуровневым функциям стандартов VGA BIOS и VESA/VBE. Так, и на страницах журнала «Мир ПК» часто можно встретить статьи, посвященные такому подходу. Между тем есть достаточно простой способ решения данных задач средствами Win32, а именно использование части технологии Microsoft DirectX — компонента DirectDraw.
О выборе языка программирования
Объект DirectDraw представляет собой обычный COM-объект, порожденный непосредственно от базового интерфейса IUnknown. Напомню, что COM-объекты очень похожи на обычные объекты языка Cи++, но отличаются рядом ограничений. Так, COM-объекты не могут иметь открытых переменных (полей), конструкторов и деструкторов.
Как поиграть в старые игры Windows 10/8 Direct Draw, DirectX 9.0
Для создания COM-объектов обычно используются специальные функции, а для их удаления применяется метод Release(), принадлежащий базовому интерфейсу IUnknown. Поскольку COM-интерфейсы довольно легко реализуются средствами Cи++, в данной статье выбран именно этот язык программирования. Разумеется, работать с объектами DirectX позволяют и другие популярные языки, например Паскаль (Borland Delphi [3], TMT Pascal [4]) и Visual Basic. Стандартный язык программирования Си также позволяет работать с COM-объектами, но при этом значительно усложняется синтаксис вызова функций DirectDraw, и потому при выборе транслятора следует ориентироваться на Microsoft Visual C++ 6.x.
Создание базового объекта DirectDraw
Первый шаг к применению компонента DirectDraw — реализация базового DirectDraw-объекта при помощи функции DirectDrawCreate(), обычно находящейся в динамической библиотеке DDRAW.DLL и объявленной в заголовочном файле ddraw.h:
LPDIRECTDRAW lpDDraw; hResult = DirectDrawCreate(NULL,
Первый параметр функции DirectDrawCreate() является указателем на GUID (Globally Unique Identifier), определяющим создаваемый драйвер. Чаще всего в качестве этого параметра применяется константа NULL, идентифицирующая активное графическое устройство (Active Display Device).
В случае удачного вызова функция возвращает значение DD_OK и помещает указатель на порожденный объект DirectDraw в переменную lpDDraw. Последний параметр функции DirectDrawCreate() предназначен для COM-агрегирования (COM aggregation), реализующего разделение интерфейсов многократного использования при наследовании одним объектом методов другого. В текущей версии DirectX этот параметр должен иметь значение NULL.
Полученный указатель на объект DirectDraw теперь можно применять для задания прав доступа к экрану (Cooperative Level) и установки графического режима (Display Mode). Права эти задаются с помощью метода SetCooperativeLevel(). Обычно требуется задавать полноэкранный режим с исключительными правами доступа. Делается это следующим образом:
Основы DirectDraw на Visual Basic.NET 1
hResult = pDDraw->SetCooperativeLevel (hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
В качестве первого аргумента SetCooperativeLevel() принимает дескриптор основного окна приложения, которое должно быть создано предварительно (см. листинг). Второй аргумент метода устанавливает флаги, собственно и определяющие уровень доступа.
Установка графического режима
Теперь настало время заняться установкой графического режима. Эта задача решается при помощи метода SetDisplayMode(), аналога функции 02h прерывания Int 13h VESA/VBE, но в отличие от нее позволяет напрямую задавать горизонтальное и вертикальное разрешение экрана, а также максимальное количество цветов, доступное в данном режиме. Например, установка 256-цветного режима с разрешением 640×480 точек будет иметь вид:
hResult = lpDDraw->SetDisplayMode(640, 480, 8);
Следующая же функция устанавливает режим 800×600 точек, поддерживающий уже 65 536 цветов.
hResult = lpDDraw->SetDisplayMode(800, 600, 16);
Здесь следует отметить, что современные версии пакета DirectX содержат новые компоненты DirectDraw2, DirectDraw4 и DirectDraw7, обладающие более широкими возможностями, чем рассматриваемый компонент DirectDraw. Так, они позволяют устанавливать вертикальную частоту развертки монитора, возвращают объем видеопамяти и т.п. Однако для данной статьи мы возьмем именно DirectDraw, поскольку он обладает всеми свойствами, необходимыми для решения поставленной задачи, в частности для получения прямого доступа к видеопамяти в оконных Win32-приложениях.
Создание первичной поверхности
Следующий шаг — создание первичной поверхности (Primary Surface), являющейся объектом DirectDrawSurface. Здесь следует отметить, что компонент DirectDraw дает возможность порождать множество объектов DirectDrawSurface. Чтобы упростить пример, мы заведем всего одну поверхность DirectDrawSurface, отображенную непосредственно на область видеопамяти для получения прямого доступа к ней.
Перед тем как приступить к формированию первичной поверхности, нужно объявить и инициализировать специальную структуру типа DDSURFACEDESC. Вообще говоря, программа взаимодействует с объектом DirectDraw посредством множества различных структур данных, в том числе и через структуру типа DDSURFACEDESC, представленную в файле ddraw.h следующим образом:
typedef struct _DDSURFACEDESC < DWORD dwSize; DWORD dwFlags; DWORD dwHeight; DWORD dwWidth; union < LONG lPitch; DWORD dwLinearSize; >; DWORD dwBackBufferCount; union < DWORD dwMipMapCount; DWORD dwZBufferBitDepth; DWORD dwRefreshRate; >; DWORD dwAlphaBitDepth; DWORD dwReserved; LPVOID lpSurface; DDCOLORKEY ddckCKDestOverlay; DDCOLORKEY ddckCKDestBlt; DDCOLORKEY ddckCKSrcOverlay; DDCOLORKEY ddckCKSrcBlt; DDPIXELFORMAT ddpfPixelFormat; DDSCAPS ddsCaps; > DDSURFACEDESC;
- dwSize — размер структуры в байтах, который должен быть инициализирован перед ее использованием;
- dwFlags — набор флагов, определяющих, какие именно поля структуры содержат инициализированные значения;
- ddsCaps — вложенная структура типа DDSCAPS.
Структура DDCAPS также определена в файле ddraw.h:
typedef struct _DDSCAPS < DWORD dwCaps; >DDSCAPS,FAR* LPDDSCAPS;
Первичная поверхность создается при помощи метода CreateSurface(), принадлежащего объекту DirectDraw:
DDSURFACEDESC ddsd; DDSCAPS ddsc; ZeroMemory( ddsd.dwSize = sizeof(ddsd); ddsd.ddsCaps.dwCaps = DDSCAPS _PRIMARYSURFACE; ddsd.dwFlags = DDSD_CAPS; hResult = (lpDDraw->CreateSurface (lpPrimarySurface, NULL);
Обратите внимание на то, что перед вызовом метода CreateSurface() все неиспользуемые поля структуры типа DDSCAPS должны быть обнулены, а поле dwSize содержать ее точный размер в байтах.
Метод lock()
Мы научились создавать и инициализировать объект DirectDraw, устанавливать требуемый графический режим и формировать первичную графическую поверхность. Теперь нужно позаботиться о получении прямого доступа к видеопамяти. Для этого заблокируем поверхность в памяти при помощи метода Lock():
hResult = lpPrimarySurface->Lock (NULL,
В качестве первого аргумента Lock() получает указатель на структуру типа RECT, содержащую координаты прямоугольной области, к которой мы хотим иметь прямой доступ. В приведенном выше примере вместо указателя на структуру RECT мы взяли значение NULL. Значит, мы хотим, чтобы у нас появился прямой доступ ко всей поверхности, а не к какой-то отдельной ее части. Указатель на саму поверхность передается вторым аргументом метода Lock().
Флаг DDLOCK_WAIT сообщает методу Lock() о том, что при неудачной попытке блокирования поверхности (например, во время проведения blit-операции) следует повторять эту операцию вплоть до возникновения какой-либо иной ошибки типа DDERR_SURFACEBUSY и т.п.
- lpSurface — указатель на область памяти, ассоциированную с поверхностью. Здесь он указывает на начало активной страницы видеопамяти;
- lPitch — расстояние в байтах до начала следующей графической линии; данная величина может быть больше или равна «физической» ширине поверхности (dwWidth), умноженной на размер точки (пиксела) в байтах (BPP).
Таким образом, имея указатель на начало активной страницы видеопамяти, мы способны непосредственно манипулировать ее содержимым. Например, функция очистки видеостраницы может выглядеть так:
memset(lpSurface, 0, ddsd.lPitch * ddsd.dwHeight);
Следует подчеркнуть очень важный момент при работе с заблокированной поверхностью: после выполнения операций, которые связаны с прямым доступом к памяти, ассоциированной с поверхностью DirectDraw, требуется немедленно разблокировать эту поверхность при помощи метода Unlock():
lpPrimarySurface->Unlock (ddsd.lpSurface);
В противном случае операционная система может зависнуть.
Удаление объектов DirectDraw
Перед уничтожением главного окна приложения нужно удалить созданные объекты DirectDraw, чтобы освободить занимаемые ими системные ресурсы. Обычно все делается в обработчике события WM_DESTROY. Главное, о чем всегда следует помнить при работе с COM-объектами, — это то, что недопустимо применять метод delete() непосредственно.
Дело в том, что удаляемый объект может использоваться другим приложением, ведь мы работаем в многозадачной среде. С подобной проблемой легко справляется метод Release(), который просто уменьшает счетчик ссылок на объект (reference count) и вызывает метод delete() лишь тогда, когда значение этого счетчика равно нулю. Это свидетельствует о том, что удаляемый объект не используется ни одним приложением.
В данном примере мы создали два COM-объекта, причем указатели на них содержатся в переменных lpDDraw и lpPrimarySurface. Значит, при обработке системного события WM_DESTROY нам требуется применить всего два метода:
lpPrimarySurface->Release(); lpDDraw->Release();
Простейшая программа, демонстрирующая прямой доступ к видеопамяти средствами DirectDraw, приведена в листинге.
#include #include const PHYSICAL_WIDTH = 800; const PHYSICAL_HEIGHT = 600; LPDIRECTDRAW lpDDraw; LPDIRECTDRAWSURFACE lpPrimarySurface; LRESULT CALLBACK DDrawWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); BOOL DDrawInit(HWND hWnd); void DDrawDone(); void DrawScreen(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) < WNDCLASS wndClass; HWND hWnd; MSG msg; ZeroMemory( wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = DDrawWndProc; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.lpszClassName = ; RegisterClass( hWnd = CreateWindowEx( WS_EX_TOPMOST, wndClass.lpszClassName, , WS_POPUP | WS_MAXIMIZE, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage( TranslateMessage( DispatchMessage( >return msg.wParam; > LRESULT CALLBACK DDrawWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) < switch(message) < case WM_CREATE: DDrawInit(hWnd); SetTimer(hWnd, 1, 50, 0); return 0; case WM_TIMER: DrawScreen(); return 0; case WM_KEYDOWN: if (wParam == VK_ESCAPE) SendMessage(hWnd, WM_CLOSE, 0, 0); return 0; case WM_DESTROY: KillTimer(hWnd, 1); DDrawDone(); PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); >> BOOL DDrawInit(HWND hWnd) < DDSURFACEDESC ddsd; DDSCAPS ddsc; if (DirectDrawCreate(NULL, if (lpDDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK) return FALSE; if (lpDDraw->SetDisplayMode(PHYSICAL_WIDTH, PHYSICAL_HEIGHT, 8) != DD_OK) return FALSE; ZeroMemory( ddsd.dwSize = sizeof(ddsd); ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; ddsd.dwFlags = DDSD_CAPS; if (lpDDraw->CreateSurface(lpPrimarySurface, NULL) != DD_OK) return FALSE; return TRUE; > void DDrawDone() < if (lpPrimarySurface != NULL) lpPrimarySurface->Release(); if (lpDDraw != NULL) lpDDraw->Release(); > void DrawScreen() < DDSURFACEDESC ddsd; static int pos; ZeroMemory( ddsd.dwSize = sizeof(ddsd); if (lpPrimarySurface->Lock(NULL, char* buffer = (char*)ddsd.lpSurface; for (int i = 0; i < PHYSICAL_HEIGHT / 2; i++) < memset(buffer + (i * ddsd.lPitch), i + pos, PHYSICAL_WIDTH); memset(buffer + ((PHYSICAL_HEIGHT / 2 + i) * ddsd.lPitch), i — pos, PHYSICAL_WIDTH); >pos++; lpPrimarySurface->Unlock(ddsd.lpSurface); > >
Cтандарт VESA/VBE отображает видеопамять в виде отдельных окон (банков) размерами не более 64 Кбайт, причем только одно из них может быть активным в заданный момент времени.
Переключение таких окон значительно усложняет алгоритмы обработки графики, а также замедляет скорость работы всего приложения. Стандарт VESA/VBE, начиная с версии 2.0, позволяет добиться линейного доступа к видеопамяти в режиме LFB (Linear Flat-frame Buffer) аналогично тому, как это делает DirectDraw. К сожалению, приложения MS-DOS, использующие режим LFB, не могут работать под управлением ОС семейства Windows NT (Windows NT/2000/XP). Это значительно ограничивает область применения LFB и практически сводит на нет все его преимущества перед обычными «оконными» режимами VESA/VBE.
В отличие от упомянутых режимов компонент DirectDraw представляет видеопамять в виде непрерывного линейного массива (вектора), напрямую определяющего цвета отображаемых пикселов. Таким образом, программирование графики в режиме прямого доступа к видеопамяти в Win32-приложениях гораздо более простая задача, чем использование средств VESA/VBE в среде MS-DOS.
Литература и Web-ресурсы
- Microsoft DirectX SDK // Microsoft Corp.
- DirectX Programmers Reference // Microsoft Corp.: http://www.microsoft.com/directx/ download.asp
- DirectX for Delphi (также известен как Jedi Project): http://www.delphi-jedi.org/DelphiGraphics
- TMT Pascal Multi-target standard distributive: http://www.tmt.com
Источник: citforum.ru
Direct Draw Термины и концепции — Интерфейсы DirectDraw и DirectDraw2
В первоначальном варианте библиотеки DirectX (еще в те времена, когда она называлась Game SDK) вся основная функциональность DirectDraw была сосредоточена в интерфейсе DirectDraw. Позднее, с выходом DirectX 2, рабочий интерфейс был усовершенствован. В соответствии со спецификацией СОМ интерфейс DirectDraw не изменился, а для работы с новыми возможностями использовался новый интерфейс DirectDraw2.
Следует заметить, что интерфейс DirectDraw2 представляет собой расширение DirectDraw. Он предоставляет все возможности интерфейса DirectDraw, а также ряд дополнительных. При работе с DirectX версий 2 и выше можно выбирать между интерфейсом DirectDraw и DirectDraw2. Поскольку DirectDraw2 делает все то же, что и DirectDraw, а также многое другое, вряд ли можно найти какие-то доводы в пользу работы с DirectDraw.
Кроме того, Microsoft выступает против хаотичного, непоследовательного использования этих интерфейсов. По этим причинам во всех программах, приведенных в книге, будет использован интерфейс DirectDraw2.
Ниже перечислены все функции интерфейсов DirectDraw и DirectDraw2 (в алфавитном порядке):
Compact ()
CreateCIpper()
CreatePalette()
CreateSurface()
DuplicateSurface()
EnumDisplayModes()
EnumSurfaces()
FlipToGDISurface()
GetAvailableVidMem()
GetCaps()
GetDisplayMode()
GetFourCCCodes()
GetGDISurface()
GetMonitorFrequency()
GetScanLine()
GetVerticalBlankStatus()
RestoreDisplayMode()
SetCooperativeLevel()
SetDisplayMode()
WaitForVerticalBlank()
Далее рассмотрены функции интерфейса DirectDraw. Обратите внимание на то, что в оставшейся части этой главы термин интерфейс DirectDraw относится как к интерфейсу DirectDraw, так и к DirectDraw2. Уточнения будут приведены лишь в тех случаях, когда функция отличается в двух интерфейсах.
Функции создания интерфейсов
Интерфейс DirectDraw представляет саму библиотеку DirectDraw. Этот интерфейс является главным в том отношении, что в нем создаются экземпляры всех остальных интерфейсов DirectDraw. Интерфейс DirectDraw содержит три функции, предназначенные для создания экземпляров интерфейсов:
CreateClipper()
CreatePalette()
CreateSurface()
Функция CreateClipper создает экземпляры интерфейса DirectDrawClipper. Объекты отсечения (clipper) используются не всеми приложениями DirectDraw, так что в некоторых программах эта функция может отсутствовать. Вскоре мы рассмотрим интерфейс DirectDrawClipper подробнее.
Функция CreatePalette создает экземпляры интерфейса DirectDrawPalette. Палитры, как и интерфейс DirectDrawClipper, используются не всеми приложениями DirectDraw. Например, приложению, работающему только с 16-битными видеорежимами, палитра не понадобится. Тем не менее приложение, работающее в 8-битном видеорежиме, должно создать хотя бы один экземпляр DirectDrawPalette.
Экземпляры интерфейса DirectDrawSurface создаются функцией CreateSurface. Поверхности обязательно присутствуют в любом приложении DirectDraw, работающем с графическими данными, поэтому данная функция используется очень часто.
Экземпляры самого интерфейса DirectDraw создаются функцией DirectDraw Create(), DirectDrawCreate() — одна из немногих самостоятельных функций DirectDraw, не принадлежащих никакому СОМ-интерфейсу.
Интерфейс DirectDraw позволяет точно узнать, какие возможности поддерживаются как на программном, так и на аппаратном уровне. Функция GetCaps() инициализирует два экземпляра структуры DDCAPS. Первая структура показывает, какие возможности поддерживаются непосредственно видеокартой, а вторая — что доступно посредством программной эмуляции. Функция GetCaps() помогает определить, поддерживаются ли нужные возможности.
DirectDraw автоматически использует аппаратную поддержку, если она имеется, и по умолчанию в случае необходимости переключается на программную эмуляцию. Неудачей заканчиваются вызовы лишь тех функций, которые не поддерживаются ни на аппаратном, ни на программном уровне.
СОВЕТ
DirectX Viewer
В DirectX SDK входит программа DXVIEW, которая сообщает о возможностях всех компонентов DirectX, в том числе и DirectDraw. На большинстве компьютеров информация о DirectDraw отображается в двух категориях: Primary Display Driver и Hardware Emulation Layer. Первая категория сообщает о возможностях аппаратных видеосредств. Во второй перечислены возможности, эмулируемые DirectDraw при отсутствии аппаратной поддержки. На компьютерах с двумя и более видеокартами, поддерживаемыми DirectDraw, DXVIEW выводит сведения о способностях каждой из них.
Функция SetCooperativeLevel()
Функция SetCooperativeLevelО определяет уровень кооперации — степень контроля над видеокартой, необходимую для данного приложения. Например, нормальный (normal) уровень кооперации означает, что приложение не сможет изменить текущий видеорежим или задать содержимое всей системной палитры. Монопольный (exclusive) уровень допускает переключение видеорежимов и предоставляет приложению полный контроль над палитрой. Независимо от выбранного уровня вам необходимо вызвать SetCooperativeLevel().
Функции для работы с видеорежимами
Интерфейс DirectDraw содержит четыре функции для работы с видеорежимами:
EnumDisplayModes()
GetDisplayMode()
RestoreDisplayMode()
SetDisplayMode()
С помощью функции EnumDisplayModes() можно получить от DirectDraw список доступных видеорежимов. По умолчанию EnumDisplayModes() перечисляет все видеорежимы, но по описаниям можно исключить из списка режимы, не представляющие для вас интереса. Функция EnumDisplayModes() не обязана присутствовать в программе, однако это желательно, если вы собираетесь организовать переключение видеорежимов. На рынке существует огромное количество видеоустройств, каждое из которых обладает своими возможностями и ограничениями. Не стоит полагаться на автоматическую поддержку любого конкретного видеорежима, за исключением принятого по умолчанию в Windows режима 640х480х8.
Функция GetDisplayMode() получает сведения о текущем видеорежиме. Она заполняет структуру DDSURFACEDESC информацией о горизонтальном и вертикальном разрешениях, глубине и формате пикселей текущего видеорежима. Ту же информацию можно получить и другими способами (например, по описанию первичной поверхности), поэтому эта функция встречается не во всех программах.
Функция SetDisplayMode() активизирует заданный видеорежим. Версия SetDisplay Mode() из интерфейса DirectDraw2 позволяет дополнительно задать частоту смены кадров. Этим она отличается от функции из интерфейса DirectDraw, в которой можно задать только горизонтальное и вертикальное разрешения и глубину пикселей. Функция SetDisp1ayMode() присутствует в любой программе, осуществляющей переключение видеорежимов.
Функция RestoreDisplayMode() восстанавливает видеорежим, действовавший до вызова SetDisplayMode(). Перед вызовом функций SetDisplayMode() и RestoreDisplayMode() необходимо предварительно установить монопольный уровень кооперации вызовом функции SetCooperativeLevel ().
Функции для работы с поверхностями
Помимо функции CreateSurface() интерфейс DirectDraw содержит следующие функции для работы с поверхностями:
DuplicateSurface()
EnumSurfaces()
FlipToGDISurface()
GetGDISurface()
GetAvailableVidMem()
Compact()
Функция DuplicateSurface() создает копию существующей поверхности. Она копирует только интерфейс поверхности, но не ее содержимое. Копия поверхности использует ту же область памяти, поэтому модификация содержимого памяти приведет к изменению изображения, представленного обеими поверхностями.
Функция EnumSurfaces() используется для перебора всех поверхностей, удовлетворяющих заданному критерию. Если критерий не указан, составляется список всех существующих поверхностей.
Функция FlipToGDISurface() используется перед завершением приложения, осуществляющего переключение страниц, чтобы обеспечить правильное восстановление первичной поверхности. Вспомните о том, что при переключении страниц происходит попеременное отображение двух поверхностей. Это означает, что приложение может завершиться, не восстановив исходной поверхности, отображаемой на экране. Если это произойдет, Windows будет осуществлять вывод на невидимую поверхность. Такой ситуации можно легко избежать с помощью функции FlipToGDISurface().
Функция GetGDISurface возвращает указатель на единственную поверхность, с которой работает GDI. Весь графический вывод Windows осуществляется именно на поверхность GDI. Примером ситуации, когда эта функция может оказаться полезной, является программа копирования экрана, в которой DirectDraw используется для копирования произвольной части рабочего стола.
Функция GetAvailableVidMem() возвращает объем текущей доступной видеопамяти. Эта функция присутствует в интерфейсе DirectDraw2, но отсутствует в DirectDraw. С ее помощью приложение может определить, сколько поверхностей ваше приложение сможет создать в видеопамяти.
Функция Compact() не реализована в DirectX, однако в будущем она обеспечит механизм дефрагментации видеопамяти. Если ваше приложение постоянно создает и уничтожает поверхности, находящиеся в видеопамяти, дефрагментация может высвободить немало места.
Функции для работы с частотой смены кадров
Интерфейс DirectDraw содержит четыре функции, относящихся не к видеокарте, а к устройству отображения (монитору):
GetMonitorFrequency()
GetScanLine()
GetVerticalBlankStatus()
WaitForVerticalBlank()
Говоря конкретно, эти функции относятся к механизму смены кадров на мониторе. С их помощью можно реализовать анимации с минимальным мерцанием и задержками. Тем не менее следует учесть, что эти функции поддерживаются не всеми комбинациями видеокарт и мониторов.
Функция GetMonitorFrequency() возвращает текущую частоту смены кадров монитора. Эта частота обычно измеряется в герцах (Гц). Например, частота в 60 Гц означает, что состояние экрана обновляется 60 раз в секунду.
Функция GetScanLine() возвращает номер строки развертки (горизонтального ряда пикселей), обновляемой в данный момент. Она не поддерживается некоторыми комбинациями видеокарт и мониторов. Если данная способность не поддерживается, функция возвращает код ошибки DDERR_UNSUPPORTED.
В высокопроизводительных графических приложениях обновление экрана обычно синхронизируется с процессом вертикальной развертки. Другими словами, первичную поверхность желательно обновлять в тот момент, когда монитор закончил очередное обновление экрана. В противном случае в одной части экрана будут отображаться новые данные, а в другой — старые.
Подобный эффект называется расхождением (tearing). По умолчанию DirectDraw автоматически синхронизирует обновление экрана с завершением вертикальной развертки. В нестандартных ситуациях можно добиться синхронизации с помощью функций GetVerticalBlankStatus() и WaitForVerticalBlank().
Наш обзор интерфейса DirectDraw завершается функцией GetFourCCCodes(). Она возвращает коды FourCC, поддерживаемые видеокартой. Коды FourCC используются для описания YUV-поверхностей, не относящихся к стандарту RGB. Мы не будем рассматривать такие поверхности, так как они выходят за рамки этой книги.
Источник: codenet.ru
Старые игры и Windows 7 — новое лекарство от проблем
Нашелся человек, занявшийся проблемой работы классических игр в последних версиях Windows.
Течение прогресса неумолимо и вместе с появлением новых функций в программах и системах старые функции потихоньку выходят из обращения и отмирают. С выходом Windows 7 в подобном положении оказалась одна из самых первых графических подсистем Windows — DirectDraw, часть DirectX , предназначенная для работы с 2D-графикой. Хотя сами библиотеки все еще присутствуют в системе, их работа весьма далека от былого качества и быстродействия. И если разработчики новых приложений могут использовать новые интерфейсы, такие как Direct2D, то при запуске Windows-версий классических игр вы можете получить изображение вроде:
или же картинка будет выглядеть нормально, только вот отрисовываться будет буквально что «со скоростью света» — можно наблюдать обновление отдельных пикселов изображения невооруженным глазом. Конечно, путем хитрых и неочевидных манипуляций с ярлыками и рабочим столом проблему обычно можно решить, но финальный результат всё равно оставляет желать много лучшего.
Финскому программисту Jari Komppa надоели проблемы с запуском Gold-изданий игр серии Wing Commander и он решил взяться за проблему радикально. В результате на свет появился DirectDraw→OpenGL-враппер DDHack (~0,1 Мб), решающий большинство графических проблем в текущих версиях Windows для многих старых игр. Достаточно скопировать содержимое архива в папку игры. В числе проверенных игр отмечены Wing Commander 1-4, Starcraft, Warcraft II и первые две части Fallout. Автор намерен со временем доработать враппер для поддержки большей части функционала DirectDraw, используемого в играх.
Комментарии
- Alex Devil 28 февраля, 13:04 Огромнейшее спасибо, долго не мог найти,рабочую игру, квест самый любимый, наконец то я его снова пройду!! Спасибо что существуют такие люди которые занимаются такими крутыми играми)))
- Polina Grigoryeva 4 мая 2020 года, 20:44 Работает! Спасибо большое)
- Andrey Nesterenko 29 апреля 2020 года, 16:07 Работает!)))
- Yana Rodina 9 марта 2020 года, 09:50 На десятке заработали «Недетские сказки», благодарна безумно!
- Anzhelika Smirnova 15 февраля 2020 года, 16:02 Игра Недетские сказки вылетала при загрузке.Скачала,как написано файл http://sol.gfxile.net/zip/ddhack10.zip,разархивировала срузу в папку с игрой. И все заработало. Спасибо огромное!
- Леонид Сизиков 21 мая 2015 года, 23:18 Морские титаны — не работает
- Илья Коваленко 2 января 2014 года, 17:10 Не помогло, только цвета потемнели
- Борис Олесов 20 октября 2013 года, 19:18 Работает! Клева!
- Павел Долгоруков 1 декабря 2012 года, 19:05 забавно)) работает))) раньше к игрулькам батник подсовывал, который explorer перед запуском игры убивал и снова возрождал его при выходе из нее.
- Иван Южный-парк 13 мая 2012 года, 14:27 У меня я без этого все работает
- Tony Montana 10 марта 2012 года, 09:48 В Win7 и Vista игры с проблемами такого рода нужно запускать после закрытия процесса — EXPLORER
- Андрей Левчук 28 августа 2012 года, 21:32 Спасибо тебе, братишка :3
Теперь сможем с корешем в Казаков нормально по сетке поиграть 😀
- Игорь Шевченко 24 октября 2011 года, 11:55 Нужно создать тему у нас на Форуме и подробно описать проблему.
- Андрей Охотник 24 октября 2011 года, 13:15 А по какому адресу находится форум. Спасибо, что не оставили без внимания.
- Игорь Шевченко 25 октября 2011 года, 15:09 http://forum.nvworld.ru/
Источник: nvworld.ru
Что такое DirectX и для чего он нужен
Что такое DirectX и что он делает? – это очень распространенный вопрос особенно среди любителей компьютерных игр. Оно и понятно, человек не играющий в современные компьютерные игрушки вполне может и не услышать название DirectX. Это связано именно с предназначением этого приложения.
DirectX разрабатывался компанией Microsoft специально для того, чтобы превратить платформу Windows в основу для разработки компьютерных игр.
Сказать по правде, описать что такое DirectX достаточно сложно, так как это не просто какая-то программа, а набор библиотек и инструментов, позволяющих воспроизводить реалистичную графику и звуки на компьютере.
DirectX появился именно в помощь разработчикам компьютерных игр и мультимедийных приложений и позволяет создавать программы с очень реалистичной графикой и звуками. Также, поскольку DirectX «заточен» под игры, он имеет инструменты, позволяющие обрабатывать данные, получаемые с устройств управления — с клавиатуры, мыши или игрового джойстика.
Сам DirectX состоит из нескольких модулей, которые отвечают за двумерную (DirectDraw ) и трехмерную (Direct3D) графику, работу со звуком (DirectSound ), с устройствами управления (DirectInput ) и так далее.
Чтобы получить информацию об установленной на компьютере версии пакета DirectX и посмотреть данные о его компонентах, можно вызвать окно Выполнить, нажав сочетание клавиш Win+R и ввести команду dxdiag:
Это окно будет полезно любителям компьютерных игр. Если во время игры возникают какие-то проблемы с графикой или со звуком, то здесь можно протестировать отдельные модули DirectX или получить информацию о текущей установленной на компьютере версии.
Если возникает необходимость установить более свежую версию DirectX, то я рекомендую скачивать установочные файлы только с официального сайта.
Интересные заметки и видеоуроки по этой теме:
- Зачем нужна экранная заставка
- Программа для проверки температуры процессора
- Для чего нужна программа .NET Framework?
- 3D Builder в Windows 10. Что это и как удалить
- Как изменить контекстное меню Windows
Источник: pcsecrets.ru