Direct Draw
От: Аноним  
Дата: 10.12.01 12:27
Оценка:
Товарищи Программеры! Все вы, наверное, видели хоть раз такую игруху
под названием StarCraft. Так вот, в ней все менюшки и окошки выводятся
поверх всего прочего изображения с неким свойством полупрозрачности.
Вопрос состоит в том, как сделать подобный эффект.
Сразу скажу, что попытки сотворить что-то вроде alpha-blending, уже
были. Ну, самый простой, вроде бы, метод прямого доступа к поверхности через
метод ::Lock(...). Как можно догадаться, пишу я на С++, но перевариваю все
от ВизуалБасика до Дельфи с Ассемблером. Но проблема в том, что
если исп. прямой доступ, то всем этим дело приходится заниматься процессору.
А это ОЧЕНЬ долго. И при этом "отрендерить" даже полэкрана в 640х480*16
уже просто невыносимо даже на Селероне с 533 МХз. И вот что еще
(дабы не подумали, что я полный ламер), я в книге Краснова по DirectX в Delphi
вычитал, что НИКАКИХ аппаратных средств DD не предоставляет для полупрозрачности и,
следовательно, дескать, используйте для этого D3D. Но это сложно. И потом,
ну неужто StarCraft использует D3D? И ведь он не тормозит нигде, хотя вывод куда
более сложный, чем в моей собственной игре (Тени-то тоже полупрозрачные!!!).
Так что если вдруг кто-либо что-нибудь знает по этому поводу, напишите пожалуйста.
Желательно на С++, можно со вставками на ASM'e.
P.S. DirectX 7.SDK у меня есть, но !!!! ПЕРЕПИСАННЫЙ СЛОВО В СЛОВО НА С++
С БЕЙСИКА ПРИМЕР Fire.vbp ТОРМОЗИТ по-страшному. (ЛИБО Я ПЛОХО ПИШУ И НА С++, либо ...). И еще. Может кто-либо слышал про такую клевую игрушку под вредакцией (:-)
Seumas McNally под названием DXBall 2. Там тоже есть ни-фига-не-тормозящий-прямой-доступ-к-памяти, но КАК ЭТО СДЕЛАНО БЕЗ ТОРМОЗОВ, я не понимаю!!! ЧТО ДЕЛАТЬ?
Ув. программеры, даже если есть какой-либо пример с прямым доступом, где
изменяется хоть квадрат 50х50 точек в 16битном режиме, и его не жалко распространять,
толкните его мне в качестве гуманитарной помощи.
А если вдруг кто-либо знает сайт, на котором подобные фиговины можно скачать
без проблем, то укажите хотя бы этот адрес. Заранее спасибо.
С уважением, MVN.




30.03.03 12:02: Перенесено модератором из 'Мультимедиа, графика, звук' — H_D
Re: Direct Draw
От: Lostar Россия  
Дата: 10.12.01 13:21
Оценка:
Здравствуйте Аноним, Вы писали:

Ты Lock() делаешь на primary surface или на back buffer?
С уважением, Николай.
Re[2]: Direct Draw
От: Аноним  
Дата: 13.12.01 12:48
Оценка:
Здравствуйте Lostar, Вы писали:

L>Здравствуйте Аноним, Вы писали:


L>Ты Lock() делаешь на primary surface или на back buffer?


Эти штучки мы уже проходили, как только не пробовали...
Ясное дело, что Lock'ать надо первичную поверхность,
с вторичной тормоза еще больше...
И кстати, если все правильно, то делать надо примерно так:
// Цикл обработки сообщений:
Если сообщение есть, то его обрабатываем, если нет- перерисовываем экран и флипаем его.
//
while(!closeflag)
{
if (PeekMessage(&Msg, ...)
{
GetMessage(...);
tRANSLATEmESSAGE(...);
DispatchMessage(..);
}
else
UpdateFrame();
}
// Ну а в проце UpdateFrame()
// мы пишем что нибудь
void UpdateFrame(void)
{
// Blit some bitmaps
ImageSurface->BltFast(...)
.....
// А теперь тормозим до FPS 0.0000001
DDSURFACEDESC ddsd;
zeromemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
if (PrimarySurface-> Lock(,DDLOCK_WAIT) == DD_OK)
{
// Кладем точку по адресу, кладем другую...
(WORD *)ddsd.lpSurface + 10;
}
Ну вот, значит, а если там, в этих {} написать циклец
на десяток-другой тысяч точек, что все провисает
и FPS снижается до вышеуказанной величины.
}

Заранее благодарен за любые дельные советы по данному
вопросу. и еще: если у Вас есть прога с нетормозящим Lock'oм
просьба выдрать из него процу прорисовки и прислать сюда.

Wich best regards, MVN.
Re: Direct Draw
От: Eugene_White Россия  
Дата: 18.12.01 09:02
Оценка:
Здравствуйте Аноним.

Ты же Lock()'ишь буффер — тебе все доступно. Попробуй интерполировать. Ручками. И лучше на ASM'е — быстрее выйдет.
Не ищи легких путей, ибо они — источники неразберихи (почем ты знаешь, через сколько колен там сделано)...

EW
Re: Direct Draw
От: Laguna  
Дата: 23.12.01 22:26
Оценка:
привет.

поробуй сделать primary/secondary поверхность в системной памяти и поверхность которую ты собираешься блитать там же (можешь даже по комбинировать) — как понимаешь доступ к системной памяти происходит быстрее. — а лучше используй аппаратный альфа-блендинг через d3d. для этого можешь посмотри пример из NukeDX2 — http://www.nukesoftware.com/

.
Re[2]: Direct Draw
От: Whirlwind Россия http://whirlwind.ru
Дата: 24.12.01 07:30
Оценка:
Здравствуйте Laguna, Вы писали:


L>привет.


L>поробуй сделать primary/secondary поверхность в системной памяти и поверхность которую ты собираешься блитать там же (можешь даже по комбинировать) — как понимаешь доступ к системной памяти происходит быстрее. — а лучше используй аппаратный альфа-блендинг через d3d. для этого можешь посмотри пример из NukeDX2 — http://www.nukesoftware.com/


! Первичную в системной создать невозможно.

Насколько я помню SC, полупрозрачность там только по отношению 1 и выше уровней поверхеностей к бэкгрунду.
Можно попробовать так — создать поверхность аналогичную бэкграунду, применив к ней эффект прозрачности. Эту поверхность использовать как источник фона при формировании кадра верхних поверхностей. Выводить на поверхность меню текст etc... При этом отпадает необходимость каждый раз софтверно обращаться к поверхностям в В/П + не нужно расчитывать цвет пикселя, для получения эффекта прозрачности.
Re[2]: Direct Draw
От: DMVN Corporation  
Дата: 27.12.01 12:19
Оценка:
Здравствуйте Laguna, Вы писали:


L>привет.


L>поробуй сделать primary/secondary поверхность в системной памяти и поверхность которую ты собираешься блитать там же (можешь даже по комбинировать) — как понимаешь доступ к системной памяти происходит быстрее. — а лучше используй аппаратный альфа-блендинг через d3d. для этого можешь посмотри пример из NukeDX2 — http://www.nukesoftware.com/


L>.

Спасибо за ссылку...
DMVN Corporation
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.