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 | 
	
		
	 |