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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2008, 23:21   #441
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Цитата:
чтото вы тут путаете
ASPack Software <-- а так поискать этот аспак
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 18.04.2008, 00:41   #442
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Отчет...

Итак, ...вот что на текущий момент проделано.
Поскольку движок был выполнен на GDI, даже я бы сказал на API, все построение изображений в ОЗУ точка за точкой, то некоторые наши товарищи пожаловались на некоторые тормоза. Предчувствуя наступления того же даже на более мощных компах, в следствии добавления все новых и новых возможностей в цикл построения кадра, я решил поискать другой путь.
Говорят, есть такой DirectDraw, и типа он будет быстрее все рисовать. Хорошо, будем пробовать. Через день выясняется, что разработчики не вставили а аппаратку такую нужную поддержку полупрозрачности, вместо этого, только ключ прозрачности (GIF-эффект короче). В результате пришлось писать функцию альфы вручную.
После нескольких часов оптимизации получилось вроде бы то, что нужно, быстро и просто, ...но это с цельными сюрфесами, еще же нужно их обрезать ).
В общем, замутил тестирование двух версий API и DirectDraw. В итоге, оказалось, что вариант c API работает быстрее, хоть и подгружает процессор чуть больше. Причина вся в том, что слабое звено - пересылка кадра из системной памяти в видеобуфер, который потом выводится на экран.
Так что, время опять оказалось потрачено в пустую ((( (как неудачно и с DelphiX). Продолжаем работать с API, а если найдутся знатоки этого дела, то пожалуйста пишите сюда что можно ускорить.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 18.04.2008, 07:18   #443
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Beermonza,есть еще два варианта OpenGL и Direct3D

Цитата:
Через день выясняется, что разработчики не вставили а аппаратку такую нужную поддержку полупрозрачности
Это производители видеокарт отказались встраивать аппаратную поддержку функций DD. Зачем DD раз есть D3D.
Kostia вне форума Ответить с цитированием
Старый 18.04.2008, 13:34   #444
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Beermonza, попробуйте заюзать один из популярных 2D движков, зацените скорость вывода. А там, в зависимости от результата, уже решите как поступить. На Delphi есть несколько хороших, и на OGL и на DX. Если понравится, всегда можно свой написать. Кстати увидите разницу со своими экспериментами с DD. Плюс перед тем как что-то делать свое, желательно поюзать это же но чужое, и несколько штук, чтобы сделать лучше.

p.s. DelphiX наверное всех подкупает словом Delphi в названии
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 вне форума Ответить с цитированием
Старый 18.04.2008, 17:49   #445
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Давайте думать...

Вот я использую два битовых буфера (TBitmap), TerrBuf хранит поверхность карты в сборе, DrawBuf используется для построения кадра. В начале цикла нужно всегда переносить содержимое из TerrBuf в DrawBuf, делается это все в системной памяти вот так:

Код:
...
type
  PRGB = ^TRGB;
  tagRGB = packed record
    R: Byte;
    B: Byte;
    G: Byte;
  end;
  TRGB = tagRGB;

var
  TerrPixel, DrawPixel: PRGB; // структура доступа к компонентам цвета
  TerrBuf, DrawBuf: TBitmap; // битовые буферы
  xx: Integer; // счетчик
  W, H: Word; // размеры буферов
...

TerrPixel:=TerrBuf.ScanLine[0];
DrawPixel:=DrawBuf.ScanLine[0];

// цикл xx перебирает все байты
  for xx:=0 to (W)*(H) do
    begin
       // Передаем цветовые компоненты
       DrawPixel.R:=TerrPixel.R;
       DrawPixel.G:=TerrPixel.G;
       DrawPixel.B:=TerrPixel.B;
       // Получаем указатели на следующие байты
       DWORD(TerrPixel):=DWORD(TerrPixel)+4;
       DWORD(DrawPixel):=DWORD(DrawPixel)+4;
    end;
Собственно, что интересно ... работаем мы в памяти а потом воспользоваться результатом не получается, DrawBuf будет содержать что-то только после обновления. Можно написать так:

DrawBuf.Assign(TerrBuf);

...тогда можно верхний алгоритм не использовать вовсе, но скорость падает значительно. Кто понимает, что можно сделать, чтобы мой алгоритм передавал байты из буфера в буфер? ...я так понимаю, что пока идет только переназначение поинтеров.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 18.04.2008, 19:25   #446
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А если BitBlt вместо Assign, тоже медленно?

В чем основная идея ускорения? Вместо передачи в функцию как аргумент хэндла битмапа (как c BitBlt) перезаписывать RGB байты через ScanLine?
Обычно вроде так делают (это я выдрал из другой по назначению функции и немного подправил)
Код:
Src, Dest: TBitmap;
var 
w,h,x,y: integer;
p, p2: pbytearray;
begin
w:=src.width;
h:=src.height;
Dest.PixelFormat :=pf24bit;
 for y:=0 to h-1 do begin
  p:=src.scanline[y];
  p2:=dest.scanline[y];
  for x:=0 to w-1 do begin
   p2[x*3]:= p[x*3];
   p2[x*3+1]:= p[x*3+1];
   p2[x*3+2]:= p[x*3+2];
   //возможно будет работать и так, не проверял
   //p2:=p;
   end;
  end;
end;
Никогда не проверял, интересно, Scanline в цикле быстрее копирует чем BitBlt?
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; 18.04.2008 в 19:46.
mutabor вне форума Ответить с цитированием
Старый 18.04.2008, 21:09   #447
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Собственно, что интересно ... работаем мы в памяти а потом воспользоваться результатом не получается, DrawBuf будет содержать что-то только после обновления.
Может в цикле делается еще какая-то обработка кроме простого копирования. Для такого случая:

BitMap.ScanLine в конечном итоге использует GetDIBits для копирования информации о цвете в буфер в памяти.
Изменения этого буфера можно вернуть обратно вызовом SetDIBits.
Попробовал реализовать (не знаю как это скажется на скорости):

Код:

procedure TForm1.FormPaint(Sender: TObject);
type CArray = array [word] of integer;
var B:TBitMap;
    A:array [word] of integer;
    i:integer;
    BitsInfo: TBitmapInfo;
begin
   B := TBitMap.Create;
   B.PixelFormat := pf32bit;  // т.к. A - of integer
   B.Width := 100;
   B.Height := 100;
   B.Canvas.Brush.Color := clBlue;
   B.Canvas.FillRect(Rect(0, 0, B.Width, B.Height));

   GetDIB(B.Handle, 0, BitsInfo, A); // чтобы не мучиться с заполнением BitsInfo

   // Весь bitMap в массив
   getDIBIts(B.Canvas.Handle, B.Handle, 0, B.Height, @A, BitsInfo, DIB_RGB_COLORS);

   // Рисуем вертикальную линию
   for i:=0 to B.Height-1 do begin
      A[i*B.Width+0] := 00;
      A[i*B.Width+1] := 00;
   end;

   // Массив обратно в bitMap
   SetDIBits(B.Canvas.Handle, B.Handle, 0, B.Height, @A, BitsInfo, DIB_RGB_COLORS);

   { Можно сделать то-же самое отдельно для каждой строки
   GetDIB(B.Handle, 0, BitsInfo, A);
   for i:=0 to B.Height-1 do begin
      getDIBIts(B.Canvas.Handle, B.Handle, i, 1, @A, BitsInfo, DIB_RGB_COLORS);
      A[0] := 00;
      A[1] := 00;
      SetDIBits(B.Canvas.Handle, B.Handle, i, 1, @A, BitsInfo, DIB_RGB_COLORS);
   end;
   }

   Canvas.Draw(0, 0, B);
end;
alexBlack вне форума Ответить с цитированием
Старый 19.04.2008, 16:01   #448
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Исследования продолжаются...

alexBlack, в цикле много чего обрабатывается, но слабые места именно в копировании буферов и выводе в PaintBox. Последнее оставим на потом, разбираемся с буферами. Вижу последней строкой идет Canvas.Draw(0, 0, B); ... это работает оч. медленно для моей модели, ...любой вызов канвы сразу же сказывается на скорости (((

Мой алгоритм работает очень быстро, но результата нет, ...все равно что не работает.

mutabor, то, что ты выдрал из другой по назначению функции и немного подправил работает почему-то с аналогичной скоростью, что и Assing ((( ... p2:=p; не работает совсем. Эта мысль меня натолкнула на запить:

DrawBuf:=TerrBuf;

...скорость при этом просто потрясающая, но что-то происходит с TerrBuf, похоже что оба буфера схлопыватюся.

Нужны другие варианты...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.04.2008, 16:31   #449
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Я тут немного подумал и упростил код который привел, mutabor,

Код:
Src, Dest: TBitmap;
var 
  h,w,y: integer;
begin
  w:=src.width;
  h:=src.height;
  Dest.PixelFormat :=pf24bit;
  for y:=0 to h-1 do 
     CopyMemory(dest.scanline[y],src.scanline[y],w*3);
end;
Но вот быстрее он или нет я не знаю, еще подумаю как можно упростить.

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

Kostia, просто замечательно, это работает в 2 раза быстрее чем Assign, спасибо!
...упростить наверное можно копированием всей памяти одного буфера в другой?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


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