GLBasic forum

Main forum => Beta Tests => Topic started by: tft on 2007-Aug-10

Title: Speed bitte
Post by: tft on 2007-Aug-10
Hallo ...

meine ersten versuche mit 3D in GLBasic. Um weitere Tests für die Object Optimierung zu machen. Wäre es gut wenn ihr den Code mal ausfürt und Postet wiefiel Quad und FPS bei euch rauskommt. Das Programm nähert sich an die 30 FPS grenze an und bleibt dann bei einer gewissen anzahl Quad stehen.

ich habe einen : P4 HT 2.8 GHz mit 2 GB Ram und Radeon X1600, macht 6480 Quad bei 28 FPS

Code: (glbasic) [Select]
// --------------------------------- //
// Project: First3D
// Start: Friday, August 10, 2007
// IDE Version: 4.254

LIMITFPS -1

donut  = 0
sphere = 1


// Donut machen
CreateCube(donut, 1, RGB(255,255,255))
// CreateTorus(donut, 12, 24, 12, 9, 2, 1)
// Kugel machen
CreateCube(sphere, 24, RGB(255,255,255))

LOCAL mx, my, b1, b2
fpse=0
fps=-1

WHILE TRUE
   // 3000 ist weit genug hier
   X_MAKE3D 1, 3000, 65

   // ein Winkel für alles
   phi = GETTIMERALL() / 150

   X_CAMERA 800,800,800, 0,0,0
   X_SPOT_LT  0, RGB(0,255,255), 0,0,0, -1,-1,-1, 180

   // Ringelreihen
   FOR i=0 TO kl1
      psi = phi + i/kl1*360
      px = SIN(psi)*300
      py = COS(psi)*300
      pz = (SIN(psi)+COS(psi)*2)*300
      // bewegen und bisserl drehen
      X_MOVEMENT px, py, pz
      X_ROTATION psi*40, 3,4,5

      // Jetzt relaitv zum Torus die Kugeln
      X_PUSHMATRIX
         FOR j=0 TO 29
            X_MOVEMENT SIN(j/29*360)*150, 0, COS(j/29*360)*150
            X_SCALING .3, .3, .3
            X_DRAWOBJ sphere, 0
         NEXT
      X_POPMATRIX
      X_DRAWOBJ donut,0
   NEXT
   
   fps_time = GETTIMERALL()
   fps_counter = fps_counter + 1
   IF (fps_time-fps_temp)>1000
      fps_temp = fps_time
      fps = fps_counter
      fps_counter = 0
   ENDIF
   
   X_MAKE2D
   
   PRINT fps+" Frames "+i*j+" Quads",10,100
   
   IF fps>30 AND fpse=0
    INC kl1,1
   ELSEIF fps>-1
    fpse=1
   ENDIF
   
   SHOWSCREEN
WEND



// ------------------------------------------------------------- //
// -=#  SPHERE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
   pi = ACOS(0)*2
   IF r < 0 THEN r = -r
   IF n < 4 THEN n = 4

   X_AUTONORMALS 2 // smooth edges
   X_OBJSTART num
   FOR j=0 TO INTEGER(n/2) -1
      theta1 = j * 2*pi / n - pi/2;
      theta2 = (j + 1) * 2*pi / n - pi/2;
      FOR i=0 TO n
         theta3 = i * 2*pi / n;
         X_OBJADDVERTEX   r*COS(theta2) * COS(theta3), r*SIN(theta2), _
                     r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
         X_OBJADDVERTEX   r*COS(theta1) * COS(theta3), r*SIN(theta1), _
                     r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION // n



// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
   // Diese Variablen sind als LOCAL definiert:
   // x, y,
   // Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

   X_AUTONORMALS 2
   X_OBJSTART num
   FOR di=0 TO NumWraps-1
      FOR j=0 TO NumPerWrap
         FOR i=di+1 TO di STEP -1
            wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
            wrapFracTex = j/NumPerWrap
            phi = 360*wrapFrac
            thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
            thetaFracTex = (i+wrapFracTex)/NumWraps
            theta = 360*thetaFrac
            r = MajorRadius + MinorRadius*COS(phi)
            x = SIN(theta)*r
            z = COS(theta)*r
            y = MinorRadius*SIN(phi)
            X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, _
                        RGB(255, 255, 255)
         NEXT
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION

// ------------------------------------------------------------- //
// -=#  CREATECUBE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
    // Diese Variablen sind als LOCAL definiert:
    // num, sz,
    sz=sz/2
    X_OBJSTART num
        // Front Face
        X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
        X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
        X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
        X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
        X_OBJNEWGROUP
        // Back Face
        X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
        X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
        X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
        X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
        X_OBJNEWGROUP
        // Top Face
        X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
        X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
        X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
        X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
        X_OBJNEWGROUP
        // Bottom Face
        X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
        X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
        X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
        X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
        X_OBJNEWGROUP
        // Right face
        X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
        X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
        X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
        X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
        X_OBJNEWGROUP
        // Left Face
        X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
        X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
        X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
        X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
        X_OBJNEWGROUP
    X_OBJEND

ENDFUNCTION // sz

// ------------------------------------------------------------- //
// -=#  CREATECYLINDER - also creates a cone if any radius = 0  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCylinder: num, baseRadius, topRadius, height, slices, stacks, col
LOCAL da, r, dr, dz, x, y, z, i, j
LOCAL x1, y1, x2, y2
    da = 360 / slices
    dr = (topRadius-baseRadius) / stacks
    dz = height / stacks
    X_OBJSTART num
    FOR i=0 TO slices-1
        x1 = COS(i*da)
        y1 = SIN(i*da)
        x2 = COS((i+1)*da)
        y2 = SIN((i+1)*da)
        z = 0
        r = baseRadius

        // Bottom lid
        IF baseRadius>0
            X_OBJADDVERTEX 0, 0, 0,  .5, .5, col
            X_OBJADDVERTEX x1*r, y1*r, 0, x1/2+.5, y1/2+.5, col
            X_OBJADDVERTEX x2*r, y2*r, 0, x2/2+.5, y2/2+.5, col
            X_OBJNEWGROUP
        ENDIF
        // side
        FOR j=0 TO stacks
            X_OBJADDVERTEX x2*r, y2*r, z, (i+1)/slices,  j/stacks, col
            X_OBJADDVERTEX x1*r, y1*r, z,  i   /slices,  j/stacks, col
            z = z+dz
            r = r+dr
        NEXT
        // Top lid
        IF topRadius>0
            X_OBJNEWGROUP
            X_OBJADDVERTEX x2*r, y2*r, height, x2/2+.5, y2/2+.5, col
            X_OBJADDVERTEX x1*r, y1*r, height, x1/2+.5, y1/2+.5, col
            X_OBJADDVERTEX 0, 0, height,  .5, .5, col
        ENDIF
        X_OBJNEWGROUP
    NEXT
    X_OBJEND
ENDFUNCTION
Title: Speed bitte
Post by: D2O on 2007-Aug-10
4500 bei 28 fps
Title: Speed bitte
Post by: Quentin on 2007-Aug-10
sieht ja chic aus ;), was wird das, wenns fertig ist?

Achja, bei mir 40 FPS und 9390 Quads, was immer das heißen mag.
Title: Speed bitte
Post by: tft on 2007-Aug-10
Hi ....

@Quentin was hast du für einen rechner?

das ist nur ein Test .... brauche ich um die maximale anzahl CopyObjeted zu ermitteln.
Title: Speed bitte
Post by: Quentin on 2007-Aug-10
Core Duo 1,86 hat mein Schlapptöpfchen, mit mäßiger Geforce 7600
Title: Speed bitte
Post by: tft on 2007-Aug-10
Hi ...

ist aber flott auf den Beinen.
Title: Speed bitte
Post by: Schranz0r on 2007-Aug-10
FPS: 26
Quads: 7530
Title: Speed bitte
Post by: tft on 2007-Aug-11
Hi ...

und jetzt das ganze noch etwas aufgepeppt. Alpha und so.

Code: (glbasic) [Select]
// --------------------------------- //
// Project: First3D
// Start: Friday, August 10, 2007
// IDE Version: 4.254

LIMITFPS -1

donut  = 0
sphere = 1

//LOADFONT "smalfont.bmp",1

// Donut machen
CreateCube(donut, 24, RGB(255,255,255))
// CreateTorus(donut, 12, 24, 12, 9, 2, 1)
// Kugel machen
CreateCube(sphere, 24, RGB(255,255,255))

LOCAL mx, my, b1, b2
fpse=0
fps=-1

DIM s[30]
DIM c[30]

FOR i =0 TO 29
s[i]=SIN(i/29*360)*150
c[i]=COS(i/29*360)*150
NEXT

WHILE TRUE
   // 1000 ist weit genug hier
   X_MAKE3D 1, 3000, 65

   // ein Winkel für alles
   phi = GETTIMERALL() / 650

   X_CAMERA 800,800,800, 0,0,0
   X_SPOT_LT  0, RGB(0,255,255), 0,0,0, -1,-1,-1, 180

   // Ringelreihen
   FOR i=0 TO kl1
      psi = phi + i/kl1*360
      px = SIN(psi)*300
      py = COS(psi)*300
      pz = (SIN(psi)+COS(psi)*2)*300
      // bewegen und bisserl drehen
      X_MOVEMENT px, py, pz
      X_ROTATION psi*40, 3,4,5

      // Jetzt relaitv zum Torus die Kugeln
      X_PUSHMATRIX
         FOR j=0 TO 29
            X_MOVEMENT s[j], 0, c[j]
            X_SCALING .3, .3, .3
            ALPHAMODE .1
            X_DRAWOBJ sphere, 0
         NEXT
      X_POPMATRIX
      X_DRAWOBJ donut,0
   NEXT

   fps_time = GETTIMERALL()
   fps_counter = fps_counter + 1
   IF (fps_time-fps_temp)>1000
      fps_temp = fps_time
      fps = fps_counter
      fps_counter = 0
   ENDIF

   X_MAKE2D

   PRINT fps+" Frames "+i*j+" Quads",10,100

   IF fps>30 AND fpse=0
    INC kl1,1
   ELSEIF fps>-1
    fpse=1
   ENDIF

   SHOWSCREEN
WEND

//END

// ------------------------------------------------------------- //
// -=#  SPHERE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
   pi = ACOS(0)*2
   IF r < 0 THEN r = -r
   IF n < 4 THEN n = 4

   X_AUTONORMALS 2 // smooth edges
   X_OBJSTART num
   FOR j=0 TO INTEGER(n/2) -1
      theta1 = j * 2*pi / n - pi/2;
      theta2 = (j + 1) * 2*pi / n - pi/2;
      FOR i=0 TO n
         theta3 = i * 2*pi / n;
         X_OBJADDVERTEX   r*COS(theta2) * COS(theta3), r*SIN(theta2), _
                     r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
         X_OBJADDVERTEX   r*COS(theta1) * COS(theta3), r*SIN(theta1), _
                     r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION // n



// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
   // Diese Variablen sind als LOCAL definiert:
   // x, y,
   // Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

   X_AUTONORMALS 2
   X_OBJSTART num
   FOR di=0 TO NumWraps-1
      FOR j=0 TO NumPerWrap
         FOR i=di+1 TO di STEP -1
            wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
            wrapFracTex = j/NumPerWrap
            phi = 360*wrapFrac
            thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
            thetaFracTex = (i+wrapFracTex)/NumWraps
            theta = 360*thetaFrac
            r = MajorRadius + MinorRadius*COS(phi)
            x = SIN(theta)*r
            z = COS(theta)*r
            y = MinorRadius*SIN(phi)
            X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, _
                        RGB(255, 255, 255)
         NEXT
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION

// ------------------------------------------------------------- //
// -=#  CREATECUBE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
    // Diese Variablen sind als LOCAL definiert:
    // num, sz,
    sz=sz/2
    X_OBJSTART num
        // Front Face
        X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
        X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
        X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
        X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
        X_OBJNEWGROUP
        // Back Face
        X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
        X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
        X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
        X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
        X_OBJNEWGROUP
        // Top Face
        X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
        X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
        X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
        X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
        X_OBJNEWGROUP
        // Bottom Face
        X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
        X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
        X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
        X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
        X_OBJNEWGROUP
        // Right face
        X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
        X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
        X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
        X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
        X_OBJNEWGROUP
        // Left Face
        X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
        X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
        X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
        X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
        X_OBJNEWGROUP
    X_OBJEND

ENDFUNCTION // sz

// ------------------------------------------------------------- //
// -=#  CREATECYLINDER - also creates a cone if any radius = 0  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCylinder: num, baseRadius, topRadius, height, slices, stacks, col
LOCAL da, r, dr, dz, x, y, z, i, j
LOCAL x1, y1, x2, y2
    da = 360 / slices
    dr = (topRadius-baseRadius) / stacks
    dz = height / stacks
    X_OBJSTART num
    FOR i=0 TO slices-1
        x1 = COS(i*da)
        y1 = SIN(i*da)
        x2 = COS((i+1)*da)
        y2 = SIN((i+1)*da)
        z = 0
        r = baseRadius

        // Bottom lid
        IF baseRadius>0
            X_OBJADDVERTEX 0, 0, 0,  .5, .5, col
            X_OBJADDVERTEX x1*r, y1*r, 0, x1/2+.5, y1/2+.5, col
            X_OBJADDVERTEX x2*r, y2*r, 0, x2/2+.5, y2/2+.5, col
            X_OBJNEWGROUP
        ENDIF
        // side
        FOR j=0 TO stacks
            X_OBJADDVERTEX x2*r, y2*r, z, (i+1)/slices,  j/stacks, col
            X_OBJADDVERTEX x1*r, y1*r, z,  i   /slices,  j/stacks, col
            z = z+dz
            r = r+dr
        NEXT
        // Top lid
        IF topRadius>0
            X_OBJNEWGROUP
            X_OBJADDVERTEX x2*r, y2*r, height, x2/2+.5, y2/2+.5, col
            X_OBJADDVERTEX x1*r, y1*r, height, x1/2+.5, y1/2+.5, col
            X_OBJADDVERTEX 0, 0, height,  .5, .5, col
        ENDIF
        X_OBJNEWGROUP
    NEXT
    X_OBJEND
ENDFUNCTION
Title: Speed bitte
Post by: KidPaddle on 2007-Aug-11
Bei beiden Mehtoden, 24 FPS und 2500. Eine Auslastung von knapp 35% auf beide Prozessoren.
Rechner: Intel E6300, 1.86 GHz, 2 GB Ram, NVIDA 7950 GT, 512 MB Ram
OS: Windows XP Home

Wieso ist meine Kiste so langsam?
Title: Speed bitte
Post by: D2O on 2007-Aug-11
4400 bei 30 fps
Title: Speed bitte
Post by: tft on 2007-Aug-11
Hi ....

das mit den unterschiedlichen geschwindigkeiten ist zum teile eine alte Windows Macke. Ich kann manchmal nur durch setzten eines zusätzlichen Zeichens im Quellcode die geschwindigkeit um 30-40% erhöhen. Ich weis nicht wie das zusammen hängt.
In ASM war es so, das es sich dabei um das problem der ungraden und graden Speicheradressen und des Programm anfangs handelte. Aber moderne Rechner sollten imme auf `4 Adressen den Code ablegen. Auch der Compiller solte darauf achten das einsprungadressen auf `4 erweitert werden, und gegebenenfala füll bytes in form von NOP anweisungen einschieben.
Warum jetzt der DualCore so langsam ist. Kann am Shared Ram liegen, wenn es sich dabei um einen Laptop handelt. Es gibt welche die haben 64 MB eigenens Ram und können mit bis zu 256 MB Shared zusätzlich anfordern. Das ist dann aber ein Nadelöhr.
Title: Speed bitte
Post by: tft on 2007-Aug-11
Hi ..

FPS ist ja klar. Die anzahl Quad sind die sichtbaren und bewegten Quader. Blitz schafft etwa 75% dafon was GLBasic hinbekommt.
Title: Speed bitte
Post by: Quentin on 2007-Aug-11
mit der neuen Version 30 FPS bei 11610 quads

sieht klasse aus. das Gebilde erinnert mich ein wenig an die Jahreshauptversammlung aller Borg-Kuben ;)

@Kidpaddle
das ist in der Tat seltsam. Gleicher Proz und du hast mehr RAM und eine bessere Graka. Bist du sicher, daß nicht einer der Proze bei der Bahn-Gewerkschaft ist? ;)
Title: Speed bitte
Post by: tft on 2007-Aug-12
Hi ...

werde auch der Quad Master genannt. :-)
Title: Speed bitte
Post by: WPShadow on 2007-Aug-19
Also, bei mir:

9810 Quads bei 28 FPS...

Sieht aber super aus!
Title: Speed bitte
Post by: x-tra on 2007-Sep-02
21 und 2130 quads

naja is auch nur ne Geforce 7300LE 50% CPU Auslastung bei einem X2 4600+