خوب، من علت کندی رو پیدا کردم. موقعی که لپتاپ من به برقه از گرافیک با حالت High Performance GPU استفاده میکنه و موقعی که به برق نیست سویچ میکنه رو حالت Power Saving GPU البته از خودم میپرسه بعد سویچ میکنه. حالت High Performance قوی تر از اون یکیه که خوب از اسماشون واضحه ولی تو حالت ضعیف فایر مانکی سرعتش خوبه ولی تو حالت High Performance سرعتش کمه. و لابد از خصیصه ای می خواد استفاده کنه که حالت High Performance از اون پشتیبانی نمیکنه و در نتیجه برای اینکه برنامه از کار نیفته به شکل نرم افزاری شبیه سازی میکنه.
اما یونیت، تو یک پروژه با فایر مانکی فایل FMX.Types3D و همچنین D3DX9 رو به قسمت uses اضافه کن و دو تا Button روی فرم بگذار و دو تا دستور زیر رو به دکمه ها بده:
procedure TForm1.Button1Click(Sender: TObject);
var
m : TMatrix3D;
t0 : Double;
I: Integer;
s : string;
j: Integer;
begin
t0 := Now * 86400.0;
for I := 0 to 10000000 do
begin
m := Matrix3D(
0.9, 0.1, 0.1, 0.0,
0.1, 0.8, 0.2, 0.0,
0.3, 0.2, 0.79, 0.0,
10.05, 20.1, 30.4, 1.0);
InvertMatrix(m);
end;
t0 := Now * 86400.0 - t0;
for I := 0 to 3 do
begin
s := s + #13#10;
for j := 0 to 3 do
s := s + FloatToStr((PD3DXMATRIX(@m))^.m[i, j]) + ' ';
end;
ShowMessage('Time : ' + FloatToStr(t0) + #13#10#13#10'Matrix : ' + s);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
m : D3DXMATRIX;
t0 : Double;
I: Integer;
s : string;
j: Integer;
begin
t0 := Now * 86400.0;
for I := 0 to 10000000 do
begin
m := D3DXMATRIX.Create(
0.9, 0.1, 0.1, 0.0,
0.1, 0.8, 0.2, 0.0,
0.3, 0.2, 0.79, 0.0,
10.05, 20.1, 30.4, 1.0);
D3DXMatrixInverse(m, nil, m);
end;
t0 := Now * 86400.0 - t0;
for I := 0 to 3 do
begin
s := s + #13#10;
for j := 0 to 3 do
s := s + FloatToStr(m.m[i, j]) + ' ';
end;
ShowMessage('Time : ' + FloatToStr(t0) + #13#10#13#10'Matrix : ' + s);
end;
دکمه ی اول با Types3D و دکمه ی دوم با D3DX کار می کنه و بعد از فشردن هر دکمه زمان مقدار دهی اولیه به همراه معکوس کردن یک ماتریس، به تعداد شمارنده حلقه رو میبینید. مقایسه کنید. بیشتر از 5 برابر اختلافشونه. و اگه بخوایم با نامردی تمام مقایسه کنیم اون مقدار دهی اولیه رو هم می بریم بیرون از حلقه :
procedure TForm1.Button1Click(Sender: TObject);
var
m : TMatrix3D;
t0 : Double;
I: Integer;
s : string;
j: Integer;
begin
t0 := Now * 86400.0;
m := Matrix3D(
0.9, 0.1, 0.1, 0.0,
0.1, 0.8, 0.2, 0.0,
0.3, 0.2, 0.79, 0.0,
10.05, 20.1, 30.4, 1.0);
for I := 0 to 10000000 do
begin
InvertMatrix(m);
end;
t0 := Now * 86400.0 - t0;
for I := 0 to 3 do
begin
s := s + #13#10;
for j := 0 to 3 do
s := s + FloatToStr((PD3DXMATRIX(@m))^.m[i, j]) + ' ';
end;
ShowMessage('Time : ' + FloatToStr(t0) + #13#10#13#10'Matrix : ' + s);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
m : D3DXMATRIX;
t0 : Double;
I: Integer;
s : string;
j: Integer;
begin
t0 := Now * 86400.0;
m := D3DXMATRIX.Create(
0.9, 0.1, 0.1, 0.0,
0.1, 0.8, 0.2, 0.0,
0.3, 0.2, 0.79, 0.0,
10.05, 20.1, 30.4, 1.0);
for I := 0 to 10000000 do
begin
D3DXMatrixInverse(m, nil, m);
end;
t0 := Now * 86400.0 - t0;
for I := 0 to 3 do
begin
s := s + #13#10;
for j := 0 to 3 do
s := s + FloatToStr(m.m[i, j]) + ' ';
end;
ShowMessage('Time : ' + FloatToStr(t0) + #13#10#13#10'Matrix : ' + s);
end;
حالا اختلاف تا بیشتر از 7.5 برابر میرسه!
شاید این فقط برای مواقعی باشه که فایرمانکی می خواد در صورت نبودن پشتیبانی از طرف ست افزار، کار رو به شکل نرم افزاری شبیه سازی کنه. شایدم می خواد مستقل از dll هایی مثل d3dx باشه و کندیش رو بجون خریده.