Efrit
Posts: 6183
|
А что смешного? Вики утверждает, что именно эта формула и используется для точного расчёта числа Пи на обычных ПК.
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
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: 6183
|
etoprostoya Wrote:Я хочу сравнить производительность разных алгоритмов вычисления числа Пи.
Само число Пи я не собираюсь вычислять, если вы это имеете в виду.
Так нету этих "алгоритмов", насколько я понимаю. Это число по готовым формулам и вычисляют...
packa Wrote:Пробовал по разному и this->DoubleBuffered = true и DoubleBuffered = true и Form1->DoubleBuffered=true
И в разным местах: онпаинт, онкриэйт...
Это одна и та же запись. Потому что все "события формы" - это методы класса TForm, в котором Form1 и играет роль this. Но this - это более универсальная запись, она не изменится при переименовании Form1 в какую-нибудь my_favorite_Form. Поэтому, более каноничен первый вариант.
И прописывать это надо лишь один раз, в конструкторе формы. Почему не работает - хз. Приведи код того фрагмента, где ты раскрашиваешь всё своим "чёрным прямоугольником" (кстати, нафига?)
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
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: 6183
|
Сложно сказать, но по виду - возможно, тормозит функция MakeColor16 и её вызов. Зачем там одни и те же касты выполняются дважды?
Да и само решение какое-то корявое - каждый пиксель менять. Хотя других я и не знаю.
Попробуй закомментить вызовы этой функции и посмотреть - меньше нагрузка стала?
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
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: 6183
|
packa, ну это же жуть! Плз, переформатируй свой код - читать же абсолютно невозможно. Я в Notepad++ открывал, есичо.
Да и зачем нам весь проект? Нужен лишь исходник, а ещё лучше - его фрагмент...
totkotoriy, ещё и в строчках типа *pOld = MakeColor16( GetRed (*pOld) + GetAlpha(*pNew)*(GetRed (New) - GetRed (*pOld))/256, тоже не помешало бы произвести замену на ro1, rn1 и иже с ними.
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
28.04.2012 16:21 |
|