Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Вывод bmp


Автор: BreakMeThunder 31.12.2006, 15:41
Скажите что нужно использовать чтобы достич быстрого отображения бмпэшек? Я рисую на битмапе и передаю его паинтбоксу, но все-равно скорость отрисовки не достаточная! Что же делать? Если можно поподробнее.

Автор: VICTAR 31.12.2006, 16:26
А почему бы сразу не рисовать на PaintBox?

Автор: BreakMeThunder 31.12.2006, 16:35
я делал так специально, это еще вроде называется двойная буфферизация, чтобы не был виден процесс отрисовки.

Автор: VICTAR 31.12.2006, 16:40
Если тебе нужна двойная буфферизация, то сделай как написано в топике ниже (положи PaintBox на Panel или что-нибудь подобное и присвой DoubleBuffered:=true).

Автор: BreakMeThunder 31.12.2006, 17:12
сделал все так... но все-равно как то медленно отрисовывается... я несколько поясню задачу - дело в том что я делаю тайловую рпг, где при передвижении игрока происходит постоянный скролл. Размер одного тайла 30х30, размер видимой карты 19х19. Может еще что-нибудь посоветуете? 

Автор: VICTAR 31.12.2006, 17:24
Как мне кажется, стоит взглянуть на процедуру перерисовки...

Автор: BreakMeThunder 31.12.2006, 17:34
Код

{Вывести тайл}
procedure TMap.DrawTile(x,y : byte; a,b : integer; var c : TBitMap);
begin
  if (a>0)and(a<=MapX)and(b>0)and(b<=MapY) then
  begin
    {Тайл}
    c.Canvas.Draw((x-1)*TileX,(y-1)*TileY,TerGraf[M.tile[a,b][1]]);
    if M.tile[a,b][2] > 0 then
      c.Canvas.Draw((x-1)*TileX,(y-1)*TileY,TerGraf[M.tile[a,b][2]]);
    {Герой}
    c.Canvas.Draw(ScreenSide*TileX,ScreenSide*TileY,pc.Image);
  end else
    {Вывести черный квадрат}
    c.Canvas.Rectangle((x-1)*TileX,(y-1)*TileY,(x-1)*TileX+TileX,(y-1)*TileY+TileY);
end;

{Вывести окружающие тайлы}
procedure TMap.DrawSquare;
var
  x,y : byte;
  c : TBitMap;
begin
  {Создаем битмэп}
  c := TBitmap.Create;
  c.Canvas.Brush.Color := 0;
  c.Width := ScreenX*TileX;
  c.Height := ScreenY*TileY;
  {Выводим тайлы}
  for y:=1 to ScreenY do
    for x:=1 to ScreenX do
      DrawTile(x,y,pc.x-ScreenSide+x,pc.y-ScreenSide+y,c);
  {Передаем картинку}
  MainForm.MapScreen.Canvas.StretchDraw(MainForm.MapScreen.ClientRect,c);
  {Освобождаем память}
  c.Free;
end;


Автор: Alexeis 31.12.2006, 18:20
BreakMeThunder, А вообще сам битмап умещается в памяти или нет. Какого размера картинка?
Возможно рисуется картинка превосходящая по размеру область экрана.

Автор: BreakMeThunder 31.12.2006, 18:27
битмап размера 570х570

Автор: Nicholas_S 1.1.2007, 14:01
BreakMeThunder, копирование изображения происходит быстро, вопрос в скорости построения изображения. Ты можешь в этом убедиться, засекая время по отдельности для отрисовки и для копирования картинки.
Для рисования, особенно для динамической смены изображений, использовать стандартный bitmap не есть оптимальный вариант. Для этого советую попробовать какой-нибудь сторонний компонент с высокой скоростью отрисовки. Например, очень хорошим является компонент TFastDIB, которым пользуюсь уже вот несколько лет и не нарадуюсь. Комопонент распространяется под GPL лицензией и ты можешь его найти в сети. Среди возможностей такие как: быстрое обращение к любому пикселю канвы, алгоритмы вывода примитивов, сглаженных линий, конвертирование глубины цвета, масштаирование и проч. В поставке идут неплохие примеры, так что разобраться не составит труда.

Автор: Alexeis 1.1.2007, 17:51
Nicholas_S, я читал одну статью про делфийские компоненты для поддержки битмапов. Сравнивались 6 популярных библиотек, в том числе и стандартный TBitmap. Так вот он оказался по середине при этом отрыв по отношению к его соседям был небольшой, не больше 30%. Так что он нет так уж плох по скорости. Скорее всего тормозит не сама отрисовка учитывая, что размер картинки весьма невелик. 

Автор: Nicholas_S 1.1.2007, 21:58
Alexeis, конечно, стандартный bitmap не так уж и плох, однако сам понимаешь, использование для попиксельной работы с канвой вызывает иногда мандраж - скорости не хвататет (если посмотреть вглубь кода при получении/устновке цвета пикселя TCanvas, то сразу становится понятно, куда пропадает скорость).
Для рисование стандартных примитивов аля квадрат/круг TBitmap более чем достаточно, безусловно. Просто думаю если автору поста будет интересно, посмотрит.
TFastDIB мне чем понравился - это компонент по из разряда "вес продумано", наровне с TVirtualTree: грамотно, просто и доступно.
В данном примере скорость отрисовки тормозит, конечно.

Автор: Alexeis 1.1.2007, 23:55
Цитата(Nicholas_S @  1.1.2007,  21:58 Найти цитируемый пост)
использование для попиксельной работы с канвой вызывает иногда мандраж - скорости не хвататет (если посмотреть вглубь кода при получении/устновке цвета пикселя TCanvas, то сразу становится понятно, куда пропадает скорость).

Кто же требует использования Pixels ? для таких вещей придумали быстрый ScanLine, который отлично справляется с задачей попиксельного вывода. 

Автор: Nicholas_S 2.1.2007, 22:32
Alexeis, лично я не люблю сканлайн изначально, неудобная штука. Насчет простых примитивов я сказал выше  smile 

Автор: Alexeis 2.1.2007, 23:59
Nicholas_S, Чего его не любить? Это же прямой адрес карты в памяти. Какая разница как он получен? Если не нравится можно его самому переписать (в соседней теме я написал свой ScanLine). Что же может быть быстрее прямой записи в память? Только операции в видеокарте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)