![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Lock\Unlock поверхностей DirectDraw
NikeOLD © (2004-04-22 21:46:00)Специально для miek !
Если не веришь мне, вот несколько примеров:
1. Запирать поверхность необходимо, поскольку позиция поверхности в системной памяти может меняться, системный менеджер памяти по каким-то своим соображениям может перемещать блоки памяти. (Краснов М. "DirectX. Графика в проектах Delphi", стр. 76);
2. Видео память не остается на одном и том же месте - она вполне может быть виртуальной. Если же эту память заблокировать, она гарантированно остается в одном и том же адресном пространстве в течение времени блокировки. (Ламот А. "Программирование игр для Windows. Секреты профессионала", стр. 250);
3. While you have a surface locked, you can directly manipulate the contents. The following list describes some tips for avoiding common problems with directly rendering surface memory:
a) Never assume a constant display pitch. Always examine the pitch information returned by the IDirectDrawSurface7::Lock method. This pitch can vary for a number of reasons, including the location of the surface memory, the type of display card, or even the version of the DirectDraw driver. For more information, see Width vs. Pitch.
b) Make certain you blit to unlocked surfaces. DirectDraw blit methods will fail, returning DDERR_SURFACEBUSY or DDERR_LOCKEDSURFACES, if called on a locked surface. Similarly, GDI blit functions fail without returning error values if called on a locked surface that exists in display memory.
(DirectX 7 SDK, "Accessing Surface Memory Directly")
Это, что касается Lock\Unlock.
Теперь относительно доступа к поверхности через графический контекст устройства (знакомо?). Полученный DC тоже нужно освобождать после работы и чем быстрее, тем лучше поскольку они неявно вызывают Lock\Unlock! Читай SDK внимательно.
Короче, если ты не лочишь поверхность перед прямым доступом к ней, то нет никакой гарантии, что на другой машине с другим аппаратным обеспечением твое приложение будет работать нормально.
miek (2004-04-29 23:22:00) [1]В курсе, но мне по барабану пока, потому что PageLock нет в IDirectDraw.
Sapersky (2004-04-29 23:06:00) [2]Одно небольшое уточнение (а вовсе не попытка в чём-то переубедить или что-то доказать :)) относительно мелкософтовской цитаты ( miek © (23.04.04 16:37) [4]): ты в курсе, что PageLock и Lock - не одно и то же?
NikeOLD (2004-04-29 22:12:00) [3]Можно попробовать уничтожать DIrectDraw или только поверхности с палитрами, клипперами и т.д., оставляя главный объект, а после восстановления из спячки и переключения в игру возвращать все на место.
VMcL (2004-04-29 21:10:00) [4]>>miek © (29.04.04 20:17) [45]
>У кого-нибудь есть информация, какие сообщения приходят перед/после засыпания? С ходу не нашел.
WM_POWERBROADCAST/PBT_APMQUERYSUSPEND
?
miek (2004-04-29 20:17:00) [5]У кого-нибудь есть информация, какие сообщения приходят перед/после засыпания? С ходу не нашел.
Остальные два глюка - исправлены.
VMcL (2004-04-29 20:08:00) [6]Я ж не настаиваю. Не хо, не на. Главное в readme.txt написать, что hibernate not supported и всё ;)
P.P.S.
> Баранами у нас все-таки являются Direct3D игры, а не OpenGL, так что эти игры не катят для примера.
1. Если не ошибаюсь у miek игра в DDraw, а не D3D - одна большая и две маленькие разницы.
2. Вывод: D3D - suxx, OpenGL - rulez 4ever :))
NailMan (2004-04-29 14:55:00) [7]VMcL ©
1. Counter-Strike 1.6
[Protocol version 47, Exe version 1.1.2.4 (cstrike), Exe build: 11:35:45 Feb 4 2004 (2659)]
a) OpenGL - всё ОК;
b) D3D - глючит.
2. Quake 3, v. 1.32
Всё ОК.
Баранами у нас все-таки являются Direct3D игры, а не OpenGL, так что эти игры не катят для примера.
NikeOLD (2004-04-29 14:53:00) [8]
> Quake 3, v. 1.32
OGL, сам знаешь
NailMan (2004-04-29 14:41:00) [9]ИМХО, полоумный не юзер, который использует стандартные возможности ОС, а программист, который клал на них.
Имхо, полоумен тот юзверь/программист, который валит в гибернейт свою машину будучи находясь в игре ибо для этого в игре должны быть пауза и сохранение. Вот если их нет тогда программист(написавший игру) действительно полоумный, бо комп это не убогая приставка.
VMcL (2004-04-29 14:15:00) [10]>>NikeOLD (29.04.04 13:59) [39]
1. Counter-Strike 1.6
[Protocol version 47, Exe version 1.1.2.4 (cstrike), Exe build: 11:35:45 Feb 4 2004 (2659)]
a) OpenGL - всё ОК;
b) D3D - глючит.
2. Quake 3, v. 1.32
Всё ОК.
NikeOLD (2004-04-29 13:59:00) [11]
> 1. Допустим, я играю. Потом переключаюсь по Alt+Tab - пауза
> в игре. В настройках электропитания стоит: спящий режим
> через M минут. Мне нужно уйти на некоторое время. Комп засыпает.
> Я возвращаюсь, бужу его. Вуаля.
Покажи мне ту игру, даже на 100% которая бы не умерла после засыпания компа. Стремиться к идеалу нужно, но не заморачиваться до потери пульса, если ничего не выходит.
VMcL (2004-04-29 13:44:00) [12]>> NikeOLD (28.04.04 22:45) [29]
P.S.
ИМХО, полоумный не юзер, который использует стандартныевозможности ОС, а программист, который клал на них.
VMcL (2004-04-29 13:42:00) [13]>> NikeOLD (28.04.04 22:45) [29]
> Не понял вопроса. Выйти по Alt-Tab, сменить разрешение Рабочего стола Windows и вернуться в программу?
>Это невозможно однозначно! Поверхность не может быть восстановлена ни при каких обстоятельствах,
>если она была создана при другом разрешении экрана.
>Это ограничение DirectDraw, надо смириться!
Я о том, что запущенный Space Diver после пробуждения компа, не дает сменить битность экрана, пока его не снимешь через менеджер задач.
> Только полоумный юзер усыпит комп во время игры, и поделом ему.
1. Допустим, я играю. Потом переключаюсь по Alt+Tab - пауза в игре. В настройках электропитания стоит: спящий режим через M минут. Мне нужно уйти на некоторое время. Комп засыпает. Я возвращаюсь, бужу его. Вуаля.
2. Я режимом Hibernate дома пользуюсь постоянно - меньше времени Win2K грузится ;)
NikeOLD (2004-04-29 11:53:00) [14]:))
уже не требуется
TButton (2004-04-28 23:50:00) [15]ну я это в хорошем смысле предложил
во-первых разрядка
во-вторых разминка
в-третьих просто свежая мысль
NikeOLD (2004-04-28 23:24:00) [16]
> TButton © (28.04.04 23:09) [33]
Мистер, вы я вижу не вникали в суть проблемы! По моему мнению, мы вполне поладили и нашли общий язык. А упорство и отстаивание собственной точки зрения, пусть и ошибочной, достойно похвалы, если аргументы весомы. Что ж Miek убедился в некоторых аспектах игроделания, дальше разберется сам или с помощью, если захочет о ней попросить. И драться нам вовсе не требуется...
TButton (2004-04-28 23:09:00) [17]а вы подеритесь.
NikeOLD (2004-04-28 23:06:00) [18]
> >можно забить на восстановлении из спящего режима
>
> Наверное, ты прав. Но попытку я все-таки сделаю.
Достойный ответ! Но сильно не заморачивайся, силы пригодятся в другом!
miek (2004-04-28 22:51:00) [19]>Miek - исправляйся, делай паузу, Твикс можно не есть
:) Ладно, будет сделано.
>можно забить на восстановлении из спящего режима
Наверное, ты прав. Но попытку я все-таки сделаю.
NikeOLD (2004-04-28 22:48:00) [20]
> *** Restore This surface can not be restored because it
> was created in a different mode.
Совсем забыл. После такого сообщения можно не пытаться работать дальше - бесполезно. Смотри выше в самом последнем абзаце.