Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Флипинг и блитинг [D7, Win95/98, Win2k, WinXP]


Страницы:   1 2

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]

Плохо, лишняя головная боль.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо