Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : XBox timting


HellHorse
2004-02-09, 20:56:13
Ich weiss nicht recht wo das hin passt, also poste ich es mal hier.
Zudem passt das in einen XBox Next-Speku Thread, aber ich habe den gerade nicht gefunden.

Einleitung:
Es gibt ein Ding, das sich DreamX nennt. Ist mehr oder weniger eine XBox mit Mod Chip, 128 MB RAM und deinem Tualation 1400.

Zurück zum Thema.
In besagtem Thread ging es u.a um die Kompatibilität zur XBox und darum, sicherzustellen, dass die alten XBox games auf der neuen XBox mit der korrekten Geschwindigkeit lauffen.
Die Meinung damals war, dass es wohl kein Problem sein wird, da wohl auf Betreibssystemfunktionalität zugegriffen wird, wie Zeit messen, die vergangen ist, Welt entsprechend updaten oder Thread für ein paar ms schlafen legen. Es ist schwer vorstellbar, dass ein Timing darauf aufbauen würde, dass der Prozessor eine vorgegebene Geschwindikeit hat und dann einfach ein paar noop's gemacht werden.
Nun offenbar machen genau das doch einige Spiele.

http://firingsquad.com/hardware/friendtech_dreamx_xbox/page5.asp

Unfortunately, our trials with FIFA 2004, Spawn: Armageddon, Splinter Cell, and Robotech all showed excessive gameplay speed.

Interessant ist, dass das runtertakten in diesen Fällen auch nichts bringt.

zeckensack
2004-02-09, 21:02:28
Wofür Windows-Funktionen? :)
;*** rdtsc - read 64 bit time stamp counter
;prototype:
;void x86_get_timestamp(x86_timestamp* target)
_x86_get_timestamp:
PUSH EAX
PUSH EDX
PUSH EDI
MOV EDI,[ESP+16] ;get pointer to target
RDTSC ;read timestamp to EDX:EAX
MOV [EDI],EAX ;store low 32 bits
MOV [EDI+4],EDX ;store high 32 bits
POP EDI
POP EDX
POP EAX
RETN

;*** subtract timestamps (64 bit unsigned integers) and return difference as double
;protoype:
;double x86_subtract_timestamps(x86_timestamp* newer,x86_timestamp* older)
_x86_subtract_timestamps:
PUSH EAX
PUSH EDX
PUSH ESI
MOV ESI,[ESP+16]
MOV EAX,[ESI]
MOV EDX,[ESI+4]
MOV ESI,[ESP+20]
SUB ESP,8 ;allocate stack space for temporary
SUB EAX,[ESI]
SBB EDX,[ESI+4]
MOV [ESP],EAX ;store (integer) on stack
MOV [ESP+4],EDX
FILD qword [ESP] ;convert to double
ADD ESP,8 ;clean stack
POP ESI
POP EDX
POP EAX
RETN ;ST(0) contains the result


void
AbsTimer::reset()
{
//replace starting timestamp
x86_get_timestamp(&first_ts);
}

double
AbsTimer::elapsed_seconds()
{
//get current timestamp, diff against starting timestamp and scale
x86_timestamp ts;
x86_get_timestamp(&ts);
return(scale*x86_subtract_timestamps(&ts,&first_ts));
}
Der Skalierungsfaktor ist eine konstante, die nur von der CPU-Taktfrequenz abhängt ...

Coda
2004-02-09, 21:24:21
Ja, aber wenn man rdtsc benützt und zusätzlich von einer konstanten Taktrate ausgeht (also 700Mhz) dann war's das mit der Taktunabhängigkeit ;D

Allerdings verstehe ich nicht, warum das heruntertakten nichts gebracht hat

zeckensack
2004-02-09, 22:40:05
Original geschrieben von Coda
Ja, aber wenn man rdtsc benützt und zusätzlich von einer konstanten Taktrate ausgeht (also 700Mhz) dann war's das mit der Taktunabhängigkeit ;DEben. Auf einem PC muss man diese Konstante einmal durch ausmessen der Taktfrequenz auf den passenden Wert setzen. Versagt natürlich völlig bei Mobil-CPUs mit dynamischem Takt :D
Auf der XBox braucht man nicht zu messen, und die Taktrate ist garantiert nicht dynamisch. Und RDTSC ist sowohl schneller als auch präziser als QueryPerformanceCounter.
Allerdings verstehe ich nicht, warum das heruntertakten nichts gebracht hat Tja ... :kratz2:

FeuerHoden
2004-02-10, 11:52:06
Könnte evt. daran liegen dass es sich um einen Tualatin und keinen (aufgewerteten) Celeron handelt.

Coda
2004-02-11, 10:27:01
Ne, eben nicht, weil der TSC unabhängig von der Ausführungsgeschwindigkeit der Einheiten ist.
Das Ding wird pro Takt um eins erhöht, völlig unabhängig von allem anderen und ist somit ne prima Uhr, wenn man die Taktrate kennt

Ob das jetzt nen 8086 mit 700Mhz oder nen Itanium 2 mit 700Mhz wäre ist egal ;)

ilPatrino
2004-02-11, 12:16:07
ja, aber wer sagt, daß sie auch den time stamp benutzt haben? vielleicht haben sie das game einfach so gecodet, daß es genau auf dieser config (733er? sellerie) in der vorgesehenen geschwindigkeit läuft? dann kann z. b. ein größerer cache das ganze schön durchrühren...

ich gebe zu, daß das obige ziemlicher schwachsinn (sowohl von der idee als auch der ausführung) wäre, wenn da nicht einige indizien wären...