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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2008, 08:37   #21
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 mutabor
Цитата:
Ответьте на такой вопрос. Что быстрее нарисуется: большой битмап, или несколько маленьких его кусков?
Это смотря сколько этих маленьких кусков и на сколько они маленькие. Если там действительно 10 точек по экрану бегают, то да. Но и в этом случае я бы не стал стрелять по пушке из воробья. Даже на самой древней машине это бы нормально отработало. 25 раз в секунду нарисовать картинку 300х200 задача не из самых трудных. Замеч что на очень древних машинах даже 17" мониторы, непозволительная роскаш. Хотя если по чесноку, где вы сейчас видели в офисах компы древнее PIII. Это так редко. И то, в основном вспомогательные.

2 B_N
Не судите строго, но поймите меня правильно. Честное слово, не врублюсь. Вот почему у вас первый цикл (там где вы большой битмап рисуете) аж 100 раз повторяется. Эт зачем вам понадобилось фон 100 раз перерисовывать. Вообщето он 1 раз рисуется.
Цитата:
А вторую часть Ваших возражений я вообще не понял... Вы мне возражаете, или соглашаетесь по пунктам 1. и 3.?
Я возражал , так как судя по вашим словам
Цитата:
2. Нарисовать объект.
3. Вернуть сохраненную ранее часть фона на место.
Произойдет затирание части движущихся объектов. См. картинку поста #18. Чтобы этого не произошло придется организовывать 2 цикла. В первом затирать куски фона, во втором рисовать объекты. Тоесть сначала фон потом объекты.

Теперь зачем нужен дополнительный битмап в памяти. Чтобы небыло мерцания.

Короче вот пример: Точки.zip
Форма 1
- рисует на битмапе черный квадрат
- по циклу рисует на битмапе белые точки
- копирует битмап на форму
Форма 2
- по циклу рисует на битмапе черные точки (закрашивает)
- по циклу рисует на битмапе белые точки
- копирует битмап на форму
Форма 3
- по циклу рисует на форме черные точки (закрашивает)
- по циклу рисует на форме белые точки

Можите не боятся запускать сразу EXE, вроде вирусов нет. Но лучше все-таки посмотреть исходник. В Unit1 константа C отвечает за кол-во точек. На панельках выводится время отрисовки одного кадра.
В примере рисуются точки. Это самый примитивный пример. Если станете рисовать движущиеся фигуры (круги, прямоугольники), то цикл закраски фона увеличится, а вот в варианте 1 ничего менять не надо.
Обратите внимание на мерцание последней формы - неизбежный результат пеперисовки непосредственно на экране.

И последнее, сможите нарисовать такое же с закраской фона по частям.
Линии.zip
Думаю нет. Хотя объектом может быть всего 10. А если заливать фон на экране, то будет мерцать. Так что придется рисовать в памяти, а уж потом на экран помещать.

ЗЫ: С нетерпением жду ваших ответов. Желательно с примерами. И маленькая просьба, если можно у меня Си на работе нет и я его вообще не знаю. Если можно на Делфи. Хотя ладно, си так си. Просто возможно наше непонимение и возникло от того, что на Си и на Делфи методы рисования реализованы по разному. Хотя наврятли, в конечном счете всеравно рисует WinAPI.
Sibedir вне форума Ответить с цитированием
Старый 08.02.2008, 08:41   #22
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

К вопросу о рисовании в памяти:
Сравним.zip

Последний раз редактировалось Sibedir; 08.02.2008 в 12:01.
Sibedir вне форума Ответить с цитированием
Старый 09.02.2008, 11:32   #23
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Хотя наврятли, в конечном счете всеравно рисует WinAPI
Совершенно верно.

Цитата:
Это смотря сколько этих маленьких кусков и на сколько они маленькие. Если там действительно 10 точек по экрану бегают, то да. Но и в этом случае я бы не стал стрелять по пушке из воробья. Даже на самой древней машине это бы нормально отработало. 25 раз в секунду нарисовать картинку 300х200 задача не из самых трудных.
Вы упорно продолжаете цепляться за конкретный пример, а я говорю вобщем. В серьезных проектах этому уделяется внимание. Там дорог каждый кадр в секунду.

Да и ОС окна перерисовывает по этому принципу. Вам бы понравилось если бы она подтормаживала, из-за того что разработчики забили на это болт, размышляя так - пускай покупают процессор помощнее.
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 вне форума Ответить с цитированием
Старый 09.02.2008, 11:55   #24
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Посмотрел ваш код... вот получше будет ))) форма один

Код:
type
  TMyPoint = record
    X, Y, dX, dY: Integer;
  end;

var
  Form1: TForm1;
  C: Integer;

implementation

var
  Points: array of TMyPoint;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  Randomize;
  C := 10;
  SetLength (Points, C);
  for i := 0 to C-1 do begin
    Points[i].X := Random (Form1.ClientWidth);
    Points[i].Y := Random (Form1.ClientHeight);
    Points[i].dX := Random (11) - 5;
    Points[i].dY := Random (11) - 5;
  end;
  Form1.Color := clBlack;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  BM: TBitmap;
  PointColor: TRGBTriple;
begin
  PointColor.rgbtBlue := $FF;
  PointColor.rgbtGreen := $FF;
  PointColor.rgbtRed := $FF;

  BM := TBitMap.Create;
  BM.Canvas.Brush.Color := Color;
  BM.PixelFormat := pf24bit;
  BM.Width := Width;
  BM.Height := Height;

  for i := 0 to C-1 do
  begin
    Points[i].X := (Points[i].X + Points[i].dX + ClientWidth) mod ClientWidth;
    Points[i].Y := (Points[i].Y + Points[i].dY + ClientHeight) mod ClientHeight;
    MoveMemory(Pointer(Integer(BM.ScanLine[Points[i].Y]) + Points[i].X * SizeOf(TRGBTriple)),
      @PointColor, SizeOf(PointColor));
  end;

  Canvas.Draw(0, 0, BM);
  BM.Free;
end;

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  if ClientWidth  - Width  + NewWidth  < 1 then NewWidth  := 1 + Width  - ClientWidth ;
  if ClientHeight - Height + NewHeight < 1 then NewHeight := 1 + Height - ClientHeight;
end;
вроде пашет как надо, упор делал на обработку в таймере, другое не смотрел, не трогал.
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 13:54   #25
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 mutabor
Вы совершенно правы. Я говорю о конкретном примере, где нужно нарисовать точки. В задачах посложнее нужно использовать специальные технологии. А новичкам об этих технологиях знать не надобно. Я вот не знаю ничего об DirectX и ничего живу. Ну это мое мнение, я не настаиваю. Просто хочится помочь человеку, который только что начал изучать вопрос рисования, поделится своим опытом новичка. Чтобы решить задачу достаточно хорошо, а не забивать голову человеку лишними вопросами. Когда мы новички подрастем, то постепенно перекочуем из этой темы в тему "Создание и обсуждение игр", где рассматриваются вопросу OpenGL и DirectX.
Цитата:
В серьезных проектах этому уделяется внимание. Там дорог каждый кадр в секунду
Назовите примеры. Наверника это на 99% игры и 3D. А теперь скажите, сколько программистов занимаются профессиональными разработками в этой области. Я думаю это не большая группа. Всем остальным достаточно знать то, что я описал.
Думаю так. Но опять же не настаиваю. Это уже вопрос не из области программирования

2 BOBAH13
Спасибо, BOBAH13. Вроде понятно как это работает. Но только один вопрос. Неврублюсь, почему это работает дольше чем в моем примере. Замеряю время только от начала цикла до конца:
Код:
  b := GetTickCount;
  for i := 0 to C-1 do
  begin
    Points[i].X := (Points[i].X + Points[i].dX + ClientWidth) mod ClientWidth;
    Points[i].Y := (Points[i].Y + Points[i].dY + ClientHeight) mod ClientHeight;
    MoveMemory(Pointer(Integer(BM.ScanLine[Points[i].Y]) + Points[i].X * SizeOf(TRGBTriple)),
      @PointColor, SizeOf(PointColor));
  end;
  e := GetTickCount;
e-b ~ 32
В моем же примере:
Код:
  b := GetTickCount;
  for i := 0 to C-1 do begin
    Points[i].X := (Points[i].X + Points[i].dX + W) mod W;
    Points[i].Y := (Points[i].Y + Points[i].dY + H) mod H;
    BM.Canvas.Pixels [Points[i].X, Points[i].Y] := clWhite;
  end;
  e := GetTickCount;
e-b ~ 0
Sibedir вне форума Ответить с цитированием
Старый 09.02.2008, 14:59   #26
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Наверное из-за получения данных ClientWidth, ClientHeight... ну точно не из-за операции с памятью, я думаю это не должно ставить под сомнения, что она быстрей чем SetPixel
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 15:28   #27
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Точно, а я сразу и не заметил.
Во чё я придумал , зацените:
Точки 1.zip
Тут аж 2 битмапа в пямяти, но работает это быстрее.
А вообще строка
Код:
Cardinal (Pointer ((Integer (ScanLine[Points[i].Y]) + Points[i].X*4))^) := $FEDCBA;
годится только для точек. При рисовании фигур (линий, прямоугольников, дуг) лучше использовать соответствующие API-функции.

Последний раз редактировалось Sibedir; 09.02.2008 в 15:32.
Sibedir вне форума Ответить с цитированием
Старый 09.02.2008, 15:33   #28
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Fon_BM.Canvas.Rectangle (0, 0, W, H); это рисование прямоугольника, вам надо наверное для отчистки Fon_BM.Canvas.FillRect(Rect(0, 0, W, H));
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 15:36   #29
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Это уже не принципиально, так как происходит лишь при изменении размеров, а не 25 раз в секунду.
Sibedir вне форума Ответить с цитированием
Старый 09.02.2008, 15:40   #30
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Точно, а я сразу и не заметил.
Во чё я придумал , зацените:
Вложение 2619
Тут аж 2 битмапа в пямяти, но работает это быстрее.
А вообще строка
Код:
Cardinal (Pointer ((Integer (ScanLine[Points[i].Y]) + Points[i].X*4))^) := $FEDCBA;
годится только для точек. При рисовании фигур (линий, прямоугольников, дуг) лучше использовать соответствующие API-функции.
Почему же кто Вам мешает например сделать в цикле смещение позиций и строк битмапа, и заполнять каждый цвет ( несколько байт ) тем которым надо и будет Вам таже линия, кружки и т.д. так можно свой мини-движок сделать Просто манипулирую X, Y-ом.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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