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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 15:58   #821
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Цитата:
Заполнение подложки или отрисовка персонажей в кадр?
Сори, за глупый вопрос, но как мне это определить?
Думаю при Заполнении, но это простая догадка.
Асм я вообще пока не понимаю.


Код:
procedure DrawToBuf(TexP: Pointer; TexL: Integer; BufP: Pointer;
  BufL, TexSegmentHeight, Width32bitDiv4: Integer);
begin

  asm
    pxor mm7, mm7      // Обнуление регистра

    push edi
    push esi
    push edx
    push ecx
    push eax

    mov  ecx, TexSegmentHeight   // Значение счетчика для цикла @yy

    mov  esi, TexP               // Tex. Адрес начала строки
    mov  edi, BufP               // Buf. Адрес начала строки

  @yy:
    mov  eax, ecx              // Сохранение значения счетчика @yy
    mov  ecx, Width32bitDiv4   // Значение счетчика для цикла @xx
    xor  edx, edx

  @xx:
    cmp dword ptr [esi], 0     // Если по адресу есть не пустые пикселы,
    jne @mix                   // переходить на смешивание цветов
    cmp dword ptr [esi+4], 0   // Если следующие по адресу пискелы пустые,
    je  @next                  // пропускать смешивание

  @mix:
    movd     mm0, [esi]        // <- Tex
    movd     mm1, [edi]        // <- Buf                                                                      - Вот тут

    punpcklbw  mm0, mm7        // Распаковка в Word
    punpcklbw  mm1, mm7        // Распаковка в Word

    pshufw     mm2, mm0, 255   // [Alp][Alp][Alp][Alp]
    pmullw     mm1, mm2        // Buf * Alp
    psrlw      mm1, 8          // (Buf * Alp) shr 8
    paddusw    mm0, mm1        // Tex + (Buf * Alp) shr 8

    packuswb   mm0, mm0        // Упаковка в Byte

    movd     [edi], mm0        // -> Buf                                                                         - И тут

  @next:
    add esi, 4        // Tex. Адрес вперед на 4 байта
    add edi, 4        // Buf. Адрес вперед на 4 байта
    add edx, 4        // Счетчик сдвига адреса по строке

    dec ecx           // Счетчик пикселей
    jnz @xx

    sub esi, edx      // Tex. Вернуть адрес в начало
    add esi, TexL     // Перейти на следующую строку

    sub edi, edx      // Buf. Вернуть адрес в начало
    sub edi, BufL     // Перейти на следующую строку

    mov ecx, eax      // Возврат значения счетчика @yy
    dec ecx           // Счетчик строк
    jnz @yy

    pop eax
    pop ecx
    pop edx
    pop esi
    pop edi

    emms
  end;

end;
ZBEP вне форума Ответить с цитированием
Старый 26.11.2010, 16:38   #822
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

ZBEP, это сама процедура, работает корректно, если отправленные данные в нее также корректны. Вот сам вызов:

Код:
DrawToBuf(@TexBank[0].TexBits^[0],      // Начало текстуры
                  TexBank[0].TexLine,           // Длина строки текстуры
                  BufSprt + (H-1-(TexBank[1].TexH-1+dt)+24) * BufLine + (dz * 4),   // Начало в кадре
                  BufLine,                      // Длина строки кадра
                  TexBank[0].TexH - 1,          // Количество строк отрисовки
                  TexBank[0].TexLineDiv4);      // Кратная длина строки
Вот эта строчка:

Код:
BufSprt + (H-1-(TexBank[1].TexH-1+dt)+24) * BufLine + (dz * 4)
...является указателем на память буфера (это линейный адрес, в памяти все "вверх ногами") этот адрес записывается в edi в процедуре DrawToBuf. BufSprt - это массив указателей, PChar, если таковой тип поддерживается средой, то BufSprt указывает на начало массива, далее прибавлением адрес сдвигается в нужное положение. Если это не поддерживается, то увы, нужно искать другой способ или компилировать в другой версии Delphi или компилятора, ...тут точно не скажу.

В любом месте кода, слева можно поставить точку останова (красный кружок и вся строка подсветится красным), далее F9 и программа остановится в выбранной точке, на этой строке, затем далее нажимая F8 будет переход на следующую строку, так в ручном режиме можно отыскать проблемное место. Отметь вот тут:

Код:
// #############################################################################
// Заполняет подложку изображением                                             #
// #############################################################################
procedure CreateGround;
begin
  // Подготовка подложки -------------------------------------------------------
  dtStep := 0;
  For t := 0 to 62 do
    Begin
      dt := dtStep * 12;
      dzStep := 0;
      For z := 0 to 23 do
        Begin
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.11.2010, 16:59   #823
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Блин, все, я забыл, что PChar надо на PAnsiChar заменять на новых делфях.
Спасибо!

П.с.
Ток чет прозрачности нету, ща буду искать в чем дело.
ZBEP вне форума Ответить с цитированием
Старый 26.11.2010, 17:26   #824
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Прозрачность связана с библиотекой PNGImage, возможно не та версия или еще что-то, вот весь набор, что есть у меня (во вложении).

Быть может и эта переменная не поддерживается: PointAlpha: PByteArray; ?
Вложения
Тип файла: zip PNGImage.zip (349.8 Кб, 23 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 26.11.2010 в 17:56.
Beermonza вне форума Ответить с цитированием
Старый 26.11.2010, 17:37   #825
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Спс, сейчас проверю.
Не может найти файл adler32.obj
У себя тоже искал - не нашел.

П.с.
Этих файлов также нет
Код:
{$L obj\deflate.obj}
{$L obj\infback.obj}
{$L obj\inffast.obj}
{$L obj\inflate.obj}
{$L obj\inftrees.obj}
{$L obj\trees.obj}
{$L obj\compress.obj}
{$L obj\crc32.obj}
ZBEP вне форума Ответить с цитированием
Старый 26.11.2010, 17:57   #826
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Перезалил архив, в нем полностью все.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.11.2010, 18:05   #827
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Блин, под XE не хочет его компилировать
Странно, то что со стандартным pngimage не хочет с прозрачностью работать.
В другом проекте все норм
ZBEP вне форума Ответить с цитированием
Старый 26.11.2010, 19:39   #828
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Тогда попробуй заменить секцию создания и загрузки PNG в динамический массив. Вот как это происходит сейчас. Это обязательное условие, чтобы можно было обращаться напрямую к памяти по указателю:

Код:
  TByteMas = Array Of Byte;        // Массив данных текстуры
  PByteMas = ^TByteMas;            // Доступ по указателю
Далее, в банке текстур должна быть запись данного типа:

Код:
  TexBits:      PByteMas;       // Данные изображения текстуры
Сам банк текстур:

Код:
// Массив банка текстур (на 4 тексуры)
  TexBank: array[0..3] of TTex;
Подготовка должна выполняться:

Код:
// Создается сжатый формат
  PNGTex := TPNGObject.Create;        

// Загружается файл текстуры (изображение + маска)
  PNGTex.LoadFromFile(Dir+'\'+IntToStr(i)+'.png');

  TexBank[i].TexH := PNGTex.Height;   // Высота текстуры
  TexBank[i].TexW := PNGTex.Width;    // Длина текстуры

// Определение длины строки пикселов
  TexBank[i].TexLine := PNGTex.Width * 4;
  TexBank[i].TexLineDiv4 := TexBank[i].TexLine div 4;
Далее создается динамический массив:

Код:
// Расширить память для массива текстуры (задать размер)
  If TexBank[i].TexBits = nil then New(TexBank[i].TexBits);
  SetLength(TexBank[i].TexBits^, PNGTex.Height * TexBank[i].TexLine);
...это будет так называемый спрайт, туда нужно каким либо образом закинуть данные из PNG. Последовательность на каждый пиксел - BGRA, ...поскольку в памяти все наоборот, это будет считываться как ARGB. Вот в цикле нужно заполнять этот спрайт:

Код:
TexBank[i].TexBits^[t_Tex]     := {синий};
TexBank[i].TexBits^[t_Tex + 1] := {зеленый};
TexBank[i].TexBits^[t_Tex + 2] := {красный};
TexBank[i].TexBits^[t_Tex + 3] := {альфа-канал};

Inc(t_Tex, 4);
Но, в чем фишка. Нужно не просто отправить компоненты, но и выполнить над ними операции, поскольку я применил иную формулу смешивания цветов так, что в ней оказалась часть статических вычислений, которые следует выбросить за цикл смешивания, оставив в нем только половину операций, ...а первая половина пошла непосредственно в загрузку текстуры. Именно за счет этого достигается скорость отрисовки в памяти:

B = {синий} * {альфа-канал} / 256
G = {зеленый} * {альфа-канал} / 256
R = {красный} * {альфа-канал} / 256
A = 255 - {альфа-канал}

В смешивании остается только это, без отрицательных чисел (на примере красной компоненты):

Buf = Tex + (Buf * Alp) shr 8

Особенности формулы в том, что если в текстуре истинно черный цвет RGB(0,0,0), то она выполнит альфа-канал как ключ прозрачности, т.е. грубо сделает полностью прозрачным весь черный цвет. Чтобы этого не происходило, ни одна из компонент не должна быть меньше 2-х, ...я беру 4, так легче запомнить. Сомневаюсь, что кто-то на глаз сможет отличить два рядом стоящих квадрата с цветом RGB(0,0,0) и RGB(4,4,4), ...поэтому, нужно либо рисовать текстуры с заранее выставленными компонентами не ниже 4-х, либо в программе выполнить проверку и замену при загрузки изображения, ...либо оставить как есть, если этот эффект нужен, ...просто создавать правильные текстуры.

Вот, собственно, и все. Дальнейшее увеличение скорости - переход на SSE-регистры.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 27.11.2010, 01:32   #829
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Немного отойдя от темы, сейчас параллельно "изучаю" в общих чертах DirectX и наткнулся на Mini 2D engine, хоть "функций" пока и маловато, но давольно таки удобная вещь.
Добавил пару процедур для более удобного управления (можно было бы конечно в самом проекте их расписать, но так для меня удобнее было), производительность хорошая вроде, дальше видно будет.
П.с.
Beermonza
Ок, завтра не дома буду, послезавтра тоже врятли получится, в понедельник сяду дальше разбираться.

Последний раз редактировалось ZBEP; 27.11.2010 в 03:30.
ZBEP вне форума Ответить с цитированием
Старый 01.12.2010, 11:14   #830
Gangsta15
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 12
По умолчанию

Привет всем) Посмотрел тему, смотрю уже далеко ушли, тоже решил попробывать себя в создании игр, в делфи опыт есть небольшой, можете подсказать с чего начать?
Gangsta15 вне форума Ответить с цитированием
Ответ


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