Форум: "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