Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.01.2011, 18:04
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию Ускорение работы - прозрачность

Пишу игру Worms, и мне нужен полу-прозрачный коричневый прямоугольник посередине экрана. Я его сделал, но теперь у меня всё тормозит.

Код:
procedure DrawInv(var b: TBitmap; k: Real);
type
  PRGBArray = ^TRGBArray;
  TRGBArray = array[0..10000] of TRGBTriple;
var x,y: Integer;
    l: PRGBArray;
begin
for y:=50 to b.Height-51 do begin
 l:=b.ScanLine[y];
 for x:=50 to  b.Width-51 do begin
   l[x].rgbtBlue:=Round(l[x].rgbtBlue*(100-k)+14*k) div 100;
   l[x].rgbtGreen:=Round(l[x].rgbtGreen*(100-k)+42*k) div 100;
   l[x].rgbtRed:=Round(l[x].rgbtRed*(100-k)+106*k) div 100;
 end;
end;
end;
(k - процент прозрачности)

Подскажите, как ещё можно ускорить процесс?
Ответить с цитированием
  #2  
Старый 04.01.2011, 11:32
x128 x128 вне форума
Новичок
 
Регистрация: 03.02.2010
Сообщения: 64
Репутация: 133
По умолчанию

Код:
      l[x].rgbtBlue:=(255+l[x].rgbtBlue*a+14*(255-a)) shr 8;
      l[x].rgbtGreen:=(255+l[x].rgbtGreen*a+42*(255-a)) shr 8;
      l[x].rgbtRed:=(255+l[x].rgbtRed*a+106*(255-a)) shr 8;
где (a: byte) значение прозрачности 0..255
Ответить с цитированием
  #3  
Старый 05.01.2011, 20:25
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

спасибо)) неужели битовые операции выполняются НАСТОЛЬКО быстрее... но ведь ускорилось))
Ответить с цитированием
  #4  
Старый 05.01.2011, 21:18
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Дробные числа сами по себе работают раз в 50 (а то и больше) медленнее целых.
Например:
Код:
a:=b+a;
Если a и b - Integer, этот код в ассемблере выглядит так:
Код:
 mov eax, b
 add eax, a
 mov a, eax
т.е. 3 команды.
Если эти числа - real, то сначала 5 строк заполнения параметров, потом вызов функции перевода b из Real в Extended, потом то же самое для A, потом функция сложения и функция перевода результата из Extended в Real. Все эти функции от 10 команд.

Функция Round тормозит прогресс. Приходится считать выражение дробным и переводить в целое.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter