Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 19.04.2008, 22:02   #461
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
Радость Ну, могём!

mutabor, да, BitBlt медленный. Попадает все это дело у меня на экран в PaintBox серез Canvas.Draw , уж времени небыло кувыркаться с поисками, занимаюсь буферами.
Построковое копирование памяти, как предложил Kostia в начале было пока самое быстрое.
Очень хочется выполнить пример alexBlack'а, раз делается все через GetDIBits/SetDiBits и сравнить с последним от mutabor'а CopyMemory(@Buffer,@Fon,SizeOf(Fon) ); , но вот я в ступор вошел, ... как GetDIBits/SetDiBits применить правильно, у меня буферы уже созданы вот так:

Код:
procedure TForm1.CreateBitmapBuf;
var
  BInfo: tagBITMAPINFO;
begin
  BInfo.bmiHeader.biSize:=sizeof(tagBITMAPINFOHEADER);
  BInfo.bmiHeader.biWidth:=W;
  BInfo.bmiHeader.biHeight:=H;
  BInfo.bmiHeader.biPlanes:=1;
  BInfo.bmiHeader.biBitCount:=24;
  BInfo.bmiHeader.biCompression:=BI_RGB;

  TerrBuf:=TBitmap.Create();
  TerrBuf.Handle:=CreateDIBSection(Canvas.Handle,BInfo,DIB_RGB_COLORS,Scr2,0,0);
  ZeroMemory(Scr2,W*H*3);

  DrawBuf:=TBitmap.Create();
  DrawBuf.Handle:=CreateDIBSection(Canvas.Handle,BInfo,DIB_RGB_COLORS,Scr,0,0);
  ZeroMemory(Scr,W*H*3);
end;
Теперь нужно просто перекидывать данные, ...как правильно?

Код:
GetDIBIts(TerrBuf.Canvas.Handle, TerrBuf.Handle, 0, H, @A, BInfo, DIB_RGB_COLORS);
    SetDIBits(DrawBuf.Canvas.Handle, DrawBuf.Handle, 0, H, @A, BInfo, DIB_RGB_COLORS);
так буфер черный, я что-то не то делаю наверное, alexBlack, будте добры по-подробнее для моего случая

Да, ребята, буферы огромные 1024х768х24bit , перекидывание буферов это только 1/20 часть всего цикла, там работа в памяти, объекты большие, с альфа-каналами, ...огромное количество расчетов, обрезка, ... и на все построение кадра дается не более 31 мс! Вот оно как.

P.S. никаких кистей шрифтов у меня не применяется, поскольку работа только с пикселами, а шрифт - это графика.
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 19.04.2008 в 22:13.
Beermonza вне форума   Ответить с цитированием
Старый 19.04.2008, 22:22   #462
alexBlack
Профессионал
 
Регистрация: 12.10.2007
Адрес: -
Сообщений: 1,204
Репутация: 920
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Теперь нужно просто перекидывать данные, ...как правильно?

Код:
GetDIBIts(TerrBuf.Canvas.Handle, TerrBuf.Handle, 0, H, @A, BInfo, DIB_RGB_COLORS);
    SetDIBits(DrawBuf.Canvas.Handle, DrawBuf.Handle, 0, H, @A, BInfo, DIB_RGB_COLORS);
так буфер черный, я что-то не то делаю наверное, alexBlack, будте добры по-подробнее для моего случая
У меня вот так работает:

Код:
// Сделать полем формы - потом используется в setDiBits
var BInfo: TBITMAPINFO;

procedure TForm1.CreateBitmapBuf;
begin
  BInfo.bmiHeader.biSize:=sizeof(TBITMAPINFOHEADER);
  BInfo.bmiHeader.biWidth:=W;
  BInfo.bmiHeader.biHeight:=H;
  BInfo.bmiHeader.biPlanes:=1;
  BInfo.bmiHeader.biBitCount:=24;
  BInfo.bmiHeader.biCompression:=BI_RGB;

  TerrBuf:=TBitmap.Create();
  TerrBuf.Handle:=CreateDIBSection(Canvas.Handle,BInfo,DIB_RGB_COLORS,scr2,0,0);
  ZeroMemory(Scr2,W*H*3);
  // Здесь пришлось добавить чтобы увидеть результат на форме
  TerrBuf.Canvas.Brush.Color := clGreen;
  TerrBuf.Canvas.FillRect( rect(0, 0, W, H) );

  DrawBuf:=TBitmap.Create();
  DrawBuf.Handle:=CreateDIBSection(Canvas.Handle,BInfo,DIB_RGB_COLORS,Scr,0,0);
  ZeroMemory(Scr,W*H*3);
end;

var A:Pointer;
procedure TForm1.FormCreate(Sender: TObject);
begin
   // Память под буфер, с которым будем работать
   // В прошлом примере я использовал массив, но раз размеры большие...
   getMem(A, W*H*3);
   CreateBitmapBuf;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
   // terrBuf --> A
   GetDIBIts(TerrBuf.Canvas.Handle, TerrBuf.Handle, 0, H, A, BInfo, DIB_RGB_COLORS);
   // A --> DrawBuf
   SetDIBits(DrawBuf.Canvas.Handle, DrawBuf.Handle, 0, H, A, BInfo, DIB_RGB_COLORS);
   // Теперь выводится зеленый прямоугольник
   Canvas.Draw(0, 0, DrawBuf);
end;
alexBlack вне форума   Ответить с цитированием
Старый 19.04.2008, 22:29   #463
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

mutabor, CopyMemory(@Buffer,@Fon,SizeOf(Fon) ); работает аналогично , вот этому Buffer:=Fon , что дает схлопывание буферов, такой эффект происходит потом с анимацией, как пленка с огромной выдержкой, ...ну вы в курсе, каждый кадр поверх другого а если были прозрачности то они постепенно затеняются в непрозрачные, и длинные шлейфы от персонажей, передвигающихся но карте )))
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 19.04.2008, 22:45   #464
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,928
Репутация: 1570

icq: 401708834
По умолчанию

Ну тогда Canvas.Draw самый быстрый )
mutabor вне форума   Ответить с цитированием
Старый 19.04.2008, 23:22   #465
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию Результаты...

Вот, что получилось, перечисляю в порядке места за скорость:
1) Canvas.Draw
2) For y:=0 to H-1 dо
CopyMemory(DrawBuf.ScanLine[y],TerrBuf.ScanLine[y],W*3); (второй, который выложил Kostia (MoveMemory) схлопывает оба буфера)
3) GetDIBIts/SetDIBits
4) BitBlt
5) Assign

Я смотрю по загрузке процессора, она у меня приоритет, так как тормозов в графике в любом случае не наблюдается.

Что можно сделать еще? ...думаю выдрать из Canvas.Draw только необходимое, и перетащить в цикл.

Очень странно, ... на другой машине, Сanvas самый тормозный , ...ничего не понимаю :/
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 20.04.2008 в 00:00.
Beermonza вне форума   Ответить с цитированием
Старый 21.04.2008, 12:03   #466
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,928
Репутация: 1570

icq: 401708834
По умолчанию

Цитата:
Что можно сделать еще? ...думаю выдрать из Canvas.Draw только необходимое, и перетащить в цикл.
Не думаю, что станет быстрее. Метод Draw проще некуда, координаты куда ложить и объект откуда брать, вот и все параметры, никакой лишней обработки. От того что его распоторошить в более низкий уровень не думаю что что-то изменится.
На моей машине заметил, если не указать битность битмапу приемнику, то Draw рабоает почти в два раза быстрее (при копировании в него 24-х битной картинки). За счет чего понятия не имею, но работает.
mutabor вне форума   Ответить с цитированием
Старый 21.04.2008, 18:18   #467
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию Еще один тест...

Ребят, пожалуйста, проверьте вот такое изменение последнего варианта, который предложил Kostia:

Код:
var
  TerrBuf, DrawBuf: TBitmap; // битовые буферы
  Scr, Scr2: Pointer; // указатели на начало данных
  BufLength: Integer; // размер памяти для буфера
  W, H: Word; // ширина, высота буфера

...

// процедура создания битовых буферов
procedure TForm1.CreateBitmap;
begin
  BInfo.bmiHeader.biSize:=sizeof(tagBITMAPINFOHEADER);
  BInfo.bmiHeader.biWidth:=W;
  BInfo.bmiHeader.biHeight:=H;
  BInfo.bmiHeader.biPlanes:=1;
  BInfo.bmiHeader.biBitCount:=24; // 24 бита глубины цвета
  BInfo.bmiHeader.biCompression:=BI_RGB;

  TerrBuf:=TBitmap.Create();
  TerrBuf.Handle:=CreateDIBSection(Canvas.Handle,BInfo,DIB_RGB_COLORS,Scr2,0,0);
  ZeroMemory(Scr2,W*H*3);

  DrawBuf:=TBitmap.Create();
  DrawBuf.Handle:=CreateDIBSection(Canvas.Handle,BInfo,DIB_RGB_COLORS,Scr,0,0);
  ZeroMemory(Scr,W*H*3);

  BufLength:=H*W*3;
end;

...
// перерисовка содержимого из буфера TerrBuf в буфер DrawBuf
MoveMemory( Scr, Scr2, BufLength );
...
...именно в таком виде, все лишнее за цикл выкинул, ...Scr, Scr2, BufLength - это все считается один раз при создании.
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 21.04.2008, 20:16   #468
alexBlack
Профессионал
 
Регистрация: 12.10.2007
Адрес: -
Сообщений: 1,204
Репутация: 920
По умолчанию

Проверил. Работает - WinXP (D3 и TurboDelphiExpress)
alexBlack вне форума   Ответить с цитированием
Старый 22.04.2008, 15:29   #469
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию Мы почти победили...

Работает то оно работает, ...интересует у кого как быстро, и быстрее ли канвы и тех методов, что были предложены.

Сам по себе MoveMemory содержит вот такой код (Windows.pas):

Код:
procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
  Move(Source^, Destination^, Length);
end;
Идем дальше, ищем Move (System.pas):

Код:
procedure Move( const Source; var Dest; count : Integer );
{$IFDEF PUREPASCAL}
var
  S, D: PChar;
  I: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;
  if Cardinal(D) > Cardinal(S) then
    for I := count-1 downto 0 do
      D[I] := S[I]
  else
    for I := 0 to count-1 do
      D[I] := S[I];
end;
{$ELSE}
asm
{     ->EAX     Pointer to source       }
{       EDX     Pointer to destination  }
{       ECX     Count                   }

        PUSH    ESI
        PUSH    EDI

        MOV     ESI,EAX
        MOV     EDI,EDX

        MOV     EAX,ECX

        CMP     EDI,ESI
        JA      @@down
        JE      @@exit

        SAR     ECX,2           { copy count DIV 4 dwords       }
        JS      @@exit

        REP     MOVSD

        MOV     ECX,EAX
        AND     ECX,03H
        REP     MOVSB           { copy count MOD 4 bytes        }
        JMP     @@exit

@@down:
        LEA     ESI,[ESI+ECX-4] { point ESI to last dword of source     }
        LEA     EDI,[EDI+ECX-4] { point EDI to last dword of dest       }

        SAR     ECX,2           { copy count DIV 4 dwords       }
        JS      @@exit
        STD
        REP     MOVSD

        MOV     ECX,EAX
        AND     ECX,03H         { copy count MOD 4 bytes        }
        ADD     ESI,4-1         { point to last byte of rest    }
        ADD     EDI,4-1
        REP     MOVSB
        CLD
@@exit:
        POP     EDI
        POP     ESI
end;
{$ENDIF}
ИМХО, цель - разгадать чать, написанную на ассемблере, правильно загнать туда поинтеры и длину данных, и ...вот он самый быстрый метод
Вопрос, ...кто поможет?
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 23.04.2008, 17:04   #470
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
Сообщение Скрин...

Первое отображение объектов, покрупнее деревьев. Сразу понятно, что это за здание да? ... оно в последствии будет немного другое.
Миниатюры
Нажмите на изображение для увеличения
Название: Здания.jpg
Просмотров: 120
Размер:	40.5 Кб
ID:	3436  
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уроки по созданию игр для новичков... -=DeS=- Gamedev - cоздание игр: Unity, OpenGL, DirectX 750 14.11.2017 21:26
Музыка программистов - как вы относитесь к АРИИ? Весёлый Жека Свободное общение 46 10.10.2008 22:32
Конкурсы по созданию игр на Delphi mutabor Свободное общение 0 15.06.2007 12:40
Работа по созданию ПО remix Фриланс 3 22.04.2007 11:00


19:39.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru