Efrit
Posts: 6184
|
А что смешного? Вики утверждает, что именно эта формула и используется для точного расчёта числа Пи на обычных ПК.
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: 6184
|
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: 6184
|
Сложно сказать, но по виду - возможно, тормозит функция 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: 6184
|
packa, ну это же жуть! Плз, переформатируй свой код - читать же абсолютно невозможно. Я в Notepad++ открывал, есичо.
Да и зачем нам весь проект? Нужен лишь исходник, а ещё лучше - его фрагмент...
totkotoriy, ещё и в строчках типа *pOld = MakeColor16( GetRed (*pOld) + GetAlpha(*pNew)*(GetRed (New) - GetRed (*pOld))/256, тоже не помешало бы произвести замену на ro1, rn1 и иже с ними.
Welcome!
|
|
28.04.2012 16:21 |
|