alle spiele auf jeden pc gleich schnell tut gesucht.

Previous topic - Next topic

x-tra

Hilfreich wäre ein total ausführliches schritt für schritt tut, das jeder versteht, da es doch eine grundlegende voraussetzung ist, dass die spiele die wir hier zu schreiben versuchen auf jeder kiste gleich schnell laufen.

könnte da jemand was tun?

Schranz0r

TUTORIAL:


Code (glbasic) Select
LIMITFPS 60


Effekt: Auf allen Kisten gleich schnell, da ja limitiert!
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

x-tra

ähm aber das sind doch nur die frames die limitiert werden.

wenn ich objekt xy von a nach b mittels irgendeiner berechnung wandern lasse, ist das doch rechnerleistungsabhängig, oder?

könnte also mit 60fps  mal schneller oder auch langsamer wandern.

oder versteh ich das jetzt falsch?

wenn ich mich irre, wäre das ja supertoll, weil ich mir dann um irgendwelche rechnerunterschiede keine gedanken mehr machen müsste.

ob nun 500Mhz oder 5000Mhz, ob onboard grafik, oder eine neue 9800(oder so)

Tenorm

Einfach statt nach jedem durchlauf erhöhen, mit timer machen:

Nicht:
x=x+1

Sondern

IF timer+50<GETTIMERALL()
     x=x+1
     timer=GETTIMERALL()
ENDIF

Gruß

Tenorm
     

BumbleBee

NEIN, nicht schon wieder. Diese Frage ist ab sofort verboten.  ;)

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Kitty Hello

Hehehe.
Du musst Die Figur halt immer um den Zeit-Wert verschieben, den Du seit dem letzen Showscreen hast:

Code (glbasic) Select

WHILE TRUE
   lasttime=time
   time = GETTIMERALL()
   dtime=time-lasttime
   x = x + dtime * 0.001
   PRINT "C", x, 0
   SHOWSCREEN
WEND


Tenorm

Is das nicht das gleiche wie ich geschrieben hab  :S

Kitty Hello

doch... stimmt.

Nur.. meins macht auch zwischenpixel, also wenn die Schrittweite >1 pixel ist, dann wirds bei mir weicher. Deins ist leichter zu verstehen und einzubauen.

WPShadow

Wäre es nich einfacher einen Befehl dafür in GLB rein zu packen?

Dann bleiben zumindest die Fragen im Forum 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

Schranz0r

WP:

Mach doch mal Funktionen, und stell die in das Codeschnipselforum :P
Dann kannst auch jeder benutzen, und wenns anklang findet, kann man ja über einen Implementierung reden :)
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

D2O

Hmmm, ich dachte ich hätte schon mal was in dieser richtung gepostet, kanns aber nicht mehr finden.

Ok, das kästchen braucht immer um die 6-7 sec um den Screen zu überqueren,egal wie schnell das Programm ist , die zeit angabe ist hier nicht so genau wegen den rundungsfehlern die es einfach gibt ;)


Code (glbasic) Select

// --------------------------------- //
// Project: time_move
// Start: Sunday, March 04, 2007
// IDE Version: 4.114


LIMITFPS -1 /// hier mal werte ändern,z.b. 60 oder  -1 = Vsync Off

WHILE TRUE
move = GETTIMER()
time = GETTIMERALL()
//-------------
IF (time - temp) > 1000
INC a1,1 // Secundenzähler
temp = time
ENDIF
//-------------


//-----------Das ist der interesante Teil
x = x +time_move(0.1,1) //<<<< Frameunabhängig bewegen, mal mit dem wert 0.05 rumspielen ;)


DRAWRECT x,100,10,10,RGB(0xff, 0xff, 0x00)
IF x > 640
x = 0 // X zurücksetzen
a2 = a1 // Für die zeitmessung
a1 = 0
ENDIF
//---------------------------------------


// Das ist nur für die ausgabe
PRINT getfps()+" Frames",10,100
PRINT move+" millisec." ,10,120
PRINT a2+" Secunden vergangen",10,140
SHOWSCREEN
WEND




FUNCTION getfps:

STATIC fps_time,fps_counter,fps,fps_temp
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

RETURN fps
ENDFUNCTION


// Function für Frameunabhängige bewegung
// l_multi = multiplikator
// l_on = 1 = on ansonsten immer off


FUNCTION time_move :l_multi,l_on

LOCAL l_on,l_out

LOCAL  temp AS Tmovetime

IF l_on = 1
temp.time = GETTIMER()
l_out = temp.time*l_multi
ELSE
l_out = 0
ENDIF

RETURN l_out
ENDFUNCTION

TYPE Tmovetime
time
ENDTYPE
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

x-tra

das hier müsste doch auch so ähnlich funktionieren, irgendwie tut es das zwar noch nicht, muss mal sehen, was ich übersehen habe.

Code (glbasic) Select
SUB UpdateMovement:

delta = time()
EntityRotate(juru, 0, jy*delta, 0)
EntityMove(juru, 0, 0, jz*delta)
EntityMove(juru,0,updown,0)
EntityRotate(stamm, 0, 0, 1*delta)
jy=0;jz=0
ENDSUB


FUNCTION  time:
Local delta
IF timer+50 < GETTIMERALL()
     delta = 1
  ELSE
     delta = 0
  ENDIF
timer = GETTIMERALL()
RETURN delta
ENDFUNCTION

Schranz0r

Versuchs mal so :

Code (glbasic) Select
FUNCTION Timer:
STATIC time
LOCAL delta

    IF time< GETTIMERALL()
        delta = 1
        time = GETTIMERALL()+50
    ENDIF
    RETURN delta
ENDFUNCTION
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

Heiko

sollte das funktionieren?
also ich dachte ja schon, aber irgendwie hauts nicht hin.
ich ruf diese funktion auf, und wenn delta als 1 zurückgegeben wird, lass ich eine variable deltazaehler um eins erhöhen und anzeigen.
bleibt aber immer irgendwie bei null......

ahhhh

Code (glbasic) Select
FUNCTION deltatimer:
STATIC time
LOCAL delta

    IF time< GETTIMERALL()
        delta = 1
        time = GETTIMERALL()+50
    ENDIF
   IF delta =1 THEN del=del+1
   PRINT del 60, 60
ENDFUNCTION


so würde es gehen, aber ich brauch ja den delta wert ausserhalb der funktion.
ahhh delta zu beginn auf global, oder zumindest das local rausnehmen

dann geht es, grins

Sebastian

GETTIMER und GETTIMERALL funktionieren wahrscheinlich NICHT, wenn du eine externe Renderengine verwendest.

Ansonsten würde ich das so machen (keine Garantie für syntaktische Richtigkeit, bin am iMac meiner Freundin ohne GLBasic):
Code (glbasic) Select
FUNCTION GiveDelta#:dFactor#=1.0
RETURN (GETTTIMER()/1000.0)*dFactor#
ENDFUNCTION


Die Funktion sollte bei jedem Aufruf einen Delta Wert ausgeben. Mit diesem Wert multipliziert man jetzt alle Rotationen, Bewegungen, etc. welche dann auf jedem PC gleich ablaufen sollten. Der Wert lässt sich modifizieren (für schnellere Bewegungen etc.) indem man der Funktion einen optionalen Parameter dFactor# übergibt. Der standard Wert ist 1.0 und steht für 100% Geschwindigkeit.