@BR146
Dazu kann man dann Ausweichgleise bauen, über die man Güterzüge gezielt mit Wegpunkten leiten kann.
Sollte es also zu dem seltenen Fall kommen, dass ein Güterzug auf der Hauptstrecke auf der auch ICEs fahren verkehrt und ein ICE von einer Strecke kommen sollte, die eben keine Vorfahrt hat, dann muss man eben die Hauptstrecke an dieser Stelle doppelt 2 Gleisig ausbauen, damit der Güterzug eben keine Vorfahrt hat. Das Ausweichstück würde man dann aber so oder so bauen, da man die Hauptstrecke auf der der Güterzug fährt schließlich nicht durch einen wartenden Güterzug verstopfen möchte. Schließlich könnte direkt dahinter ja auch ein ICE fahren der, da er auf der Hauptstrecke fährt Vorfahrt vor dem anderen ICE haben soll.
Ich kann mir so Spontan kein Szenario vorstellen, das man nicht mit einem Ausweichgleis lösen könnte (und auch keines bei dem die Variante mit mehrblock Signalen eine Ausweichstelle erforderlich* macht, die andere Variante allerdings nicht.
Ansonsten könnte man aber auch zusätzlich zu den Mehrblock Signalen den Linien eine Priorität (keinen Blockabstand) mitgeben, der im Falle von mehreren überschneidenden Mehrblocksignalen entscheidet wer am Hauptsignal** Vorfahrt bekommt.
Da das vielleicht etwas unverständlich klingt hier eine kleine ASCII Skizze mit Beschreibung:
Sn ist ein Signal das n Blöcke blockiert >, <, v, ^ die Fahrtrichtungen, o eine Weiche und - ein nichtssagender Platzhalter.
>>>>>S2>>>>>>>>S1>o>>>>>>>S1>>>
>>>>>S2>>>>>>>>S1>^
Beide Linien sind also erstmal von den Signalen her gleichwertig.
Auf der Oberen Linie fährt nun ein ICE mit Priorität 3, auf der unteren ein Güterzug mit Priorität 1 (je höher desto besser)
Der Güterzug überquert das 1. Signal und merkt erstmal den gesamten Bereich bis zum letzten Signal.
Der ICE überquert nun sein erstes Signal, blockiert nun den Bereich bis zum letzten Signal. Der Güterzug blockiert jetzt nur noch den Bereich zum 2. Signal. Hätte der Güterzug zu diesem Zeitpunkt bereits sein 2. Signal überfahren, müsste der ICE am 2. Signal halten, da der Güterzug bereits im gemeinsamen Bereich wartet.
Umgekehrt: Güterzug Oben überquert 1. Signal, ICE fährt unten funktioniert genau so. Der Güterzug steht nun also auf der geraden Strecke und blockiert diese bis der ICE hinter dem letzten Signal ist. Das würde bei dem anderen Vorschlag mit den mehrblock Zügen/Linien auch so sein. Es wäre allerdings aufwendiger die Linien zu erstellen. Angenommen dies ist die Hauptstrecke, möchte man dies nicht. Also baut man ein Ausweichstück.
o>>S3>>S2>>>>>>>>S1>o>>o>>>>S1>>>
v---------------------------^--^
>>>>>>>S1>>>>>>>>S1>^--^
>>>>>>>S2>>>>>>>>S1>>>^
Jetzt könnte man dem Güterzug auf der Hauptstrecke über das Ausweichstück schicken. Der ICE auf der Hauptstrecke könnte jetzt vor dem anderen ICE und dem Güterzug vorbei fahren.
Das funktioniert auch ohne Prioritäten. und mit den Linienbezognenen Blocklängen auch.
*mit erforderlich meine ich, dass ansonsten die Hauptstrecke (die mit der höheren Priorität) zum stocken kommen würde.
**das Wort Hauptsignal habe ich hier nicht realitätsgetreu genutzt. Es beschreibt einfach nur das letzte Signal vor dem Zusammentreffen der Gleise (da wo also in echt das Hauptsignal stehen würde, aber es funktioniert etwas anders)
@DarkMo Heutzutage können Grafikkarten einiges mehr als nur ein bischen mit Vektoren rechnen. Im großen und ganzen stimmt das aber. Die können einige wenige Dinge unglaublich schnell und GPGPU nutzt genau das aus. Es werden also Dinge die die GPU unglaublich schnell kann von einem auf der CPU laufenden (im Hauptspeicher arbeitenden) Steuerprogramm auf die GPU ausgelagert. Dies geschieht bei openCL z.B. so, dass ein so genannter openCL Kernel vom Steuerprogramm an die GPU gegeben wird. Dieser openCL Kernel erhält einen eigenen Speicherbereich im Spiecher der Grafikkarte, der vom Steuerprogramm initialsisert wird. Der openCL KErnel rechnet schnell seinen Teil durch und schreibt die Ergebnisse in diesen Berecih. Das Steuerprogramm holt sichd ann die Ergebnisse ab.
So weit zur theroetischen Funktionsweise. Es gibt neben openCL auch noch andere Schnittstellen wie CUDA, die aber wohl in diesem Fall nicht wirklich nützlich sind, da man damit alle Spieler an einen GPU Hersteller binden würde... openCL kennt btw. auch proprietäre Erweiterungen.
Ich habe mich vor ein paar Jahren mal mit der Sache beschäftigt. Das folgende könnte also nicht mehr up-to-date sein.
Ein Problem bei der Sache ist, dass es nicht damit getan ist ein Compiler flag zu setzen und schon geht es auf magische Weise auf die GPU. Das Verhalten muss man explizit coden und das ist auch deutlisch schwieriger als das selbe Programm einfach auf der CPU laufen zu lassen. Es ist also ein deutlicher Mehraufwand.
Es gibt allerdings einige Libs, die das ganze vereinfachen. Es bleibt ein Mehraufwand aber dieser hält sich dann wohl in Grenzen. Ich habe diese Libs aber selbst nie genutzt sondern nur ein wenig mit openCL aus Java heraus zu spielen (jocl). Es kann also sein, dass ich hier etwas daneben liege.
Das nächste Problem ist die kompatibilität.
Hierzu ein Zitat von tiker.net
Zitat
While OpenCL can natively talk to a large range of devices, that doesn't mean that your code will run optimally on all of them without any effort on your part. In fact, there's no guarantee it will even run at all, given that different CL devices have very different feature sets. If you stick to the OpenCL spec and avoid vendor-specific extensions, your code should be portable, if not tuned for speed. For now, it is safe to assume that you are facing efforts on the scale of a rewrite for your kernel code when switching devices for nontrivial codes. Fortunately though, the host-side code stays the same across devices.
Auch hier kann ich nicht sagen in wie weit die unterschiedlichen Frameworks dieses Problem lösen. Auch weiß ich nicht wie performant die Implementierungen sind.
Zu deiner Idee kann ich nicht viel sagen, da ich nicht genau weiß wie Meshes intern zu Pixeln weiterverarbeitet werden. Es sind zwar beides im Endeffekt nur Knoten und Kanten aber die Aktion ist eine gänzlich andere. Einmal interessieren uns die Flächen, da diese eben zu dem werden was man auf dem Bildschirm sieht (ggf. mit ner Textur drauf) und bei dem anderen interessieren uns erstmal die Kantenlängen als Weg zum Ziel aber vor allem der optimale Pfad auf dem man diesen Kanten folgen muss um zum ziel zu kommen. Außerdem interessiert an dieser Stelle die absolute Entfernung quasi garnicht, sondern die Reisedauer. Man müsste also erstmal ein Mesh so aufbauen, dass die Kantenlängen der Reisezeit entsprechen und ich bin mir ziemlich sicher, dass das im allgemeinen bei einem 3-d Mesh nicht möglich ist dieses Mesh aufzubauen.
Bsp: Knoten A,B,C
Kantengewichte: A-B 1, A-C 1, B-C 3
Aufgabe: wähle die Koordinaten der Knoten A,B,C so, dass die Kanten die Entsprechende Länge haben...
Du kannst also nicht jeden beliebigen Graphen in ein Mesh umwandeln, so lange die Kantengewichte etwas anderes als die Distanz zwischen den zum Knoten gehörenden Punkten sind.
Ob deine Idee also so funktioniert und ob das performant ist kann ich dir nicht sagen. Ich hoffe ich habe deine Idee zumindest richtig verstanden.
Auf jeden Fall kann man aber einen Algorithmus für openCL implementieren und die GPU den durchrechnen lassen. Das große Problem hierbei ist, dass die üblichen Algorithem für sowas keinen Blick auf Parallelität werfen. Man müsste also erstmal einen vernünftig parallelisierbaren Algorithmus finden, der diese Aufgabe erledigt. Wenn man ganz viel Glück hat gibt es dazu ein fertiges Graphen Framework, dass genau dies (hoffentlich performant) auf der GPU macht. Gibt es dieses Framework nicht, wird es wirklich viel Arbeit.
Es folgt irgendwo im Netz gelesenes Halbwissen (mit CUDA habe ich mich noch nie beschäftigt)
Ich weiß auch nicht ob für openCL der Modus der Grafikkarte gewechselt werden muss (ich habe mit openCL nochrum gespielt wenn gleichzeitig eine graisch aufwendiger Oberfläche angezeigt werden musste). Bei CUDA soll das zumindest mal so gewesen sein und die Zeit die der mode switch benötigt hat soll auch nicht ohne gewesen sin uns sich in Form von spürbaren lags geäußert haben. Also entweder man hat eine ungenutzte NVIDIA GPU im System oder man muss eben mit lags bei der Anzeige leben. Die Umschaltzeit soll aber bei neueren Karten deutlich niedriger liegen.