Hallo
Kurz und knapp:
- Deine Grafikkarte hat zu wenig Grafiksspeicher. -> Versuche es mit weniger Texturqualität. TF fängt an zu Swapen und lädt die Texturen von der Festplatte.
- TF benutzt zur Hauptberechnung höchstens zwei Threads (zwei CPU Kerne, Version 4831), ein Kern kann einfach überfordert sein.
Eine Analyse zu dem CPU Kern Problem
Eine Teil-Code Analyse mit Linux Debug Daten, Windows Version 4831 und Beobachtung
TF macht im Endeffekt bei einem DayChange:
BuildingSimulator hat mehrere Felder mit Informationen, diese sind mir unbekannt.
Die Informationen in den Feldern ergibt einen Gesamt-Status A, B, C des Train Fever Haupt-Threads.
Im Programcode von BuildingSimulator::DayChange
Ist der Gesamt-Status A:
BuildingSimulator::PrepareThreadData
Mache einen Clone der Engine Teile, vom Transport Netzwerk, Stationen, Linien usw.
Starte einen neuen Thread für die Berechnung (mit den Clone Daten)
-> TF nutzt nun 2 Kerne für das Spiel und berechnet die Häuser im Hintergrund (wohl auch die Einwohner)
Ist der Gesamt-Status B (Monatsende?):
Benutze std::thread::join -> Warte bis Thread 2 fertig mit der Ausführung (Berechnung) ist.
BuildingSimulation::ProcessResult -> Verarbeite die errechneten Daten
TownDeveloper::Run(BuildingSimulation const*)
IndustryDeveloper::Run(BuildingSimulation const*)
und dann werden die Daten wohl weggeworfen.
Gesamt-Status C:
Mach hier gar nichts, der zweite Thread kann gerade im Hintergrund am laufen sein.
Zusammenfassung:
BuildingSimulation::ProcessResult in "Gesamt-Status B" scheint die Berechnung des Thread2 zu nutzen um die Daten im Hauptthread zu ändern.
Umso größer das Transport Netzwerk wird, um so langsamer wird Thread2 da es mehr Daten berechnen muss.
Wenn es gut läuft ist Thread2 schneller fertig in einem Monat als Thread 1. Thread 1 kann die Daten schnell genug im Status B verarbeiten.
Resultat: Spiel läuft flüssig.
Dann gibt es da noch Varianten wenn es hängt:
a) Thread 2 ist zu langsam auf dem CPU Kern, Thread 1 muss warten.
b) Thread 2 ist schnell genug (zwei Kerne werden genutzt, wenn Thread 2 fertig ist, nur noch ein CPU Kern von Thread 1)
Das Zusammenfassen der Daten in Thread 1(Nur ein CPU) braucht zu lange.
c) Thread 2 ist zu langsam (zwei Kerne werden aber genutzt) dann ist das Zusammenfassen der Daten zu langsam (ein CPU Kern wird genutzt)
d) GPU / OpenGL Limitierung. Thread 1 hat schon zu viel Zeit verbraten im Frame um Daten zu Grafikkarte zu schicken. Das Mergen im Thread 1 hat keine Rest-Zeit mehr übrig.
Hier hilft die GPU Einstellungen runter zu schrauben.
Vielleicht versteht Ihr nun warum es keine einfache Lösung gibt und es mehrere Probleme bzw. Lösungsansätze gibt:
- CPU Leistung bei einem Thread ist zu wenig.
- GPU Leistung zu wenig, schaltet die Grafikeinstellungen runter, zum Beispiel Texturqualität.
PS: Da TF sehr viel mit Hashes/Malloc und Locks arbeitet, gibt es da noch CPU cache misses, mutex/lock congestion, memory fragmentation (sehr schönes Beispiel alte Firefox Versionen). Also nicht gerade ein einfache Thema.
Ja. TF hat mehr als zwei Threads offen. Dies kann man zum Beispiel mit Sysinternals ProcessExplorer sehen. Unter anderem für Steam, Soundausgabe, Grafikkartentreiber, ist hierbei um das Thema einfacher zu halten nicht berücksichtigt.
Ich benutzte zur Analyse die erste öffentliche Linux Version für Funktionsnamen (Debugdaten) + Windows Version 4831