![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Флипинг и блитинг [D7, Win95/98, Win2k, WinXP]
parovoZZ © (2004-08-03 11:55:00)С флипом всё понятно, копируем буферную поверхность на первичную с максимальной частотой. А вот по поводу блитинга: как часто надо копировать поверхности на буферную - когда что-то на ней изменилось (копировать всю поверхность или только изменившуюся часть?), или также с максимально быстрой частотой? И почему на одной машине поверхность надо восстанавливать, даже если фокус у окна не терялся, а на другой всё как и долджно быть?
cyborg (2004-08-15 15:00:00) [1]Потестируй и узнаешь. Проверить трудно чтоли? Хочешь быстро, не захватывай поверхность.
parovoZZ (2004-08-15 13:22:00) [2]Ответить то я может и ответил, но не понятно, что с блитингом7 Если копировать из системной в видяшную (либо наоборот), то тормоза однозначно. А вот если из видеопамяти в видеопамять и также с системной, то как быстрее?
cyborg (2004-08-15 10:50:00) [3]Ты сам ответил на свой вопрос.
parovoZZ (2004-08-15 09:37:00) [4]А вот интересно, где лучше распологать поверхности: в системной или в видеопамяти? При флипинге лучше, чтобы поверхности лежали в видеопамяти, при непосредственном доступе к пикселям в системной памяти, говорят, процесс идёт быстрее. А как же быть с блитингом?
cyborg (2004-08-15 08:45:00) [5]Слушай, тебе это надо? Всё равно процессор не обгонишь.
parovoZZ (2004-08-15 01:46:00) [6]А как же тогда быть? Через потоки?
cyborg (2004-08-13 18:43:00) [7]Ощущение тебя не обманывает.
parovoZZ (2004-08-13 09:35:00) [8]И всё-таки мне не понятно, что происходит с программой, когда она ждёт вертикальной синхронизации или готовности устройства. Такое ощущение, что выполнение программного кода останавливается в эти моменты.
parovoZZ (2004-08-09 11:35:00) [9]Спасибо, будем дальше мозговать DD, мать его ити.
cyborg (2004-08-09 10:04:00) [10]1 - да
2 - можно, но старую лучше удалить, иначе утечки ресурсов неизбежны.
parovoZZ (2004-08-09 09:51:00) [11]А эту фигню достаточно один раз проделать? После загрузки и создания поверхности?
А ещё: пересоздать поверхность можно или лучше старую сперва удалить?
cyborg (2004-08-09 08:38:00) [12]Поверхностно посмотрел.
Во первых вот это фигню SetColorKey из отрисовки убирай.
Во вторых DDBLTFAST_DONOTWAIT замени на DDBLTFAST_WAIT. Так же и во флипинге флаг ожидания поставь.
parovoZZ (2004-08-09 06:01:00) [13]А вот если убрать
if ThisTickCount - LastTickCount > 1 then
то всё отрисовывается более менее плавно. Получается, что это неизбежно?, и скорость игры будет зависеть от скорости развёртки?
Сам с собой уже разговариваю))
parovoZZ (2004-08-09 00:49:00) [14]Что-то ерунда какая-то. Вроде DirectDraw, а ведёт себя как GDI. Всё трясётся и запаздывает с отрисовкой, к тому же на старое изображение почему-то накладывается новое. У Краснова всё плавно, всё чики-пуки.
procedure OnDraw;
var
hRet : hResult;
Rect : TRect;
BEGIN
hRet := ClearSurface ($00000000, iDDSBuffer) ;
if hRet = DDERR_SURFACELOST then if RestoreAll <> DD_OK then exit;
GetMouse;
case Game of
Go :
begin
if Ball.Move = Sitter then
begin
Ball.XBall := Trampl.XTrampl + (Trampl.Width div 2) - Ball.Radius;
Ball.YBall := Trampl.YTrampl - 2 * Ball.Radius;
Ball.X := Trunc (Ball.XBall);
Ball.Y := Trunc (Ball.YBall);
if LButton then Ball.Move := Runner;
end
else
begin
ThisTickCount := GetTickCount;
if ThisTickCount - LastTickCount > 1 then
begin
LastTickCount := GetTickCount;
MoveBall;
end;
end;
hRet := SetColorKey (Ball.iDDSBall, $00000000);
if hRet <> DD_OK then exit;
SetRect (Rect, 0, 0, 30, 30);
hRet := iDDSBuffer.BltFast (Ball.X, Ball.Y, Ball.iDDSBall, @Rect, DDBLTFAST_DONOTWAIT or DDBLTFAST_SRCCOLORKEY);//Рисуем шарик
if hRet = DDERR_SURFACELOST then if RestoreAll <> DD_OK then exit;
hRet := SetColorKey (Trampl.iDDSTrampl, $00000000);
if hRet <> DD_OK then exit;
Trampl.XTrampl := Trampl.XTrampl + mouse_dX;
if Trampl.XTrampl < 1 then Trampl.XTrampl := 1;
if Trampl.XTrampl > (ScreenWidth - Trampl.Width - 1) then Trampl.XTrampl := ScreenWidth - Trampl.Width - 1;
SetRect (Rect, 0, 0, Trampl.Width, Trampl.Height);
hRet := iDDSBuffer.BltFast (Trampl.XTrampl, Trampl.YTrampl, Trampl.iDDSTrampl, @Rect, DDBLTFAST_DONOTWAIT or DDBLTFAST_SRCCOLORKEY);//Рисуем курсор
if hRet = DDERR_SURFACELOST then if RestoreAll <> DD_OK then exit;
end;
NextGame :
begin
Randomize;
Ball.Angle := Random * Pi;
Game := Go;
end;
end;
hRet := iDDSPrimary.Flip (nil, 0);
if hRet = DDERR_SURFACELOST then if RestoreAll <> DD_OK then exit;
END;
Почему не работает плавно?
parovoZZ (2004-08-08 20:07:00) [15]А что будет, если создать уже созданную поверхность?
Так навеяло. После очистки бэкбуферной поверхности (заполнением её чем - либо) приходится отрисовывать не только те объекты, которые переместились, но и те, которые не меняли своего местоположения. Не рационально.
parovoZZ (2004-08-08 17:26:00) [16]Всё, разобрался, запутался ы указателях. Гы гЫ.
parovoZZ (2004-08-08 03:44:00) [17]
Rect := nil;
hRet := ClearSurface ($00000000, iDDSBuffer) ;
if hRet = DDERR_SURFACELOST then if RestoreAll <> DD_OK then exit;
SetRect (Rect^, 0, 0, 10, 10);
hRet := SetColorKey (Ball.iDDSBall, $00000000);
if hRet <> DD_OK then exit;
hRet := iDDSBuffer.BltFast (20, 20, Ball.iDDSBall, Rect, DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);
if hRet = DDERR_SURFACELOST then if RestoreAll <> DD_OK then exit;
cyborg (2004-08-07 07:15:00) [18]Показывай код этого участка, чего-то неправильно делаешь.
parovoZZ (2004-08-07 00:33:00) [19]А вот в BltFast Rect что задаёт? Ставлю SetRect (Rect^, 0, 0, 10, 10), хотя копируемая поверхность намного больше этого прямоугольника, она всё равно копируется вся целиком. Что за ерунда?
parovoZZ (2004-08-05 10:49:00) [20]Плохо, лишняя головная боль.