Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Флипинг и блитинг   Найти похожие ветки 

 
parovoZZ ©   (2004-08-03 11:55) [0]

С флипом всё понятно, копируем буферную поверхность на первичную с максимальной частотой. А вот по поводу блитинга: как часто надо копировать поверхности на буферную - когда что-то на ней изменилось (копировать всю поверхность или только изменившуюся часть?), или также с максимально быстрой частотой? И почему на одной машине поверхность надо восстанавливать, даже если фокус у окна не терялся, а на другой всё как и долджно быть?


 
cyborg ©   (2004-08-03 11:58) [1]

Флипинг - смена буферов (переключение) или копирование, в зависимости от режима. А блитинг это копирование одной поверхности на другую. А как часто это делать, зависит от твоей игры.

Поверхности нужно восстанавливать когда их затирают другие программы, какая-то программа использовала видеопамять, в этой части видеопамяти твои поверхности затёрлись, приходится восстанавливать.


 
parovoZZ ©   (2004-08-03 14:43) [2]

Ну хорошо, а тогда ещё вопрос: если ждём вертикальной синхронизации при флипинге, что происходит с выполнением программного кода - ожидаем завершения оного или задачи разделяются (то бишь центральный процессор выполняет дальнейшие инструкции, а видеокарта выполняет флипинг)?
P.S. Всё же книга без теории не даёт полного понимания некоторых вещей.


 
cyborg ©   (2004-08-03 15:45) [3]


>  что происходит с выполнением программного кода - ожидаем
> завершения оного или задачи разделяются

Это зависит от использования флагов ХХХ_WAIT или XXX_DONOTWAIT при флипинге и блиттинге, по названию флага можно догадаться какой к чему.


 
parovoZZ ©   (2004-08-03 15:55) [4]

Не, вопрос не в этом. ХХХ_WAIT я так понимаю, это указание функции ждать готовности устройства. Вопрос в чём: на момент ожидания окно приостанавливает обработку поступающих сообщений или нет? Допустим, есть два монитора с частотами 60 и 120 Гц. С какой скоростью будет идти игра на этих мониторах?


 
cyborg ©   (2004-08-03 16:22) [5]

Игра будет идти с той скоростью, с которой ты запрограммируешь, если привяжешь к рендерингу и видеосинхронизацию включишь, то будет идти со сокростью обновления монитора, а если котлеты отдельно, мухи отдельно и процессор не тормозит твою игру, то с будет с такой, какая задумана.


 
parovoZZ ©   (2004-08-03 20:22) [6]

Может не по сабжу: непосредственный доступ к пикселям надо производить только к буферной поверхности, а к остальным, наверное , не имеет смысла?


 
cyborg ©   (2004-08-03 20:33) [7]


> [6] parovoZZ ©   (03.08.04 20:22)

Не только, к остальным имеет смысл.


 
parovoZZ ©   (2004-08-03 21:04) [8]

Я так понял, что к любой? Но тогда на буферную поверхность надо блитинговать, а так сразу на неё. Или побыстрее будет (всё равно ж блитинговать придётся)? Для эффектов надо.


 
cyborg ©   (2004-08-03 21:11) [9]


> [8] parovoZZ ©   (03.08.04 21:04)

не понятно чего там тебе нужно на неё сразу блитинговать для эффектов. Если прозрачность только, или свет делать.


 
parovoZZ ©   (2004-08-03 22:11) [10]

Запутался в словах. Делаем эффекты на какой-либо поверхности (не буферной), затем переносим её на буферную. ИЛИ. Сразу делаем эффекты на буферной. Буферная - та, которая работает в купе с первичной.


 
cyborg ©   (2004-08-04 06:53) [11]

Если экран постоянно обновляется, то всю графику рисую на бэкбуфере, Если чего-то редко обновляется, нарисуй на отдельной поверхности и выводи на быкбуфер эту поверхность.


 
parovoZZ ©   (2004-08-04 10:11) [12]

Ясно, спасибо.


 
parovoZZ ©   (2004-08-04 21:29) [13]

И ещё вопрос вдогонку. Если я блитингую с установленным цветовым ключом и у меня прозрачная область выходит за границы поверхности, то блитинг осуществится или нет?


 
cyborg ©   (2004-08-04 22:11) [14]

Нет, нужно отсечение делать.


 
parovoZZ ©   (2004-08-05 10:49) [15]

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


 
parovoZZ ©   (2004-08-07 00:33) [16]

А вот в BltFast Rect что задаёт? Ставлю SetRect (Rect^, 0, 0, 10, 10), хотя копируемая поверхность намного больше этого прямоугольника, она всё равно копируется вся целиком. Что за ерунда?


 
cyborg ©   (2004-08-07 07:15) [17]

Показывай код этого участка, чего-то неправильно делаешь.


 
parovoZZ ©   (2004-08-08 03:44) [18]

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;


 
parovoZZ ©   (2004-08-08 17:26) [19]

Всё, разобрался, запутался ы указателях. Гы гЫ.


 
parovoZZ ©   (2004-08-08 20:07) [20]

А что будет, если создать уже созданную поверхность?

Так навеяло. После очистки бэкбуферной поверхности (заполнением её чем - либо) приходится отрисовывать не только те объекты, которые переместились, но и те, которые не меняли своего местоположения. Не рационально.


 
parovoZZ ©   (2004-08-09 00:49) [21]

Что-то ерунда какая-то. Вроде 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-09 06:01) [22]

А вот если убрать  
if ThisTickCount - LastTickCount > 1 then
то всё отрисовывается более менее плавно. Получается, что это неизбежно?, и скорость игры будет зависеть от скорости развёртки?
Сам с собой уже разговариваю))


 
cyborg ©   (2004-08-09 08:38) [23]

Поверхностно посмотрел.
Во первых вот это фигню SetColorKey из отрисовки убирай.
Во вторых DDBLTFAST_DONOTWAIT замени на DDBLTFAST_WAIT. Так же и во флипинге флаг ожидания поставь.


 
parovoZZ ©   (2004-08-09 09:51) [24]

А эту фигню достаточно один раз проделать? После загрузки и создания поверхности?

А ещё: пересоздать поверхность можно или лучше старую сперва удалить?


 
cyborg ©   (2004-08-09 10:04) [25]

1 - да
2 - можно, но старую лучше удалить, иначе утечки ресурсов неизбежны.


 
parovoZZ ©   (2004-08-09 11:35) [26]

Спасибо, будем дальше мозговать DD, мать его ити.


 
parovoZZ ©   (2004-08-13 09:35) [27]

И всё-таки мне не понятно, что происходит с программой, когда она ждёт вертикальной синхронизации или готовности устройства. Такое ощущение, что выполнение программного кода останавливается в эти моменты.


 
cyborg ©   (2004-08-13 18:43) [28]

Ощущение тебя не обманывает.


 
parovoZZ ©   (2004-08-15 01:46) [29]

А как же тогда быть? Через потоки?


 
cyborg ©   (2004-08-15 08:45) [30]

Слушай, тебе это надо? Всё равно процессор не обгонишь.


 
parovoZZ ©   (2004-08-15 09:37) [31]

А вот интересно, где лучше распологать поверхности: в системной или в видеопамяти? При флипинге лучше, чтобы поверхности лежали в видеопамяти, при непосредственном доступе к пикселям в системной памяти, говорят, процесс идёт быстрее. А как же быть с блитингом?


 
cyborg ©   (2004-08-15 10:50) [32]

Ты сам ответил на свой вопрос.


 
parovoZZ ©   (2004-08-15 13:22) [33]

Ответить то я может и ответил, но не понятно, что с блитингом7 Если копировать из системной в видяшную (либо наоборот), то тормоза однозначно. А вот если из видеопамяти в видеопамять и также с системной, то как быстрее?


 
cyborg ©   (2004-08-15 15:00) [34]

Потестируй и узнаешь. Проверить трудно чтоли? Хочешь быстро, не захватывай поверхность.



Страницы: 1 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.026 c
1-1099577874
X-Disa
2004-11-04 17:17
2004.11.21
Запись в файл


14-1099916302
Piter
2004-11-08 15:18
2004.11.21
Устройство TApplication


14-1099134267
DiamondShark
2004-10-30 15:04
2004.11.21
Даже Word их не любит...


3-1098254258
Hmm
2004-10-20 10:37
2004.11.21
Помогите решить проблемму с запросом. Внешний ключ.


3-1098502374
Vasis
2004-10-23 07:32
2004.11.21
Выборка по дате