Speed bitte

Previous topic - Next topic

tft

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

D2O

4500 bei 28 fps
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Quentin

sieht ja chic aus ;), was wird das, wenns fertig ist?

Achja, bei mir 40 FPS und 9390 Quads, was immer das heißen mag.

tft

Hi ....

@Quentin was hast du für einen rechner?

das ist nur ein Test .... brauche ich um die maximale anzahl CopyObjeted zu ermitteln.

Quentin

Core Duo 1,86 hat mein Schlapptöpfchen, mit mäßiger Geforce 7600

tft

Hi ...

ist aber flott auf den Beinen.

Schranz0r

FPS: 26
Quads: 7530
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

tft

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

KidPaddle

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?
Intel CoreDuo 6300, GT 7950 512MB, 2 GB Ram, XP SP2
GP2X MK1, Firmware 2.0.0

D2O

4400 bei 30 fps
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

tft

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.

tft

Hi ..

FPS ist ja klar. Die anzahl Quad sind die sichtbaren und bewegten Quader. Blitz schafft etwa 75% dafon was GLBasic hinbekommt.

Quentin

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? ;)

tft

Hi ...

werde auch der Quad Master genannt. :-)

WPShadow

Also, bei mir:

9810 Quads bei 28 FPS...

Sieht aber super aus!
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est