nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 29 Mar 2024 08:45



Reply to topic  [ 27 posts ]  Go to page Previous  1, 2
SDL 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Post 
HardWareMan wrote:
У него он вообще трехмерный.


Я и говорю - два умножения ;)
Трижды :)

_________________
:dj: https://mastodon.social/@Shaos


06 Dec 2008 01:53
Profile WWW
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Массив у мну такой:
Code:
colorbuffer: array [0..leng,0..640,0..480] of color;

где
Code:
type
color = record
  red,green,blue:uint8;

А пепеременные у мну
Code:
 r,coeff1,coeff2,coeff3,coeff4,coeff5,coeff6,qx,qy,fi: extended;
 
:kruto:

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


Last edited by cr0acker on 06 Dec 2008 05:36, edited 1 time in total.



06 Dec 2008 05:33
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
HardWareMan wrote:
PS Если работать напрямую с фреймбуфером видеокарты в VESA режиме, то объединение буфера более чем логично. Не знаю за оконную систему Х-ов.

Имхо спорный вопрос, так низзя про многоплатформенность.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


06 Dec 2008 05:35
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Shaos wrote:

1) fi*j посчитать один раз, а не 4

До 18,43, после 17,70.
Quote:
не считать Coeff2*Sin(Coeff3*fi*i) внутри цикла по j - оно всё равно меняться не будет, если i не меняется

17.56

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


06 Dec 2008 05:49
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
cr0acker wrote:
Shaos wrote:

1) fi*j посчитать один раз, а не 4

До 18,43, после 17,70.
Quote:
не считать Coeff2*Sin(Coeff3*fi*i) внутри цикла по j - оно всё равно меняться не будет, если i не меняется

17.56

Чото я не догоняю. fi у тебя вроде не меняется, так почему fi*i у тебя постоянно разные? Их кстати можно 2 раза вынести за цикл
Code:
     for i:=0 to pred(480) do begin
      ext:=fi*i;   
      for j:=0 to pred(640) do begin
        qx := r *(Sin(ext*j/Coeff1)-Coeff2*Sin(Coeff3*ext));
        qy := r *(Sin(ext*j/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;

Тип ext'а нужный задай.


06 Dec 2008 12:15
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
HardWareMan wrote:
Тип ext'а нужный задай.

17,4
Code:
for i:=0 to pred(480) do begin
       uno:=coeff2*Sin(Coeff3*fi*i);
       fii:=fi*i;
      for j:=0 to pred(640) do begin
        fiji:=fii*j;
        qx := r *(Sin(fiji/Coeff1)-uno);
        qy := r *(Sin(fiji/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


06 Dec 2008 14:22
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Попробую я тепереь целочисленные табличные синусы, так как разворачивать массив мне пока не хочется, так как для поворта, формат его размерности меняется исходя из центра повората, я конечно понимаю что можно всё и одномерным но блин, сложновато будет для восприятия.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


06 Dec 2008 14:29
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Post 
cr0acker wrote:
HardWareMan wrote:
Тип ext'а нужный задай.

17,4
Code:
for i:=0 to pred(480) do begin
       uno:=coeff2*Sin(Coeff3*fi*i);
       fii:=fi*i;
      for j:=0 to pred(640) do begin
        fiji:=fii*j;
        qx := r *(Sin(fiji/Coeff1)-uno);
        qy := r *(Sin(fiji/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;


17.4 - это ты в чём меряешь и что?

Ещё можно Coeff6*fi посчитать снаружи циклов и ColorBuffer[x,j,i] брать один раз как указтель и Red,Green,Blue присваивать по указателю - будет чуть быстрее

_________________
:dj: https://mastodon.social/@Shaos


06 Dec 2008 22:57
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Post 
cr0acker wrote:
Попробую я тепереь целочисленные табличные синусы, так как разворачивать массив мне пока не хочется, так как для поворта, формат его размерности меняется исходя из центра повората, я конечно понимаю что можно всё и одномерным но блин, сложновато будет для восприятия.


Можешь для начала плавающий табличный синус попробовать

_________________
:dj: https://mastodon.social/@Shaos


06 Dec 2008 23:05
Profile WWW
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Shaos wrote:
cr0acker wrote:
HardWareMan wrote:
Тип ext'а нужный задай.

17,4
Code:
for i:=0 to pred(480) do begin
       uno:=coeff2*Sin(Coeff3*fi*i);
       fii:=fi*i;
      for j:=0 to pred(640) do begin
        fiji:=fii*j;
        qx := r *(Sin(fiji/Coeff1)-uno);
        qy := r *(Sin(fiji/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;


17.4 - это ты в чём меряешь и что?


В секундах, это время работы ста циклов по X.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


07 Dec 2008 02:07
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Нашел такую старинную либу, адаптировал для ФПЦ:
Code:
UNIT FastTrig;

(*******************************************************************
  Modified for FreePascal by cr0acker^NedoPC team, cr0acker(at)mail.ru

  Turbo-Pascal Unit for super fast trigonometric functions.
  (c) copyright 1990,91 by Klaus Hartnegg,  www.klaus-hartnegg.de
   Free for non-commercial use.

  SuperFastSin determines function value by lookup in tables (arrays)
  that get initialized on the first call to the function or by a
  explicit call to the initialization procedure.

  Accuracy is a function of memory that you allow to be used
  for the table.

  FastSin is 5 times faster than Turbo's sin.
  SuperFastSin is even 9.5 times faster but less accurate.
  (times measured with FTRIGDEM on a 25 MHz 80386)

  SuperFastSin simply looks up the nearest value in a table.
  FastSin uses taylor series of first order around 0.

x***********************************************************************)


INTERFACE

type
  FPtr_1r_1r = function (x:real) : real;

var
  FastSin, SuperFastSin : FPtr_1r_1r;

{ the variable FastSin behaves like
Function FastSin          (x : real) : real; }

Function FastCos          (x : real) : real;
Function SuperFastCos     (x : real) : real;
Function FastTan          (x : real) : real;
Function FastCot          (x : real) : real;

Procedure Init;
{ this initialization will be called automatically upon the first
  use of one of the functions but can be called explicitely to prevent
  unexpected delay in the middle of your program. }


IMPLEMENTATION


const
  Resolution = 256;
  pi         = 3.1415926535897932385;
  Step       = pi / resolution;


var
  Sinus       : array[0..Resolution] of real;
  EndOfTaylor : integer;



const
  initialized : boolean = false;



Function FastSin1 (x : real) : real;
var i  : integer;
    s  : real;
    negativ : boolean;
begin
  negativ := (x < 0);
  s := abs (x * (Resolution / pi));
  i := trunc (s);
  if odd(i div Resolution) then negativ := not negativ;
  i := i mod Resolution;

  if ((i <= EndOfTaylor) or (i >= Resolution - EndOfTaylor))
{  and (abs (frac(s) - 0.5) > 0.25) } then begin
     x := abs (pi * frac (x / pi));
     if x > pi/2 then x := abs(pi - x);
     if negativ then FastSin1 := -X else FastSin1 := X;
  end
  else if negativ then FastSin1 := - Sinus[i]
  else Fastsin1 := Sinus[i];
end;



Function SuperFastSin1 (x : real) : real;
var i  : integer;
    s  : real;
    negativ : boolean;
begin
  i := trunc (x * ( Resolution / pi) );
  negativ := false;
  if i < 0 then begin
     negativ := true;
     i := -i;
  end;
  i := i mod (2 * Resolution);

  if i > Resolution then begin
     negativ := not negativ;
     i := i - Resolution;
  end;
  if negativ then SuperFastSin1 := - Sinus[i]
  else SuperFastSin1 := Sinus[i];
end;



Function FastCos (x:real) : real;
begin
  Fastcos := Fastsin (x + pi/2);
end;


Function SuperFastCos (x:real) : real;
begin
  SuperFastcos := SuperFastsin (x + pi/2);
end;


Function FastTan (x:real) : real;
begin
  FastTan := FastSin(x) / FastCos(x);
end;


Function FastCot (x:real) : real;
begin
  FastCot := FastCos(x) / FastSin(x);
end;



Procedure Init;
var x : real;
    i : integer;
begin
  if FastSin = @FastSin1 then exit; { is already installed }

  x := Step / 2;
  for i := 0 to Resolution do begin
     Sinus[i] := sin (x);
     x := x + Step;
  end;

  EndOfTaylor := 0;
  x := Step / 2;
  while abs( x - sin(x)) < Step / 2 do begin
     inc (EndOfTaylor);
     x := x + Step;
  end;
  dec (EndOfTaylor,2);

  FastSin := @FastSin1;
  SuperFastSin := @SuperFastSin1;
end;



Function FastSin_Init (x:real) : real;
begin
  Init;
  FastSin_Init := FastSin(x);
end;


Function SuperFastSin_Init (x:real) : real;
begin
  Init;
  SuperFastSin_Init := SuperFastSin(x);
end;



BEGIN
  FastSin := @FastSin_Init;
  SuperFastSin := @SuperFastSin_init;
END.



Он почти в два раза медленнее чем стандартные функции. Похоже придется отказаться от мультиплатофрменности и сделать FPCшные байндинги для http://gruntthepeon.free.fr/ssemath/

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


11 Dec 2008 11:15
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
cr0acker wrote:
Нашел такую старинную либу, адаптировал для ФПЦ:

Он почти в два раза медленнее чем стандартные функции. Похоже придется отказаться от мультиплатофрменности и сделать FPCшные байндинги для http://gruntthepeon.free.fr/ssemath/

Да ты посмотри на SuperFastSin1 и FastSin1, тут работы по оптимизации непочатый край. И это называется суперфаст. Я понимаю, что во времена внешнего FPU это было быстрее, чем занос чисел в стек, вычисление и забор результата, но сейчас FPU внутри проца, соответственно время тратится только на вычисление. Дерзай, из этого модуля можно кое-что выжать. ;)


11 Dec 2008 20:03
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 27 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 18 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.