Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2008, 13:58   #11
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
.............а потом его содержимое копирую на канву процедурой Draw.
А я именно это и назвал "гонять туда-сюда битмапы". Такова, по крайне мере, сущность функции BitBlt, которую, очевидно, воплощает метод Draw.
B_N вне форума Ответить с цитированием
Старый 06.02.2008, 14:06   #12
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
А я именно это и назвал "гонять туда-сюда битмапы". Такова, по крайне мере, сущность функции BitBlt, которую, очевидно, воплощает метод Draw.
Ну тогда уж не туда-суда, а только сюда. А надо это, чтобы изображение не мерцало.

Вот, немного переделал под ваш вариант:Точки.zip
Главное вот здесь:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  with BM do begin
    Canvas.Brush.Color := Form1.Color;
    Canvas.Rectangle (0, 0, W, H);
    for i := 0 to C-1 do begin
      Points[i].X := (Points[i].X + Points[i].dX) mod W;
      Points[i].Y := (Points[i].Y + Points[i].dY) mod H;
      Canvas.Pixels [Points[i].X, Points[i].Y] := clWhite;
    end;
  end;
  Canvas.Draw (0, 0, BM);
end;
Sibedir вне форума Ответить с цитированием
Старый 06.02.2008, 21:06   #13
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию

Ого, не думал что так много мнений.
Оговроюсь сразу что от реализации на DX или OpenGL я пожалуй воздержусь, всетаки это вспомогательная графика. Но на досуге всетаки попробую реализовать .

Цитата:
Сообщение от B_N Посмотреть сообщение
Если я правильно понял топикстартера, то задача сводится к:
1. С помощью GetPixel запомнить старый цвет точки.
2. С помощью SetPixel поставить новую точку.
3. По мере необходимости вернуть с помощью SetPixel старую точку и начать с п.1

Зачем целые битмапы туда-сюда гонять мне не совсем ясно... Если точек, как пишет автор, сотни, то проще держать отдельно оригинал и восстанавливать точки с него. Всегда можно проверить, какой способ быстрее.
что-то я не понял как вы меня поняли
Задача отобразить движение, я себе представляю движение так:
1. обьект отображается на новых координатах
2. обьект удаляется\затирается\etc. на старых координатах.

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

Sibedir, похоже действительно других вариантов не остается, спасибо.

Спасибо всем.
st01en вне форума Ответить с цитированием
Старый 06.02.2008, 21:44   #14
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ха! Ну и как Вы себе представляете это "2. обьект удаляется\затирается\etc. на старых координатах."?

Всю жизнь рисование движущихся объектов складывалось из:
1. Сохранить часть фона, на которой мы будем рисовать объект.
2. Нарисовать объект.
..............................
3. Вернуть сохраненную ранее часть фона на место.

Если объектов много или фон динамический, значит п.1 не используем, а вместо этого держим фон offscreen, но копируем, тем не менее, только "грязные" его части. А ворочать битмапы размером в мильон-другой пикселов это, знаете...
B_N вне форума Ответить с цитированием
Старый 06.02.2008, 23:01   #15
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию

Ок, я же говорил, что в этом не силен.
Покажите, плс, на примере кода, мне так легче доходит чем на словах .

Спасибо.
st01en вне форума Ответить с цитированием
Старый 07.02.2008, 08:58   #16
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

B_N прав, но все же это больше относится к оптимизации, вовсе не обязательно перерисовывать только необходимые части, можно и целиком весь фон перерисовывать. Так намного проще будет. Для современного процессора эти мильоны пикселей как семечки, современный я имею ввиду хотя бы выше 1 ГГц.
Алгоритм вы в принципе знаете. Даже про мерцание вам рассказали.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.02.2008, 09:14   #17
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию

Да, спасибо. Насчет полной перерисовки я и так практически в первую очередь подумал, про рисование сначала в буфере тоже когда-то читал. Я собственно спросил потому что считал, что это довльно медлено будет(стыдно признаваться на самом деле лень было попробовать). Похоже что пока иммено так и реализую, а попозже попытаюсь понять и реализовать то, что B_N сказал
До вечера еще немножко поколдую и наверно создам еще одну темку, а то как-то сильно громоздко у меня данные обрабатываются.
st01en вне форума Ответить с цитированием
Старый 07.02.2008, 16:48   #18
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 B_N
Цитата:
Всю жизнь рисование движущихся объектов складывалось из:
1. Сохранить часть фона, на которой мы будем рисовать объект.
2. Нарисовать объект.
..............................
3. Вернуть сохраненную ранее часть фона на место.
Если объектов много или фон динамический, значит п.1 не используем, а вместо этого держим фон offscreen, но копируем, тем не менее, только "грязные" его части. А ворочать битмапы размером в мильон-другой пикселов это, знаете...
Я прошу прощения B_N, но я с вами не согласен, да и с вами mutabor. Какая же это оптимизация. Кстати, эти вещи с битмапом я проделывал еще на PIII 400 МГц. Ни каких тормозов.
Поправте меня, я наверное вас не так понял.
Цитата:
1. Сохранить часть фона, на которой мы будем рисовать объект.
Куда и как? Как регион что-ли? Так это еще дольше. Как прямоугольные области? Быстрее только если мало движущихся объектов. И как сохранять фон, если он окажится не статичен. Ну тут я еще соглашусь. Мона ченить придумать. Но та ситуация, что возникает с п.3 делает п.1 не нужным.
Цитата:
2. Нарисовать объект.
3. Вернуть сохраненную ранее часть фона на место.
Ну вопервых логичнее было бы сначала нарисовать фон, а потом объект. А то если смещение объекта будет меньше самого объекта произойдет наложение фона на объект.
И вообще, что вы делаете, если на том месте куда вы возвращаете фон находится еще один движущийся объект. Вы ж его затрете
До и После.JPG
Sibedir вне форума Ответить с цитированием
Старый 07.02.2008, 17:59   #19
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

2 Sibedir

Ну не согласны, так не согласны, что же делать.....
Только перед тем, как спорить, спрофилируйте вот такой кусочек, хотя бы даже по-простому, с GetTickCount():
Код:
	DWORD dw1, dw2, dw3;
	long x, y;
	HDC dc = ::GetDC(this->m_hWnd);
	HDC memdc = ::CreateCompatibleDC(dc);
	HBITMAP hBmp = ::CreateCompatibleBitmap(dc, 640, 480);
	HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc, hBmp);


	dw1 = GetTickCount();
	for(long i = 0; i < 100; i++) ::BitBlt(memdc, 0, 0, 640, 480, dc, 0, 0, SRCCOPY);
	dw2 = GetTickCount() - dw1;

	dw1 = GetTickCount();
	for(long i = 0; i < 10000; i++) 
	{
		x = rand() % 640;
		y = rand() % 480;
		::BitBlt(memdc, x, y, 32, 32, dc, x, y, SRCCOPY);
	}
	dw3 = GetTickCount() - dw1;


	::SelectObject(memdc, hOldBmp);
	::DeleteObject(hBmp);
	::DeleteDC(memdc);
	::ReleaseDC(this->m_hWnd, dc);
Если неохота, могу сказать, что в переменной dw2 - 130, а в dw3 - 70 (это на PIII-500), т.е. второй цикл, который выполняется в сто раз больше раз, работает (над маленькими кусочками, разумеется) в два раза быстрее... Да, а что за процессор такой, PIII-400, не подскажете? Быстрые процессоры и графплаты делают не для того, чтобы писать неоптимальные алгоритмы. А вторую часть Ваших возражений я вообще не понял... Вы мне возражаете, или соглашаетесь по пунктам 1. и 3.? Я ведь там написал, когда какой из них не нужен, а Вы мне возражаете моими словами...
B_N вне форума Ответить с цитированием
Старый 08.02.2008, 00:08   #20
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Я прошу прощения B_N, но я с вами не согласен, да и с вами mutabor. Какая же это оптимизация. Кстати, эти вещи с битмапом я проделывал еще на PIII 400 МГц. Ни каких тормозов.
Самая обыкновенная оптимизация
Ответьте на такой вопрос. Что быстрее нарисуется: большой битмап, или несколько маленьких его кусков?

А 1 ГГц, это я так, приблизительно сказал. На пятистах может и не тормозит, но согласитесь процессорного времени поболее кушает, чем на двух тысячах.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 08.02.2008 в 00:23.
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть Дикий Помощь студентам 7 12.05.2008 17:57
Принадлежность точки UnFaithful Паскаль, Turbo Pascal, PascalABC.NET 1 08.01.2008 06:16
Помогите рассчитать положение и движение точки N на отрезку DK Stark[SG!] Помощь студентам 8 14.12.2007 10:08
Блокировка точки !! ***СкаЙ*** Помощь студентам 1 13.06.2007 14:14
Help!!!Движение точки по поверхности сферы alex23xandr Помощь студентам 4 20.05.2007 14:45