Frage

Ich bin auf einem RTS-Spiel in C ++ arbeiten bei Handheld-Hardware (Pandora) ausgerichtet. Als Referenz hat die Pandora einen einzigen ARM-Prozessor mit ~ 600Mhz und läuft unter Linux. Wir versuchen, auf einem guten Message-Passing-System absetzen (intern und extern), und das ist Neuland für mich.

Es kann helfen, ein Beispiel einer Nachricht zu geben, die wir weitergeben möchten. Eine Einheit kann diesen Anruf seine Modelle in den Speicher zu laden:

sendMessage("model-loader", "load-model", my_model.path, model_id );

Im Gegenzug könnte die Einheit eine Art von Nachricht erwartet ein Modellobjekt für den speziellen MODEL_ID enthält, die dann an das Grafiksystem übergeben werden können. Bitte beachten Sie, dass diese Sendmessage-Funktion in keiner Weise endgültig. Es spiegelt nur mein aktuelles Verständnis von Message-Passing-Systemen, die wahrscheinlich nicht korrekt ist:)

Von dem, was ich sagen kann, es gibt zwei ziemlich verschiedene Möglichkeiten. Eine davon ist Nachrichten im Speicher passieren, und nur durch das Netzwerk übergeben, wenn Sie mit einer externen Maschine reden. Ich mag diese Idee, weil der Aufwand scheint gering, aber das große Problem hier ist es scheint, wie Sie auf Ihren Nachrichtenwarteschlangen umfangreiche Verwendung von Mutex Verriegelung vornehmen müssen. Ich würde wirklich überschüssige Verriegelung vermeiden möchten, wenn möglich. Ich habe ein paar Möglichkeiten, las einfache Warteschlangen zu implementieren, ohne Verriegelung (indem Sie auf Atom int Operationen unter Berufung), aber diese davon ausgehen, gibt es nur einen Leser und ein Schriftsteller für eine Warteschlange. Dies gilt nicht sinnvoll erscheinen zu unserem speziellen Fall als Warteschlange des Objekts wird viele Autoren hat und einen Leser.

Die andere Wahl ist vollständig über die Netzwerkschicht zu gehen. Dies hat einige Vorteile Spaß wie asynchrone Nachricht immer ziemlich viel kostenlos übergeben. Außerdem gewinnen wir die Möglichkeit, Nachrichten an andere Maschinen exakt die gleichen Anrufe wie vorbei lokal mit zu übergeben. Allerdings reibt diese Lösung mir den falschen Weg, wahrscheinlich, weil ich nicht ganz versteht :) Würden wir eine Buchse für jedes Objekt benötigen, das Senden / Empfangen von Nachrichten werden wird? Wenn ja, so scheint dies übertrieben. Ein bestimmtes Spiel wird Tausende von Objekten hat. Für ein etwas untermotorisiert Gerät wie der Pandora, ich fürchte, dass das Netzwerk so zu missbrauchen kann am Ende unseres Engpass zu sein. Aber ich habe keine Tests laufen noch, so ist dies nur Spekulation.

MPI scheint für die Nachrichten beliebt zu sein vorbei, aber es fühlt sich sicher, wie übertrieben für das, was wir wollen. Dieser Code wird nie einen Cluster berühren gehen oder müssen schwer Berechnung tun.

Jeder Einblick in welche Möglichkeiten wir haben dies zu erreichen wird sehr geschätzt.

War es hilfreich?

Lösung

Das Netzwerk wird auch mit Verriegelung. Es wird nur sein, wo man es nicht sehen kann, in dem OS-Kernel.

Was ich tun würde, ist Ihr eigenes Message Queue-Objekt erstellen, die Sie neu schreiben können, wie Sie benötigen. Starten Sie einfach und macht es besser, je nach Bedarf. Auf diese Weise können Sie es jede Implementierung machen verwenden Sie hinter den Kulissen mögen, ohne den Rest des Codes zu ändern.

Schauen Sie sich mehrere mögliche Implementierungen, die Sie in Zukunft tun vielleicht gefallen und Ihre API entwerfen, damit Sie sie alle effizient handhaben können, wenn Sie in diesen Begriffen zu implementieren entscheiden.

Wenn Sie wirklich effizient Mitteilung wünschen vorbei Blick auf einige der Open-Source-L4 Microkernel. Die Jungs legen ein Los der Zeit in die schnelle Nachricht übergeben.

Andere Tipps

Da dies eine kleine Plattform ist, könnte es sich lohnen, beide Ansätze Timing.

Allerdings eine Art großer Geschwindigkeit Problem Sperre, würde ich immer für den Ansatz gehen, die einfacher zu codieren ist. Das wird wahrscheinlich den Netzwerk-Stack zu verwenden, da es der gleiche Code egal sein wird, wenn der Empfänger ist, und Sie werden nicht manuell Code haben und degug Ihre gegenseitigen Ausschlüsse, Telegrammpufferung, Zuweisungen, etc.

Wenn Sie herausfinden, es zu langsam ist, können Sie immer die lokalen Sachen später mit Speicher neu codieren. Aber warum die Zeit verschwenden tun, dass vorne, wenn Sie nicht haben könnte?

ich mit Zan Empfehlung einverstanden Nachrichten im Speicher zu übergeben, wenn möglich.

Ein Grund dafür ist, dass Sie komplexe Objekte C ++ passieren können, ohne dass und Abstellungs Marschall (Serialisierung und Deserialisieren) sie.

Die Kosten für Ihre Nachrichtenwarteschlange mit einer Semaphore schützen, wird höchstwahrscheinlich weniger werden als die Kosten der Herstellung Code Anrufe Vernetzung.

Wenn Sie Ihre Nachrichten-Warteschlange mit einigem Lock-Free-Algorithmus (unter Verwendung von atomaren Operationen, wie Sie selbst erwähnt) schützen Sie eine Menge ein Kontext in-Schalter vermeiden können und aus dem Kernel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top