Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.044 c
1-1099606985
Кто---то
2004-11-05 01:23
2004.11.21
Какая стандартная функция в Дельфи не переводит строку во Float,


8-1092890702
MOZZZ
2004-08-19 08:45
2004.11.21
Фоновая музыка


6-1091368838
sashapont
2004-08-01 18:00
2004.11.21
Кодировка


4-1097117796
December
2004-10-07 06:56
2004.11.21
Получение админстративных прав под Windows NT/2000/XP


4-1097500329
TeNY
2004-10-11 17:12
2004.11.21
Как програмно нажать кнопку Enter через SendMessage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский