| Efrit   
   
 Posts: 6186
 
 | 
			| 
 
				А что смешного? Вики утверждает, что именно эта формула и используется для точного расчёта числа Пи на обычных ПК.
			 
 Welcome!
 |  | 
	| 28.04.2012 00:31 |  | 
	
		| etoprostoya   
 Posts: 1809
 
 | 
			| 
 
				Я программы спрашивал, а не формулу. Хочу сравнить.
			 |  | 
	| 28.04.2012 01:11 |  | 
	
		| gamecreator   
   Posts: 7107
 
 |  | 
	| 28.04.2012 01:16 |  | 
	
		| etoprostoya   
 Posts: 1809
 
 | 
			| 
 
				Я хочу сравнить производительность разных алгоритмов вычисления числа Пи.
 Само число Пи я не собираюсь вычислять, если вы это имеете в виду.
 
				
(This post was last modified: 28.04.2012 01:19 by etoprostoya.)
 |  | 
	| 28.04.2012 01:19 |  | 
	
		| packa   
   Posts: 1210
 
 | 
			| 
 
				Quote:в C# элементу управления (по крайней мере, форме) можно установить двойную буферизацию. поищи это.  Quote:В плюсовой VCL тоже. this->DoubleBuffered = true, если в синтаксисе не опечатался...  
Да я слышал, и уже использовал, но здесь почему то совершенно не работает!  
Пробовал по разному и this->DoubleBuffered = true и DoubleBuffered = true и Form1->DoubleBuffered=true 
И в разным местах: онпаинт, онкриэйт...
 
Сорс нужно?
			 
 подпись была удалена администрацией
 просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
 |  | 
	| 28.04.2012 07:11 |  | 
	
		| Efrit   
   
 Posts: 6186
 
 | 
			| 
 
				etoprostoya Wrote:Я хочу сравнить производительность разных алгоритмов вычисления числа Пи.Само число Пи я не собираюсь вычислять, если вы это имеете в виду.
 Так нету этих "алгоритмов", насколько я понимаю. Это число по готовым формулам и вычисляют...
 packa Wrote:Пробовал по разному и this->DoubleBuffered = true и DoubleBuffered = true и Form1->DoubleBuffered=trueИ в разным местах: онпаинт, онкриэйт...
  
Это одна и та же запись. Потому что все "события формы" - это методы класса TForm , в котором Form1  и играет роль this . Но this  - это более универсальная запись, она не изменится при переименовании Form1  в какую-нибудь my_favorite_Form . Поэтому, более каноничен первый вариант.
 
И прописывать это надо лишь один раз, в конструкторе формы. Почему не работает - хз. Приведи код того фрагмента, где ты раскрашиваешь всё своим "чёрным прямоугольником" (кстати, нафига?) 
 Welcome!
 |  | 
	| 28.04.2012 13:46 |  | 
	
		| totkotoriy   
   Posts: 873
 
 | 
			| 
 
				Может кто подскажет как оптимизировать код для alpha.dll? 
Нагружает проц. вот эта функция, которая вычисляет каждый пиксель с альфа каналом
 
Code:
 static int Draw( int Type, image *pImage, draw_info *pInfo ){
 int screenW=GetSystemMetrics(SM_CXSCREEN);
 int screenH=GetSystemMetrics(SM_CYSCREEN);
 if( pInfo->screen_size.x != screenW || pInfo->screen_size.y != screenH )
 return OriginalDraw( Type, pImage, pInfo );
 
 static char LastNames[8][13] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} };
 static int CurLastName = 0;
 
 if( g_bPrint )
 {
 for( int i = 0; i < 8; i++ )
 if( strcmp( pImage->name, LastNames[i] ) == 0 )
 goto draw;
 
 strncpy( LastNames[CurLastName], pImage->name, 12 );
 LastNames[CurLastName][12] = 0;
 aprintf( WHITE, "draw %s\n", LastNames[CurLastName] );
 CurLastName++;
 if( CurLastName >= 8 )
 CurLastName = 0;
 }
 draw:
 
 map<image_name,new_image*>::iterator Rep = g_Replace.find( image_name(pImage->name) );
 if( Rep == g_Replace.end() )
 return OriginalDraw( Type, pImage, pInfo );
 
 new_image *pNewImage = Rep->second;
 
 // center image
 vector ImagePos = pInfo->pos - pInfo->pos0 + (pImage->total_size - pNewImage->size)/2;
 
 // crop image
 vector Pos = pInfo->pos;
 vector Size = pInfo->size;
 rect_cross( &Pos, &Size, ImagePos, pNewImage->size );
 rect_cross( &Pos, &Size, vector( 0, 0 ), vector( screenW, screenH ) );
 
 vector Pos0 = Pos - ImagePos;
 
 color16 *pOld = &pInfo->pscreen[Pos.y*screenW + Pos.x];
 colorRGBA *pNew;
 if( pInfo->horz_invert )
 pNew = &pNewImage->data[(Pos0.y+1)*pNewImage->size.x - Pos0.x];
 else
 pNew = &pNewImage->data[(Pos0.y  )*pNewImage->size.x + Pos0.x];
 for( int y = 0; y < Size.y; y++ )
 {
 for( int x = 0; x < Size.x; x++ )
 {
 if( ( *pNew & 0xFFFFFF ) == 0xFFFF ) // color for replacement
 {
 color16 New = pInfo->color;
 if( New )
 *pOld = MakeColor16( GetRed  (*pOld) + GetAlpha(*pNew)*(GetRed  (New) - GetRed  (*pOld))/256,
 GetGreen(*pOld) + GetAlpha(*pNew)*(GetGreen(New) - GetGreen(*pOld))/256,
 GetBlue (*pOld) + GetAlpha(*pNew)*(GetBlue (New) - GetBlue (*pOld))/256 );
 }
 else
 *pOld = MakeColor16( GetRed  (*pOld) + GetAlpha(*pNew)*(GetRed  (*pNew) - GetRed  (*pOld))/256,
 GetGreen(*pOld) + GetAlpha(*pNew)*(GetGreen(*pNew) - GetGreen(*pOld))/256,
 GetBlue (*pOld) + GetAlpha(*pNew)*(GetBlue (*pNew) - GetBlue (*pOld))/256 );
 pOld++;
 if( pInfo->horz_invert )
 pNew--;
 else
 pNew++;
 }
 
 pOld += screenW - Size.x;
 if( pInfo->horz_invert )
 pNew += pNewImage->size.x + Size.x;
 else
 pNew += pNewImage->size.x - Size.x;
 }
 return 0;
 }
 
Не могу найти место где можно упростить вычисления или заменить логику. Пытался также сделать многопоточность с помощью openMP, но пока не ничего не получается да и это сильно не поможет, т.к. ядро 2,4 ггц не должно нагружаться на 100%...
			
 Ты роешься в моих паках, но ты делаешь это без уважения...
 
				
(This post was last modified: 28.04.2012 13:50 by totkotoriy.)
 |  | 
	| 28.04.2012 13:46 |  | 
	
		| Sav   
 Posts: 2180
 
 | 
			| 
 
				Можно вместо "/256" написать ">> 8", может компилятор сам не оптимизирует. И ещё я бы не стал использовать методы для обращения к пикселям в таком низкоуровневом процессе.
 Да и класс для цвета зря используется.
 
 Короче, слишком высокоуровневый код, как по мне, неуместный для такого процесса.
 
				
(This post was last modified: 28.04.2012 13:59 by Sav.)
 |  | 
	| 28.04.2012 13:56 |  | 
	
		| Efrit   
   
 Posts: 6186
 
 | 
			| 
 
				Сложно сказать, но по виду - возможно, тормозит функция MakeColor16 и её вызов. Зачем там одни и те же касты выполняются дважды?Да и само решение какое-то корявое - каждый пиксель менять. Хотя других я и не знаю.
 
 Попробуй закомментить вызовы этой функции и посмотреть - меньше нагрузка стала?
 
 Welcome!
 |  | 
	| 28.04.2012 14:04 |  | 
	
		| packa   
   Posts: 1210
 
 | 
			| 
 
				
Code:
 void __fastcall TForm1::FormCreate(TObject *Sender){
 rhis->DoubleBuffered=true;
 }
 
Code:
 void __fastcall TForm1::Timer1Timer(TObject *Sender){
 ammo = new Graphics::TBitmap;
 ammo->LoadFromFile("ammo.bmp");
 Form1->Canvas->Brush->Color=(TColor)RGB(0,0,0);
 Form1->Canvas->Rectangle(0,0,ClientWidth,ClientWidth);
 /*Много кода и отрисовок*/
 delete ammo;
 }
 Quote:Это одна и та же запись. 
Угу, но вдруг глючит) лучше уж проверить.
http://zalil.ru/33150201 
Вот на всякий случай - прошу в код даже не вглядываться) данный сорс только чтобы показать как мерцает.
			 
 подпись была удалена администрацией
 просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
 
				
(This post was last modified: 28.04.2012 15:07 by packa.)
 |  | 
	| 28.04.2012 15:06 |  | 
	
		| totkotoriy   
   Posts: 873
 
 | 
			| 
 
				 (28.04.2012 13:56)Sav Wrote:  Можно вместо "/256" написать ">> 8", может компилятор сам не оптимизирует. И ещё я бы не стал использовать методы для обращения к пикселям в таком низкоуровневом процессе.
 Да и класс для цвета зря используется.
 
 Короче, слишком высокоуровневый код, как по мне, неуместный для такого процесса.
 
Я просто не думаю, что перевод всего на низкий уровень существенно повысит скорость. Дело не в сложности расчетов, а в их количестве. Вот если бы перенести эти расчеты на графический процессор или придумать другую логику. 
А что значит >>? Просто я не в одном языке нормально не шарю.
  (28.04.2012 14:04)Efrit Wrote:  Попробуй закомментить вызовы этой функции и посмотреть - меньше нагрузка стала? 
Я это и написал, просто привел всю функцию для наглядности.
 
Может ещё есть в какой-нибудь libpng уже готовая функция для наложения альфа канала? 
Хотел ещё новые библиотеки zlib и libpng в GCC пропихнуть, но у них изменился синтаксис, а править у меня мозгов пока не хватит, просто думал тоже мож чего там оптимизировали. 
Может вообще через openGL попробовать?
			 
 Ты роешься в моих паках, но ты делаешь это без уважения...
 
				
(This post was last modified: 28.04.2012 15:24 by totkotoriy.)
 |  | 
	| 28.04.2012 15:07 |  | 
	
		| packa   
   Posts: 1210
 
 | 
			| 
 
				Quote:(кстати, нафига?) 
Иначе следы будут. Ужасные)  
Если не трудно, помести в комметарий эту строчку ( Form1->Canvas->Rectangle(0,0,ClientWidth,ClientWidth); ), и увидишь)
			 
 подпись была удалена администрацией
 просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
 |  | 
	| 28.04.2012 15:12 |  | 
	
		| totkotoriy   
   Posts: 873
 
 | 
			| 
 
				Упростил чуть чуть: 
Code:
 for( int y = 0; y < Size.y; y++ ){
 for( int x = 0; x < Size.x; x++ )
 {
 
 ro1 = GetRed  (*pOld);
 rn1 = GetRed  (*pNew);
 go1 = GetGreen  (*pOld);
 gn1 = GetGreen  (*pNew);
 bo1 = GetBlue  (*pOld);
 bn1 = GetBlue  (*pNew);
 an1 = GetAlpha(*pNew);
 if( ( *pNew & 0xFFFFFF ) == 0xFFFF ) // color for replacement
 {
 color16 New = pInfo->color;
 if( New )
 *pOld = MakeColor16( GetRed  (*pOld) + GetAlpha(*pNew)*(GetRed  (New) - GetRed  (*pOld))/256,
 GetGreen(*pOld) + GetAlpha(*pNew)*(GetGreen(New) - GetGreen(*pOld))/256,
 GetBlue (*pOld) + GetAlpha(*pNew)*(GetBlue (New) - GetBlue (*pOld))/256 );
 }
 else
 {
 NewRed = ro1 + an1*(rn1 - ro1)/256;
 NewGreen = go1 + an1*(gn1 - go1)/256;
 NewBlue = bo1 + an1*(bn1 - bo1)/256;
 *pOld = MakeColor16( NewRed, NewGreen, NewBlue);
 }
 pOld++;
 if( pInfo->horz_invert )
 pNew--;
 else
 pNew++;
 }
 
Производительность выросла как минимум в 2 раза    по сему несказанно счастлив   . Может что еще придумаю.
			
 Ты роешься в моих паках, но ты делаешь это без уважения...
 |  | 
	| 28.04.2012 16:13 |  | 
	
		| Sav   
 Posts: 2180
 
 | 
			| 
 
				totkotoriy Wrote:Я просто не думаю, что перевод всего на низкий уровень существенно повысит скорость. Дело не в сложности расчетов, а в их количестве. 
В героях делаются аналогичные вещи и ничего. Ну, дело твоё, но если не попробуешь сделать хоть что-то - точно ничего не получится.
 
>> - это поразрядный двоичный сдвиг вправо. 
Вот видишь, такая фигня - а какой эффект.    Так что упростить как раз и надо.
			 
				
(This post was last modified: 28.04.2012 16:20 by Sav.)
 |  | 
	| 28.04.2012 16:17 |  | 
	
		| Efrit   
   
 Posts: 6186
 
 | 
			| 
 
				packa, ну это же жуть!    Плз, переформатируй свой код - читать же абсолютно невозможно. Я в Notepad++  открывал, есичо. 
Да и зачем нам весь проект? Нужен лишь исходник, а ещё лучше - его фрагмент...
totkotoriy , ещё и в строчках типа *pOld = MakeColor16( GetRed  (*pOld) + GetAlpha(*pNew)*(GetRed  (New) - GetRed  (*pOld))/256,  тоже не помешало бы произвести замену на ro1 , rn1  и иже с ними.
			 
 Welcome!
 |  | 
	| 28.04.2012 16:21 |  |