>bin da zu allen schandtaten bereit, um dem verhalten entgegenzuwirken.
Da ich 99 Seconds auf meinem Notebook (98SE/933 Mhz) entwickelt habe und eine CPU Last von über 80% den kleinen Lüfter aktivieren würde, war ich eigentlich stets um eine möglichst geringe CPU Last bemüht. Diese könnte noch wesentlich geringer sein, wenn es nicht so (exotische) Computer, wie z.B. den meiner Partnerin gäbe. Dort führt nur ein synchronisierter Bildaufbau, also mit warten auf den Vertical Flip, zu einem flimmerfreien Bild. Auf meinem Rechner daheim und auf meinem Notebook (sowie auf vielen anderen Systemen) funktioniert auch der nicht synchronisierte Retrace sehr gut. Da ich aber 3 Meldungen über ein flimmerndes Bild bekommen habe, bleibt es erstmal beim synchronisierten Retrace.
Im Prinzip sieht eine Programmschleife so aus: Hintergrundgrafik auf den Backbuffer setzen Gerade benötigte Grafiken anzeigen Berechnungen und Abfragen Warten auf den Vertical Flip 60 x pro Sekunde eine bestimmte Zeit (zwischen 1 und 16 Millisekunden) an Windows übergeben
Da spielt es eigentlich keine Rolle, ob im Menü nur auf einen Mausclick gewartet wird, oder hunderte von Steinen bewegt werden. Der Knackpunkt ist der Zeitpunkt für das nächste Frame. Bei 60 FPS (Bildern in der Sekunde) bleibt dem Rechner also eine Zeit von (1000:60) 16,67 Millisekunden für ein Frame. Auf meinem "betagten" Notebook braucht 99 Seconds maximal 3-4 Millsekunden für all seine Aufgaben und Berechnungen. Die restlichen 12,67 Millisekunden würde es mit dem warten auf den Vertical Flip verbraten und eine CPU Last von 100% erzeugen, würde ich nicht eine bestimmte Zeit anderen Prozessen zur Verfügung stellen.
Der Standardwert dieser Zeitspanne beträgt 5 Millisekunden und wird erhöht, wenn 60 Bilder pro Sekunde dargestellt werden konnten, bzw erniedrigt wenn weniger als 55 Bilder erzeugt werden konnten. Auf meinem Notebook liegt dieser Wert zwischen 10 und 12 und ist natürlich auch abhängig von den anderen laufenden Prozessen auf dem System. Auf dem XP Rechner meiner Partnerin wird der Wert 5 fast nie überschritten, kein Wunder bei 50 Hintergrundprozessen.
Ich habe grad mal wieder mit dem Process-Explorer von Sysinternals getestet und komme auf eine Last von 50% im Screen-Modus sowie 35-55% im Fenstermodus. Allerdings ist mein Programm derzeit auch nicht für Vista & Co optimiert. Das wird vermutlich auch der Grund für deine hohe CPU Last sein. Bei mir läuft zwar eine Compilation mit Vista Optimierung, allerdings nur mit hoher CPU Last. Im Screen-Modus schafft er gerade mal 50 Bilder pro Sekunde, es bleibt also kaum Zeit für andere Prozesse. Im Fenstermodus sind die Werte noch schlechter, gerade mal 32 - 35 Bilder werden dort pro Sekunde erstellt. Bei mir verhält es sich also genau anders herum. Im Info-Bereich wird nun ja die aktuelle Uhrzeit angezeigt, ich kann die beiden Funktionen FPS: (Bilder pro Sekunde) sowie die Zeit, die Windows für seine Aufgaben zurück bekommt (DEL:) aus der Developer Anzeige neben der Uhrzeit anzeigen lassen. Aktiviert wird dies mit, sagen wir mal, <F10>.
Es wird bei der kommenden (offiziellen) Version 0.96 auch wieder eine Exe mit Optimierungen für XP, Vista & Co geben. Damit sollte deine "moderne" Hardware wesentlich besser laufen und ihre Zeit sinnvoller verwenden können. Da ich für den Jokerflash noch 2 neue Sounds erstellt habe, werde ich nachher das Testpaket aktualisieren und auch eine exe mit Vista Optimierung beifügen. Auch die neue, fast fertige, Spielanleitung lege ich zur Ansicht bei.
>cpu-auslastung bei ca 50% (fenstermodus) >fps:30 del:1
Also 30 Bilder pro Sekunde sind eindeutig zu wenig. Der Delay-Wert von 1 macht dies überdeutlich. Eigentlich müsste die CPU-Auslastung bei dir damit bei 100% liegen. Aber der Fenstermodus ist halt so eine Sache für sich. 99 Seconds sollte eigentlich mit 60 Bildern pro Sekunde laufen und versucht dies auch sicherzustellen.
Was für ein Notebook verwendest du denn eigentlich? Ist es auch schon etwas betagter, wie meins? Wieviele Prozesse laufen bei dir im Hintergrund und wieviel CPU-Last erzeugen sie?
Meiner Meinung nach ist deine Hardware für die Vista-optimierungen nicht geeignet. Aber Vorsicht! Eine Ferndiagnose mit so wenigen Informationen ist immer eine riskante Sache. Probiere doch auch einmal die "normale" Version aus und teile uns mit ob du damit die gewünschten 60 Bilder pro Sekunde erreichst.
es ist ein medion 96970 - wurde mit vista ausgeliefert und trägt auch einen designed for vista button :)
das es nur 50% sind schiebe ich auf hyperthreading bzw. dualcore - habe nicht genau geschaut, welche der virtuellen oder tatsächlichen cpu-kerne die auslastung brachten. kann dies aber gerne noch nachholen.
andere prg liefen zu dem zeitpunkt nicht - ausser die vielfältigen normalen diesnte, die jedoch nur eine max cpu-auslastung von 2-4% verursachen.
die "normale" version verhält sich ähnlich - genaue werte der fps/del muesste ich dann morgen mal nachgucken.
maybe eine version mit nicht synchronisiertem Retrace wäre hier besser? evtl. ist das ja auch ein problem mit bestimmten graka-treibern?
in dem zusammenhang wäre es evtl interessant, was andere so verwenden und wie dort die cpu-belastung aussieht.
>maybe eine version mit nicht synchronisiertem Retrace wäre hier besser? >evtl. ist das ja auch ein problem mit bestimmten graka-treibern? Ich habe sowohl im Notebook als auch im grossen Rechner ATI-Grafikkarten, da mir meine erste Nvidia nur Probleme bereitete. Aber das war im Jahre 2000 (oder so). Ich habe das mal mit dem nicht synchronisierten Retrace ausprobiert. Dabei konnte ich zu meiner Freude feststellen, das es völlig egal ist, 12 Millisekunden pro frame so, oder mit meiner bestdelay-Funktion zu übergeben.
ich finde das Game einfach genial, aber auch meine Notebooks mit XP gehen bei SingleCPU auf 100%, der DualCore auf 50%. Da fängt der Lüfter an zu laufen wie verrückt.
Vielleicht hast du ja die Möglichkeit durch drücken von <F10> mitzuteilen, wieviele Frames dein Notebook darstellt, und wie gross das Delay ist, das 60 mal pro Sekunde an Windows abgegeben wird.
(60 x ein Delay von z.B. 5 in der Sekunde kann keine 100% Last erzeugen) (welche CPU Last erzeugen bei dir denn "andere" Spiele?)
Es ist zwar nur ein Experiment, aber probieren sollten wir es ruhig mal. Ich habe gerade mal eine Version erstellt, die durch drücken von <V> vom synchronen Bildaufbau zum nicht-synchronen umschaltet (und zurück). Bitte <V> gedrückt halten um die FPS, das Delay und den Modus zu beobachten. FPS: 60 Del: 12/1 (/1=warten auf retrace /0=kein warten auf retrace)
ich habe die Version mit der "V" Taste getestet, im Vollbild komme ich mit meinem Toshiba P200 auf FPS: 26-28 /Del: 1/1 und FPS: 30-32 /Del: 1/0.
Die letzten 2 Testversionen laufen aber nicht so schön flüssig wie die 0.96. Die Steine fallen langsamer und ruckelnder.
Was mich interessieren würde, wie machst du das Delay? Welche Funktion benutzt du dafür? Ich programmiere selbst, zwar meist Programme für die serielle Schnittstelle aber ich kämpfe auch mit den Delays, insbesondere neuere Rechner mit anderen Timern ausgestattet sind, die sich ganz anders verhalten wie bei älteren Rechnern.
Das sind ja echt bescheidene Werte... 23 Bilder anstatt 60 ist echt zu wenig. Das ruckeln kann von der alten Konfiguration stammen, ich habe den Bildaufbau etwas geändert, drücke einfach mal die Tasten 1 bis 5 um die neuen Werte zu aktivieren.
sorry war mein Fehler, hatte ein Powerprofil eingestellt was eigentlich nur zum Download sein sollte, da läuft die CPU etwas langsamer
ich habe die Version mit der "V" Taste getestet, im Vollbild komme ich mit meinem Toshiba P200 auf FPS: 56-61 /Del: 5-6/1 und FPS: 56-73 /Del: 5-8/0. Im WindowMode sinds 2-3FPS weniger, die CPU Auslastung liegt bei 60-70% eines CPU Kerns (30-35% Systemlast) bei gestartetem Spiel ohne dass ein Stein bewegt wird
CPU: Intel Core2Duo T5550 1,83GHz Grafik: ATI Mobility Radeon HD 2600
Was mich interessieren würde, wie machst du das Delay? Welche Funktion benutzt du dafür? Ich programmiere selbst, zwar meist Programme für die serielle Schnittstelle aber ich kämpfe auch mit den Delays, insbesondere neuere Rechner mit anderen Timern ausgestattet sind, die sich ganz anders verhalten wie bei älteren Rechnern.
sodele hab das gerade auch mal getetstet. also ganz gleich ob mit warten auf flip oder ohne - die framerate sowie die cpu-belastung sind nahezu identisch. was mir noch aufgefallen ist - bei der nicht vista-compilerten version wird wohl am anfang das farbschema anders gesetzt - das meldet vista zumindest - nicht schlimm, aber halt auch net schön die meldung.
als graka ist hier im notebook eine nvidea geforce 9300MG verbaut und keine ati. könnte es da evtl unterschiede geben?
und nochwas - auf f10 hast du wohl iene pause gelegt oder? denn wenn f10 gedrückt wird, dann seh ich zwar das bild, aber die cpu-belastung geht auf nahezu 0 zurück :)
>also ganz gleich ob mit warten auf flip oder ohne - >die framerate sowie die cpu-belastung sind nahezu identisch. Das habe ich bei mir ja auch festgestellt.
>was mir noch aufgefallen ist - >bei der nicht vista-compilerten version wird wohl am anfang das farbschema anders gesetzt - >das meldet vista zumindest - nicht schlimm, aber halt auch net schön die meldung. Das könnte vielleicht der Grund für die CPU-Last sein! Auf meinem betagten Notebook laufen Spiele mit 16Bit Farbtiefe wesentlich geschmeidiger als in 32Bit Farbtiefe. Da du vermutlich den Desktop auf 32Bit gesetzt hast, wird folglich auch das Fenster in dieser Farbtiefe geöffnet. Da ich aber einen DirectX-Screen in 16Bit öffne und ihn als Fenster deklariere, muss vermutlich der gesamte Grafik-kram von 16 auf 32 Bit umgerechnet werden. Ich mache gleich mal eine Testversion die einen 32Bit-Screen öffnet, vielleicht bringt uns das ja weiter.
>als graka ist hier im notebook eine nvidea geforce 9300MG verbaut und keine ati. >könnte es da evtl unterschiede geben? Vermutlich tun die beiden sich heutzutage nicht viel, sonst wäre NVidia längst pleite.
>und nochwas - auf f10 hast du wohl iene pause gelegt oder? >denn wenn f10 gedrückt wird, dann seh ich zwar das bild, >aber die cpu-belastung geht auf nahezu 0 zurück :) Nein, daran ist wieder das wundervolle Windoofs schuld. Mir fiel, als ich mich (ausgerechnet) für <F10> entschieden hatte auch auf, das (nur im) Fensterbetrieb, das Programm bei drücken von F10 angehalten wird. Dieses Phänomen hatte ich ja bereits mit der <ALT>Taste entdeckt. Deshalb ist in der letzten Testversion die FPS Anzeige auch auf die <V>Taste verlegt worden. F10 werde ich sicherheitshalber auch mit der Pauseanzeige belegen, damit das Spiel nicht versehentlich lahmgelegt werden kann.
Achja, schnell noch was zur Bildwiederholung: Es ist bei Spielen eigentlich egal, ob sich etwas auf dem Bildschirm bewegt oder nicht. Trotzdem wird (bei mir z.B.) 60 mal der Bildschirm von neuem berechnet bzw. gezeichnet. Bewegung ändert lediglich die Position der Objekte auf dem Bildschirm.
>sorry war mein Fehler, hatte ein Powerprofil eingestellt was eigentlich nur zum Download >sein sollte, da läuft die CPU etwas langsamer Interessant.
>ich habe die Version mit der "V" Taste getestet, im Vollbild komme ich mit meinem >Toshiba P200 auf FPS: 56-61 /Del: 5-6/1 und FPS: 56-73 /Del: 5-8/0. >Im WindowMode sinds 2-3FPS weniger, die CPU Auslastung liegt bei 60-70% eines CPU Kerns >(30-35% Systemlast) bei gestartetem Spiel ohne dass ein Stein bewegt wird Auch wenn alle 256 Steine sich gleichzeitig bewegen würden, würde das nichts ändern. Ich finde diese Werte doch recht akzetabel. Scheinbar sind moderne Grakas zum reinen Anzeigen von Sprites nicht mehr so gut geeignet wie ältere. Dafür ist heutzutage ja auch alles in 3D. (wems gefällt)
>Was mich interessieren würde, wie machst du das Delay? >Welche Funktion benutzt du dafür? Ich programmiere selbst, >zwar meist Programme für die serielle Schnittstelle aber ich kämpfe auch mit den Delays, >insbesondere neuere Rechner mit anderen Timern ausgestattet sind, >die sich ganz anders verhalten wie bei älteren Rechnern. Also kämpfen muss ich mit den Delays nicht gerade, die funktionieren eigentlich ganz gut. Allerdings ist eher Windows meist das Problem.
Zuerst einmal, bekommt 99 Seconds eine etwas höhere Priorität. Jedes Programm bekommt, sofern es dies nicht ändert, die Priorität "normal" mit dem Kennwert 8. Das hat aber leider zur Folge, das es dadurch auch wie jedes andere behandelt wird. Für Anwendungen ist dies ja auch kein Problem, da spielt es keine Rolle ob die Daten ein par Milliseks später kommen als angefordert. Bei einem flüssigen Bildablauf in einem Spiel macht sich dies aber sehr deutlich als ruckeln bemerkbar. Daher setze ich die Priorität auf High mit dem Kennwert 13. (Realtime mit dem Wert 24 ist nicht notwendig)
Durch die höhere Priorität bekommt 99 Seconds (und alle anderen auf High eingestellten Prozesse) eben "vor" den "normalen" Prozessen seine Datenwünsche erfüllt. Zumindest "versucht" Windows das, so oft wie möglich zu gewährleisten.
Abhängig davon, ist allerdings auch die Qualität der im Rechner verbauten Zeitmesser, oder Timer. Oft sind sie im BIOS auf den Default-Wert 5 Millisekunden eingestellt. Windows übernimmt diese Einstellungen natürlich. Mit dem dir als Programmierer sicher bekannten Befehl; timeBeginPeriod_(_GT_DevCaps\wPeriodMin) wird der Timer nun auf den kleinstmöglichen Wert (Period Minimum) eingestellt. Meist hat man Glück, und kann dann auf die Millisekunde genaue Delays erreichen. Auf der Gurke meiner Freundin sind es leider nur 5 Millsekundensegmente.
Nach diesen zwei kleinen Vorbereitungen hat sich das Thema Delay eigentlich erledigt. Wenn alle Berechnungen erfolgt sind und man nur noch auf den Flip warten muss, kann man entweder die Wartezeit an Windows zurückgeben, via Delay_ oder Delay (), oder man verbrät die Zeit mit 200 000 000 Abfragen ob der DirectX-flip endlich erfolgt ist.
Ohne den Retrace käme ich hier, mit meinem Gurken-Notebook locker auf 200 FPS, was beweist, das 99 Seconds hier wirklich nur zwischen 4 und 5 Ms braucht. Allerdings wäre der Bildaufbau dann überhaupt nicht wahrnehmbar weil alles viel zu flott geht. Deshalb die Delay-Bremse, die 60 FPS zu gewährleisten versucht und den Lüfter auch nicht anspringen lässt, da Windows genug Zeit an den Idle-Prozess weiter reicht.
BTW: Du schreibst, dein Lüfter macht bereits bei 50% CPU Last einen Höllenlärm. Ich hoffe für dich, du machst keine Rechenintensiven Dinge auf dem Notebook.
Hast du die Möglichkeit die CPU in der Taktrate zu beeinflussen?
Mit meinem Notebook (von 2002) habe ich die Möglichkeit es "Batterie optimiert" zu betreiben. Dahinter steckt eigentlich nichts anderes, als die Tatsache, das die Taktrate 700 Mhz nicht übersteigt. Der Lüfter springt dadurch nicht an, da die CPU nicht heiss genug wird. Die Zweite mögliche Einstellung "Maximale Leistung" lässt es bis auf 933 Mhz hochtakten, was dann auch den Lüfter anspringen lässt. Mein Ziel war es natürlich, das Delay so hinzukriegen, das der Lüfter trotzdem nicht anspringt.