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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2008, 16:58   #451
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Да это должно быть еще быстрее

Попробуй обойтись всего одной строкой

CopyMemory(dest,src,43);

43 я из пальца высосал, но работает же :-)

Последний раз редактировалось Kostia; 19.04.2008 в 17:14.
Kostia вне форума Ответить с цитированием
Старый 19.04.2008, 17:58   #452
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

ГЫ, ...именно и пытался целиком взять память, но ошибка чтения постоянно, похоже отдельные строки записываются в разные места памяти, целиком не удается, только построчно.
Я вычислял размер и делал вот так:

Код:
BufLength:=Integer(TerrBuf.ScanLine[H-1])-Integer(TerrBuf.ScanLine[0]);
CopyMemory(DrawBuf.ScanLine[0],TerrBuf.ScanLine[0],Abs(BufLength));
где-то партак...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.04.2008, 18:10   #453
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Beermonza, ScanLine возвращает указатель всего на одну строку байтов а не на всю картинку
Kostia вне форума Ответить с цитированием
Старый 19.04.2008, 18:13   #454
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А если как-то так попробовать?
CopyMemory(@DrawBuf,@TerrBuf,SizeOf (TerrBuf));

Beermonza, ты так и не сказал, что с BitBlt, медленно? Есть ли разница в скорости с VCL'овскими методами?
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 вне форума Ответить с цитированием
Старый 19.04.2008, 18:29   #455
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Люди!!! Этот код у меня выполнился за 72 миллисекунды!!!

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  time: integer;
begin
  time:=GetTickCount;
  for i:=1 to 1000000 do
    MoveMemory(Image1.Picture.Bitmap,bmp1,42);
  form1.Caption:=inttostr(GetTickCount-time);
end;
Картинка размером гдето 400*300!!!

А этот

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  time: integer;
begin
  time:=GetTickCount;
  for i:=1 to 1000 do
    bitblt(Image1.Canvas.Handle,0,0,bmp1.Width,bmp1.Height,bmp1.Canvas.Handle,0,0,SrcCopy);
  form1.Caption:=inttostr(GetTickCount-time);
end;
За 344

Последний раз редактировалось Kostia; 19.04.2008 в 18:33.
Kostia вне форума Ответить с цитированием
Старый 19.04.2008, 19:04   #456
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
alexBlack, в цикле много чего обрабатывается, но слабые места именно в копировании буферов и выводе в PaintBox. Последнее оставим на потом, разбираемся с буферами. Вижу последней строкой идет Canvas.Draw(0, 0, B); ... это работает оч. медленно для моей модели, ...любой вызов канвы сразу же сказывается на скорости (((
Хм.. Почему вы обратили внимание на Canvas.Draw. Это же просто для проверки работы. Речь как-раз и шла о копировании буферов

Вместо

CopyMemory(DrawBuf.ScanLine[0], ...

которое вы пробуете позже
предлагалось GetDIBits/SetDiBits. В примере весь bitMap копируется в массив, в массиве делается обработка и массив возвращается обратно в bitMap.
alexBlack вне форума Ответить с цитированием
Старый 19.04.2008, 19:05   #457
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
# for i:=1 to 1000000 do
# MoveMemory(Image1.Picture.Bitmap,bm p1,42);
А почему MoveMemory? И чем вообще MoveMemory отличается от CopyMemory? По идее раз перенос, то окуда переносим освобождаться должна, так?

Вообще у меня есть на канве кроликометр=) с замером фпс, надо будет поприкручивать разные способы и посмотреть что получится.

2 Beermonza, а как у тебя все это попадает на экран из буфера, если не секрет?
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 вне форума Ответить с цитированием
Старый 19.04.2008, 19:39   #458
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

CopyMemory, MoveMemory это одно и то-же. Кстати, обе вызывают move().

Но, какая разница. Главное что копировать и куда. TBitMap - это объект Windows. Кто-ж нам даст указатель на его содержимое ? Единственное, что нам доступно, это Handle. ScanLine - метод VCL - сам распеределяет память и копирует туда из BitMap вызовом getDIBits. По пути еще делает кучу работы.
alexBlack вне форума Ответить с цитированием
Старый 19.04.2008, 20:15   #459
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Попробовал пока Canvas.Draw, BitBlt, Assign. Скорость в той последовательности в к-рой я их привел, слева направо по убыванию.
Draw почти такая же скорость как и BitBlt, даже чуть выше.
Assign в два раза медленнее остальных. И после его использования другие методы прежней скорости уже не показывают, процентов 70 от первоначальной (мерял фпс, использовал для замера Application OnIdle, Done = False).

p.s. Нашел "баг" с Assign. Дело в том что тот битмап из к-рого я копировал, загружен из файла 24бит, у битмапа приемника битность явно не указывалась. После применения Assign к нему, в него переносится битность из источника, и вместе с этим падает скорость. Такая же "пониженная" скорость (только теперь уже изначально) если задать битность сразу, пришлось это сделать т.к. ScanLine иначе неправильно работает.

Добавил ScanLine, тот что Костя доработал (postcount=459), вот результаты (fps):
Draw 260 (раньше было 420, до того как pf24bit приемнику явно задал)
BitBlt 258
ScanLine 232 (у меня работает заметно медленнее чем Draw и BitBlt)
Assign 170

p.p.s. Добавил CopyMemory(@Buffer,@Fon,SizeOf(Fon) ); Результаты (довольно интересные):
Draw 260
BitBlt 260
ScanLine 230
Assign 170
CopyMemory 510
- После CopyMemory fps меняется (методы с клавиатуры переключаются):
Draw 298
BitBlt 298
ScanLine 465
Assign 510
CopyMemory 510

Вот такие интересные результаты. Кстати при применении CopyMemory все настройки битмапа приемника сбиваются, получается точная копия источника, в отличие от Assign - c ним настройки шрифта и кисти сохранялись.
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; 19.04.2008 в 21:33.
mutabor вне форума Ответить с цитированием
Старый 19.04.2008, 21:49   #460
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вот исходный код этого теста
Код:
const
  BM_COUNT = 5;
  BM_Strings: array[0..BM_COUNT-1] of string = (
    'BitBlt',
    'CanvasDraw',
    'Assign',
    'ScanLine',
    'CopyMemory');

var
  Form1: TForm1;
  fon, buffer: TBitmap;
  Frames : integer;
  ThisTickCount, LastTickCount, FPSThisTickCount, FPSLastTickCount: cardinal;
  FPS: string;
  BltMode: byte;
  w,h: integer;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
fon:=TBitmap.Create;
//я загружал 24-битный битмап 640*480
fon.LoadFromFile('Images/big_logo.bmp');
buffer:=TBitmap.Create;
buffer.Width:=fon.Width;
buffer.Height:=fon.Height;
ClientWidth:=fon.Width;
ClientHeight:=fon.Height;
w:=fon.Width;
h:=fon.Height;
buffer.Canvas.Font.Name:='Arial';
buffer.Canvas.Font.Size:=14;
buffer.Canvas.Font.Style:=[fsBold];
buffer.Canvas.Font.Color:=RGB(255,128,0);
buffer.Canvas.Brush.Style:=bsClear;
Buffer.PixelFormat:=pf24bit;
Caption:=BM_Strings[BltMode];
end;

procedure CopyBM;
var
sumFPS: cardinal;
i: integer;
begin
Inc(frames);
ThisTickCount := GetTickCount;
FPSThisTickCount:=ThisTickCount;
sumFPS:=FPSThisTickCount-FPSLastTickCount;
if sumFPS >= 1000 then
  begin
  FPS:='FPS ' + IntToStr(Trunc(Frames*1000/sumFPS));
  Frames := 0; // Обнуляем счетчик
  FPSLastTickCount := GetTickCount;
  end;

//вот вся суть теста, выбор способа копирования фона в буфер
case BltMode of
  0: BitBlt(Buffer.Canvas.Handle,0,0,w,h,Fon.Canvas.Handle,0,0,SrcCopy);
  1: Buffer.Canvas.Draw(0,0,Fon);
  2: Buffer.Assign(Fon);
  3: for i:=0 to h-1 do
       CopyMemory(Buffer.scanline[i],Fon.scanline[i],w*3);
  4: CopyMemory(@Buffer,@Fon,SizeOf(Fon));
  end;

//то что для вывода текста и вывода буфера на экран используются
//методы канвы, погрешности не вносит, так как условия равные
buffer.Canvas.TextOut(10,10,FPS);
Form1.Canvas.Draw(0,0,buffer);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = 13 then Inc(BltMode);
if BltMode = BM_COUNT then BltMode:=0;
Caption:=BM_Strings[BltMode];
end;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  var Done: Boolean);
begin
CopyBM;
Done:=False;
end;
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; 19.04.2008 в 21:52.
mutabor вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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