Chilisidian schrieb:
Sind wir jetzt schon so weit, dass es einen Threadripper fĂŒr höchste Einstellungen braucht? Das Kasperletheater geht weiter.
Was fĂŒr ein Kasperletheater? Kennst du den Quellcode schon? WeiĂt du, wie viele Threads das System am Ende wirklich benötigt und auslasten kann? Wie die Vektorisierung ist? Was da alles an Berechnungen ggf. im Hintergrund ablaufen mĂŒssen?
polyphase schrieb:
Ja klar, weil richtig programmieren kann eben niemand mehr!
Wenn ich sowas schon lese, stellen sich mir die Nackenhaare auf, weil man an solchen pauschalen polemisierenden Aussagen einfach merkt, dass da einer so ĂŒberhaupt keine Ahnung hat, aber meint sich ein Urteil zu erlauben.
polyphase schrieb:
Heute Spiele Entwickler sollten mal bei Leuten wie Chris Sawyer usw. nen Lehrgang machen.
Ach, sollten sie? Chris Sawyer hat seine "ProgrammierkĂŒnste" zu einer Zeit gelernt, als viele Compiler noch in den Kinderschuhen steckten und Betriebssysteme und Co kaum ein Abstraktionslayer hatten und man daher vieles wirklich direkt programmieren musste.
Gerade Entwicklungen wie OpenGL, DirectX, sowie weitere APIs und Abstraktionsschichten, fĂŒhren heute ĂŒberhaupt erst dazu, dass du ein Spiel teilweise ĂŒber Jahre hinweg wirklich noch spielen kannst.
Dazu kommt, dass man je nach dem welche APIs/Frameworks benutzt werden als Unterbau, sich um bestimmte Optimierungen garkeine Gedanken mehr machen muss, da diese ĂŒber "Treiber" eingepflegt werden und in anderen FĂ€llen ein erneutes kompilieren hilft.
polyphase schrieb:
Die haben performancekritische Teile ihrer Spiele in Assembler programmiert, um alles aus den damaligen CPUs herauszuholen.
Man musste damals performancekritische Teile oft in Assembler programmieren, weil die Compiler und Standardbibliotheken teilweise mit bestimmten Sachen ĂŒberhaupt nicht umgehen konnten, weil es noch fehlte.
Wer heute meint in Assembler "besseren" und "leistungsfĂ€higeren" Code zu erzeugen, als es die Compiler tun, ist - selbst freundlich ausgedrĂŒckt - Dumm. Heutige Compiler können aus C/C++/C# und Co deutlich effizienteren Code erzeugen, als man es mit Assembler selbst hinbekommen wĂŒrde.
Autoparallesierung und -vektorisierung sind das kleine Ein mal Eins der Compiler.
Dazu kommt einiges mehr, was Compiler heute so machen können, was man selbst als Entwickler nicht auf den Schirm hat.
Ebenso bleibt Code "ĂŒbertragbar", Assembler hat nĂ€mlich die negative Eigenschaft, dass man sich fĂŒr eine Plattform entscheiden muss. Ein optimierter Algorithmus auf Assembler-Ebene benötigt ganz andere Optimierungen bei x86 als bei AArch64, eine AVX(2) wieder andere als AVX512/AVX10.
Assembler-Programmierung/Optimierung fÀllt heute eher in den Bereich der eher zweifelhaften B
ereich der Microoptimierungen, die man wirklich nur im Ă€uĂersten Notfall anwenden sollte, wenn es wirklich nicht mehr anders geht. Der Nutzen ist in der Regel ĂŒberschaubar, die Wartbar- und Lesbarkeit des Codes nimmt draĂtisch ab und die Portierbarkeit wird quasi verhindern.
Ichthys schrieb:
Multithreading in Assembler...? Spannend.
Möglich: Sicher, aber sehr kompliziert, weil man dann in Assembler gewisse Systemaufrufe und Co wirklich kennen muss.
Aber man sollte auf das "nicht richtig programmiert" auch nicht so viel geben. Wer einmal fĂŒr einen 8080, Z80 oder den 8086 programmiert hat - und zwar in Assembler, weiĂ, dass die Hardware damals in weiten Teilen deutlich einfacher aufgebaut war und daher auch fĂŒr Entwickler vorhersehbarer.
Heute mit Out-of-Order-AusfĂŒhrung, der Erweiterung auf 16 und bald 32 Register sowie den Optimierungen, die eine CPU bereits selbstsĂ€ndig vornimmt - Umsortieren von Operationen, Renaming von Registern und Co - kannst man als Entwickler den wirklichen Ablauf des Codes auf der CPU ĂŒberhaupt nicht mehr sicher vorhersehen. FĂŒr gut optimierte Programme muss man heute - selbst bei preformance-kritischen Teilen - nicht mehr wirklich handanlegen per "Assembler". Das kann sowohl der Compiler als auch die CPU oft deutlich besser und zuverlĂ€ssiger und man stört die beiden dabei auch nicht.
Wichtiger ist es, dass man sich mit gewissen Best-Practices-Grundlagen befasst. NVIDIA hat zum Beispiel
Do's und Don'ts fĂŒr DX12.
AMD fĂŒr Radeons, direkt abrufbar.
Solche Sachen gibt es auch fĂŒr das Arbeiten mit Arrays, Hashtablen, BinĂ€rbĂ€umen und Co. Ebenso fĂŒr Multi-Thread-Anwendungen und wie die Thread-Verwaltung und Synchronistation laufen soll. Wann asynchrone Funktionen besser sind als synchrone und Co.
Genauso gibt es das fĂŒr Datenstrukturen und am Ende auch fĂŒr Algorithmen und den Rekursionsstack und wie man damit am besten umgeht.
Haldi schrieb:
Damit es schön ĂŒber alle Threads verteilt ist benötigt es doch gute Programmierung und viel Optimierung oder nicht?
Gutes Mutli-Threading und ebenso gutes Vektorisieren ist eine Kunst fĂŒr sich bei der Programmierung und alles andere als trivial. Es gibt fĂŒr letzteres bereits Automatismen, am Ende muss man beides aber wirklich beherrschen.
Wenn das Spiel es schafft die Last auf bis zu 32 Threads aufzuteilen und dabei kein Bottleneck entsteht bei einzelnen Prozessen: Hut ab. Das ist alles andere als leicht und benötigt einiges an Know-How.