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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 14:22   #1
t3ns0r
Пользователь
 
Аватар для t3ns0r
 
Регистрация: 23.07.2007
Сообщений: 20
По умолчанию Нужна помощь с оптимизацией

Доброго времени суток.
Пишу программу, очень требовательную к скорости выполнения
Поэтому необходимо как можно лучше оптимизировать по скорости следующую функцию:

Код:
void TParticle::Draw(byte * ppvBits) //ф-ия отрисовки частицы
{
	int dx, ir, jr;
	int dy;
	double alp;
	byte B = GetBValue(Color),G = GetGValue(Color), R = GetRValue(Color); синий, зелёный и красный цвета частицы
	double Ratio = (double)Size/100; //относительный размер частицы
	for (int i = 0;i<128*Ratio;i++)
	{
		dx = (i+y)*Horzres; //Horzres - количество байт в строке массива пикселей; x,y - координаты частицы
		ir = (byte)(i / Ratio);
		for (int j = 0;j<128*Ratio;j++)
		{
			dy = (j+x)*4;
			jr = (byte)(j /Ratio);
			alp = (double)Engine->Effects[NParent]->Alpha[NAlpha][ir][jr]/255; // степень полупрозрачности пикселя
			*(ppvBits+dx+dy) = (byte)(*(ppvBits+dy+dx) + alp * (B - *(ppvBits+dy+dx))); //ppvBits - указатель на начало массива байтов. //Меняем синюю состовляющую
			*(++ppvBits+dx+dy) = (byte)(*(ppvBits+dy+dx) + alp * (G - *(ppvBits+dy+dx))); //меняем зелёную
			*(++ppvBits+dx+dy) = (byte)(*(ppvBits+dy+dx) + alp * (R - *(ppvBits+dy+dx))); //и красную
			ppvBits-=2;
		}
	}
}
У кого какие есть идеи?
t3ns0r вне форума Ответить с цитированием
Старый 07.03.2009, 14:58   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Выносим отдельную константу для хранения 128*Ratio и используем её для задания границ циклов, а то они каждую итерацию высчитываются.
Вместо ir = (byte)(i / Ratio); и jr = (byte)(j /Ratio);
лучше: создать константу для 1/Ratio, а в итерациях циклов писать ir += <эта самая константа>;
ppvBits+dy+dx так же выносится в отдельную переменную, чтобы каждый раз не высчитывалось.
этот ужас:
Код:
*(ppvBits+dx+dy) = (byte)(*(ppvBits+dy+dx) + alp * (B - *(ppvBits+dy+dx))); //ppvBits - указатель на начало массива байтов. //Меняем синюю состовляющую
*(++ppvBits+dx+dy) = (byte)(*(ppvBits+dy+dx) + alp * (G - *(ppvBits+dy+dx))); //меняем зелёную
*(++ppvBits+dx+dy) = (byte)(*(ppvBits+dy+dx) + alp * (R - *(ppvBits+dy+dx)));
Тоже при желании можно вынести по правилам школьной алгебры. Раскрыть скобки и общую часть, которая не зависит от R,G и B так же высчитывается отдельно и потом используется для расчетов.
В общем:
- все повторяющиеся расчеты заносим в переменные
- * и / стараемся заменить на + и -
- Стараемся всё, что можно, вынести за границы циклов (Если значение какого-то выражения не меняется от итерации к итерации, то ему нечего делать в цикле)
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь sergy88 Паскаль, Turbo Pascal, PascalABC.NET 5 28.01.2009 12:36
Нужна помощь zinger Помощь студентам 2 16.05.2008 10:55