Mehrkernprozessoren und Spiele
-
Hallo,
vor ein paar Tagen probiert ich einen 2D Shooter, den ich mal programmiert hatte, auf einem System mit einem Vierkernprozessor aus. Immer wenn die Gegner getroffen werden erzeuge ich ein paar Partikel die den Aufschlag der Projektile optisch aufwerten sollen.
Auf einem 3Ghz Rechner mit einem Kern hatte ich keine Probleme, auf einem Laptop mit 1,7Ghz und OnBoard Grafik keine probleme mit einem Zweikernprozessor keine Probleme. Und jetzt auf einem Vierkernprozessor fängt das Spiel an zu ruckeln, immer wenn diese Partikel erzeugt werden.
Müsste es nicht so sein das ein Vierkernprozessor das leichter haben sollte solche Partikel zu erzeugen und zu animieren?
PS: Das Spiel wurde damals mit DirectX 7 und C/C++ programmiert.
-
[Vermutung]
Soweit ich das mitbekommen habe, kann es sogar schon bei einem Dualcore-Rechner zu Schwierigkeiten kommen. Das hängt immer damit zusammen, ob die Software selber auf die 2 oder 4 Kerne "zugreifen" muss oder ob das schon vom System her so geregelt ist. Im Klartext könnte das für den 4-Kern-Prozessor heißen, dass immer nur ein Kern verwendet wird, da dass System dies nicht regelt und die Software sicher auch nicht.
[/Vermutung]
Hab das mal gelesen (da bezog sich das aber nur auf dual-core und dass man das evtl. gar nicht voll ausschöpfen könnte) und bin mir daher nicht ganz sicher.
-
Benutzt Du denn Threads und wenn ja wofuer?
-
Wenn das Programm nicht mehrere Threats benutzt (und somit parallel arbeitet) wird nur ein Kern des Prozessors benutzt. Und wenn es nicht eine sehr teure 4-CPU ist, sind die einzelnen Kerne langsammer als bei einem billigen einzel oder doppelkern.
Ich würde sagen 4 fach kerne sind heutzutage für Spiele nahezu unbrauchbar. Weil sie im Verhältnis gesehen sehr teuer sind, die einzelnen kerne oft langsammer arbeiten (außer bei den extrem teuren modellen) und nahezu kein Spiel mehr als 2 kerne benutze.
(Sie werden trotzdem verkauft weil es sich auf der Verpackung eben besser ließt, dass ein 4 fach anstatt ein 2 fach Prozessor drin ist, egal ob es sinvoll ist oder nicht)Es kann aber auch andere Gründe haben:
1. anderes Windows als bei früheren Tests?
2. andere Grafikkarte deren Treiber nicht mehr so gut auf Direkt X 7 optimiert sind?
3. Hardwarekonflikte ?
4. Stromsparmodus ?
5. Bundestrojaner
?
6. Laut auf Microsoft geschimpft mit angelassenem Mikrofon
?
-
wieviele particle sind es?
wieviel fps hast du auf den jeweiligen systemen?
welche graka und welche aufloesung hast du?
wie nimmst du die zeit?
-
Die Anzahl der Partikel pro Treffer sind etwa so 15 Stück. Doch im Spiel kann es schon mal heftig zugehen. Dann müssen für jeden Treffer Partikel aktiviert werden. Das können schon mal ein paar Hundert sein. Die Auflösung ist festgelegt auf 800x600x32Bit. Das Problem liegt nicht an der Grafikkarte. Ich vermute schon das es am Prozessor liegt. Das Spiel selber verwendet drei Threads. Eine für Windows die andere das Spiel/Engine und das Spiel selber noch einen für das Laden des nächsten Levels. Aber wie gesagt das Problem kommt nur wenn die Partikel aktiv sind. Schalte ich die Partikel ab läuft das Spiel ohne Probleme und ruckeln. Die FPS habe ich jetzt nicht gemessen, aber man sieht ja das es ruckelt.
Gibt es allgemeine Regeln was man beim Spieleprogrammieren für Mehrkernprozessoren beachten sollte. Kennt ihr sowas?
-
Na ja, deine ganzen Berechnungen laufen also alle im gleichen Thread. Damit auch alle auf dem gleichen Kern. Und wenn ein einzelner Kern im 4-Kern-Prozessor langsamer ist als ein einzelner im 2-Kern-System und der wiederum langsamer als die Singlecore-CPU, dann laueft das Spiel nunmal auf dem 4-core-System am langsamsten. Wenn du die Last nicht auf mehrere CPUs aufteilst, wirst du immer nur einen Kern benutzen.
Du koenntest die Berechnungen auf mehrere Cores aufteilen, wenn du Mehrkernsysteme ausnutzen willst. Das ist aber im Allgemeinen nicht ganz trivial.
-
naja, oder da geht etwas komplett schief. ein paar hundert particle duerften ein system nicht zum rueckeln bringen, jedenfalls nicht wegen der cpu.
-
rapso schrieb:
naja, oder da geht etwas komplett schief. ein paar hundert particle duerften ein system nicht zum rueckeln bringen, jedenfalls nicht wegen der cpu.
Eigentlich nicht. Könnte es sein, dass du Probleme mit dem Prozessor-Cache bekommst? Wie groß ist der auf dem Prozessor? Teilen sich alle Kerne einen Cache? Es könnte sein, dass auf dem 4-Kern, die einzelnen Threads, sich gegenseitig den Cache kaputt hauen... Aber das ist nur eine Vermutung.
-
Blue-Tiger schrieb:
Und wenn ein einzelner Kern im 4-Kern-Prozessor langsamer ist als ein einzelner im 2-Kern-System und der wiederum langsamer als die Singlecore-CPU, dann laueft das Spiel nunmal auf dem 4-core-System am langsamsten.
Auf einem Laptop mit einem 1.7GHz Pentium läuft es flüssiger als auf einem 2*2.4GHz Pentium.
Blue-Tiger schrieb:
Du koenntest die Berechnungen auf mehrere Cores aufteilen, wenn du Mehrkernsysteme ausnutzen willst. Das ist aber im Allgemeinen nicht ganz trivial.
Wenn man in einem Spiel zwei Threads oder mehr hat. Werden diese nicht automatisch auf die Keren aufgeteilt, wenn man mehrere Kerne zu verfügung hat?
-
rapso schrieb:
naja, oder da geht etwas komplett schief. ein paar hundert particle duerften ein system nicht zum rueckeln bringen, jedenfalls nicht wegen der cpu.
Vor allem weil ja noch mehr los ist. Die Explosionen stören nicht und auch nicht die Gegner, aber diese Partikel. Ich bin gerade dabei mich durch den Code zu arbeiten. Seltsam das es erst auf einem Vierkernprozessor aufällt.
-
Netzwerk-Latenz schrieb:
Blue-Tiger schrieb:
Und wenn ein einzelner Kern im 4-Kern-Prozessor langsamer ist als ein einzelner im 2-Kern-System und der wiederum langsamer als die Singlecore-CPU, dann laueft das Spiel nunmal auf dem 4-core-System am langsamsten.
Auf einem Laptop mit einem 1.7GHz Pentium läuft es flüssiger als auf einem 2*2.4GHz Pentium.
hast du am Anfang nicht von einem 3 GHz Singlecore gesprochen?
Blue-Tiger schrieb:
Du koenntest die Berechnungen auf mehrere Cores aufteilen, wenn du Mehrkernsysteme ausnutzen willst. Das ist aber im Allgemeinen nicht ganz trivial.
Wenn man in einem Spiel zwei Threads oder mehr hat. Werden diese nicht automatisch auf die Keren aufgeteilt, wenn man mehrere Kerne zu verfügung hat?
Doch, normalerweise schon. Aber so wie ich deine Erklaerung verstanden hab sind die eigentlichen Berechnungen alle im gleichen Thread, oder?
-
Was sagt denn die Auslastung während dem Erzeugen dieser Partikeleffekte? Interessant wäre auch, für deinen Prozess einfach nur einen Kern freizugeben (
SetProcessAffinityMask). Durchaus möglich, dass hier die Kommunikation und Synchronisation diversen Kerne einiges ausbremst. Intels Pseudo Quadcores sind diesbezüglich eher suboptimal, da das teilweise über den lahmen FSB erfolgt und nicht komplett über den Cache. Mit welchen Prozessoren hast du denn getestet?
-
Getestet mit
Einkern
1.7 GHz Grafik: OnBoard
3.06 GHz Grafik: Radeon 9600Zweikern
Pentium E6750 Grafik: Geforce ????Vierkern
4*2.4 GHz Grafik: Geforce 8800Wie gesagt Probleme gibt es nur mit dem Vierkern. Ich habe jetzt den Prozess auch mal nur auf einen Prozessor beschrängt. Das Problem bleibt.

Ich hasse solche Probleme

Trotzdem danke ich euch fürs durchlesen. Sollte einem noch was einfallen raus damit. cu
-
alles auf einen core zu binden bringt nicht viel, der cache wird trotzdem zerschossen und alle synchronisationsprobleme koennen auch auftreten. besser ist es das ganze mal als ein thread laufen zu lassen und zu schauen.
zudem kannst du ja auch mal versuchen eine testumgebung nur mit dem particlesystem aufzusetzen und das verhalten zu reproduzieren und mit z.b. AMD Codeanalyst zu profilen.
desweiteren kann das ganze auch komplett andere gruende haben als die cpu. wenn nicht das rendering, dann z.b. den sound. manche sind so heldenhaft und spiele pro explosion nen sound ab, das kann der tod sein.

ich hoffe du sagst uns bescheid wenn du den fehler findest, gerade multicore programme gut zu machen scheint vielen probleme zu bereiten.
-
rapso schrieb:
desweiteren kann das ganze auch komplett andere gruende haben als die cpu. wenn nicht das rendering, dann z.b. den sound. manche sind so heldenhaft und spiele pro explosion nen sound ab, das kann der tod sein.

Was ist die Alternative? Nur dann ein Explosionssound abspielen wenn nicht bereits ein Explosionssound abgespielt wird?
-
z. B. eine bestimmte Anzahl an Soundkanälen für Explosionen zu sichern und wenn die alle gefüllt sind, wird der Explosionssound nicht abgespielt.
-
rapso schrieb:
manche sind so heldenhaft und spiele pro explosion nen sound ab, das kann der tod sein.

ich hoffe du sagst uns bescheid wenn du den fehler findest, gerade multicore programme gut zu machen scheint vielen probleme zu bereiten.
Helden ??? War da nicht wer ???Das mit noch einem neuen Thread war mein nächster Gedanke. Wenn sich was ergeben sollte werde ich mich melden. cu
-
Was sagt eigentlich ein Profiler zu der ganzen Geschichte? Damit müsste man ja wenigstens feststellen können, ob er wirklich im Partikel-System so lange rechnet.
-
Netzwerk-Latenz schrieb:
Das mit noch einem neuen Thread war mein nächster Gedanke. Wenn sich was ergeben sollte werde ich mich melden. cu
kein neuer thread
du sollst mal alles in einem thread laufen lassen, quasi sequenziell.
-
Hallo,
war doch nicht der Prozessor. Der hat genug Power. Das Problem lag an der Grafikkarte.
Das Spiel (es ist ein 2D Spiel) verwendet für die Darstellung der Partikel Texturen, wegen transparenz und anderen Zeugs. Jetzt habe ich das umgestellt auf DirectDraw-Oberflächen. Und das Problem war weg.
Was wieder die Frage aufwirft warum eine Geforce der 8er Reihe von ein paar hunder Vertices in die Knie gezwungen wird (schlampig programmiert? NÖÖÖ). Naja jetzt weiß ich woran es liegt. Also der Prozessor war es nicht
