Sorry, das ist zwar etwas off-topic, aber ich kann das so nicht stehen lassen:
Bezueglich den 2GB pro Task.. das ist nicht ganz korrekt so. 32bit-Windows koennen pro _Thread_ nur 2GB zuweisen, aber gerade Spiele die ihr Grafikrendering
an DirectX auslagern, sind fast immer multithreaded, und koennen damit deutlich mehr als 2GB nutzen - und da 32bit-Windows nur 3GB gesamten RAM verwalten
kann, kommt der Rest halt aus dem Swapfile.
Ein 32-Bit-Betriebssystem benutzt zur Adressierung nunmal 32-Bit Zeiger, und damit lässt sich ein Adressraum von 2^32=4GB darstellen. Das gilt
grundsätzlich pro Prozess. Threads eines Prozesses nutzen alle den gleichen Adressraum, sind also ebenfalls auf maximal 4GB beschränkt.
Aufgrund einer uralten Design-Entscheidung teilt sich dieser Adressraum normalerweise in zwei gleiche Teile auf, einer reserviert für's System, in welchem
sich z.B. die Treiber tummeln, und der untere Teil ist für die Applikation fast vollständig verfügbar. Und das sind Eure 2GB, die eben üblicherweise pro
Prozess gelten.
Aktuellere Windows-Versionen lassen sich durch einen Schalter in der boot.ini überzeugen, nur 1GB für's Sytem zu reservieren und damit 3GB für die
Applikation nutzbar zu haben. Das setzt allerdings voraus, dass die Applikation damit auch umgehen kann, weswegen in der Exe ein entsprechendes Flag gesetzt
sein muss.
Windows selber könnte locker mit deutlich mehr Speicher umgehen, das Problem ist, dass dieser von 32-Bit-Treibern nicht mehr direkt adressiert werden kann. Von
daher gibt's für (alle) 32-Bit Betriebssysteme nun einmal eine physikalische Grenze von 4GB verbautem RAM. Davon wird all zu häufig von der Hardware noch
etwas abgezwackt, also z.B. das Mainboard-BIOS oder gemappter Speicher der GraKa. Meist ist dieser reservierte Bereich 1GB, wodurch man auf ein Limit von 3GB
kommt. Das kann bei älteren Chipsätzen auch bei 2GB liegen und bei modernen jedoch auch darüber.
Ganz moderne CPUs (IA32) und Chipsätze können per PAE aber auch unter 32-Bit-Systemen durchaus bis zu 64GB physikalisches RAM adressieren. Davon profitieren
einmal viele parallel laufende Applikationen, oder welche, die EMS-like Teile davon in ihren virtuellen Adressraum einblenden.
So, kommen wir zum Swapfile. Wenn ein Applikation irgendwie auf Speicher zugreift, das kann sowohl Programmcode oder eben Daten sein, dann liegt dies
immer im physikalischen RAM. Da der Adressraum allerdings virtuell ist (= kein linearer Zusammenhang mit physikalischen Adressen), ist es möglich,
dass an der Stelle gerade gar kein RAM eingeblendet oder die Seite gerade ausgelagert ist. Dann gibt's 'ne ganz ordinäre Speicherschutzverletzung, das
Betriebssystem übernimmt die Kontrolle und sorgt dafür, dass da erstmal RAM eingeblendet wird. Ist das geschehen, wird die Instruktion einfach wiederholt.
Jetzt kann es eben vorkommen, dass gerade kein physikalisches RAM mehr frei ist, und
dann wird eben ggf. eine länger nicht mehr benutzte
Speicher-Seite in die Auslagerungs-Datei geschrieben und diese nun freie Seite in den Adressraum des "anfragenden" Prozesses gemappt.
Oder andersherum: Wenn das System über 3GB Arbeitsspeicher verfügt und eine Applikation ihre gesamten 2GB verwendet, wird die Swapdatei ruhig sein. Eventuell
wird beim Start erstmal alles Mögliche ausgelagert und nach Beenden des Prozesses wieder eingelagert, aber während die Applikation läuft, sollte im Swapfile
nicht viel passieren.
Das war früher, als der verfügbare Speicher deutlich kleiner als der virtuelle Adressraum war, ganz anders. Da konnte ein Prozess, der sehr viel virtuellen
Speicher genutzt hat, in der Tat massive Aktivität beim Swapfile provozieren...
Soviel in Kürze. Ich weiss, da fehlen einige Details, aber das muss jetzt reichen... 😉
Ok, zurück zum Thema. Wenn auch bei abgedecktem Fenster das Geschraddel weitergeht, liegt der Hund irgendwo im GDI begraben. Denn bei abgedecktem Fenster
bekommt der Grafik-Treiber vom Zeichen-Wunsch gar nichts mehr mit. Damit steht für mich die StretchDIBits-Routine als Verursacher ziemlich fest. Wobei ich nach
wie vor nicht verstehen kann, warum da das Swapfile einspringen muss. Mit Speicher-Knappheit hat das sicher nichts zu tun...
Dass da die CPU-Last auf 100% hochgeht ist den ganzen Schutzverletzungen und Kontext-Wechseln zwischen Ring 3 (Applikation) und 0 (System) geschuldet, das
kostet halt tierisch Performance. Die sonstigen 40-60% gehen definitiv auf die Kappe von StretchDIBits, welches nicht die effizienteste Routine ist, um Bitmaps
gedehnt darzustellen. Das ginge per DirectX deutlich effizienter (ein weiterer Beleg dafür, dass der GraKa-Treiber hier nichts mit zu tun hat). Das war ja eine
der Sachen, die ich eigentlich noch ändern wollte... 😉