Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

27.07.2014, 21:59

Memory-Frage

Hi, ich mag ein TS3 Plugin mit meinem Game verbinden. Dazu verwende ich eine Pipe. Ich schreibe jeden Frame die Positionsdaten der Spieler in die Pipe.
Dazu reserviere ich Speicher mit malloc und kopiere dort mit memcpy meine Variablen rein und gebe der Pipe dann den Offset als void-Pointer.
1. Ist das Vorgehen korrekt oder gibt es bessere Wege, einen void* auf mehrere Variablen zu geben? (Bei memcpy krieg ich halt overhead wegen der Copy-Source, weil die ja noch bleibt)

2. Bei einer Pipe, wird dort mein Speicher den ich angegeben habe in die Pipe kopiert, oder wird dort bloß der Pointer hinterlegt, sprich: Kann ich den Bereich danach wieder freigeben, ohne mir Sorgen um meine Daten machen zu müssen?

3. Wenn nein, haltet ihr es für eine gute Idee jeden Frame den gleichen Speicherbereich zu verwenden um die Daten reinzumachen?

2

27.07.2014, 23:12

Welches os benutzt du?
Bei der WinAPI erstellst eine pipe mit CreateNamedPipe. Diese funktion erstellt einen Buffer für dich. Darum brauchst dich nicht zu kümmern. Dann kannst du dort mit WriteFile wie in eine Datei schreiben. Du übergibst der Funktion einen Zeiger auf einen Buffer, den sie dann reinschreibt.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

27.07.2014, 23:26

Vielleicht liege ich falsch, aber wenn ich das richtig verstehe, willst du Speicherbereiche zwischen Anwendungen teilen. Dafür gibt es auch entsprechende API Funktionen. Pipes hingegen sind nach meinen Kenntnisstand für serialisierte Daten gedacht. Sprich da haben Pointer rein garnichts zu suchen und sorgen für großes Aua.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

28.07.2014, 13:12

Ne ich will nich Speicher teilen sondern Daten übermitteln.
In einem Beispielprogramm hab ich halt gesehen wie jemand TransactNamedPipe aufruft und ein zu void* gecasteten char*-String übergibt, und als output ebenfalls eine char* nimmt.

Funktioniert vielleicht folgendes?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct PipeSendData
{
  float x,y,z;
};

...

PipeSendData data;
data.x = 0;
data.y = 0.5f;
data.z = 200.5f;

void* inputBuffer = (void*) &data;
size_t inputBufferLength = sizeof(PipeSendData);

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

28.07.2014, 14:12

Pointer über die Pipe schieben kannst du allgemein vergessen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

28.07.2014, 14:41

So wie ich das sehe geht es dabei um einen Pointer auf die Daten, die übertragen werden sollen. Da kann man natürlich einfach nach void* casten.

In C ist das ein impliziter cast, weswegen dieses Vorgehen in C APIs gerne verwendet wurde.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

28.07.2014, 18:25

Nur weil man es machen kann, heißt es noch lange nicht, dass das richtig ist. Ich kenne mich im Speichermanagment und den verschiedenen Ebenen nicht so gut aus, aber ich weiß, dass man nur speziell dafür vorgesehene Speicherbereiche zwischen Anwendungen "teilen" kann (shared memory). Ansonsten fingerst du da in Bereichen rum in denen du ggf nichts zu suchen hast. Ist in etwa so wie wenn dir eine Dame sagt, dass du sie nachts mit einer Leiter am dritten Fenster von Links im zweiten Stockwerk besuchen kommen sollst. Sieht a) komisch aus und kann b) fatal enden, wenn man sich im Fenster irrt oder sich kurzfristig was an der Fensterbelegung ändert.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

28.07.2014, 19:07

Das hat doch damit gar nichts zu tun. Die Funktion zum Senden von Daten via Pipe nimmt unter der Windows-API einen void* entgegen. Ich dachte birdfreeyahoo hätte das schon klar gemacht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
BOOL WINAPI TransactNamedPipe(
  _In_         HANDLE hNamedPipe,
  _In_         LPVOID lpInBuffer,
  _In_         DWORD nInBufferSize,
  _Out_        LPVOID lpOutBuffer,
  _In_         DWORD nOutBufferSize,
  _Out_        LPDWORD lpBytesRead,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

Der Speicherbereich kann nach dem Call einfach wieder gelöscht werden. Die Daten werden kopiert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

28.07.2014, 19:17

mea culpa. Das habe ich wirklich überlesen. Tut mir leid.

zu 1: Das Serialisieren in einen Buffer ist zumindest der einzige mir bekannte Weg um mehrere Variablen mit dynamischen Längen auf einmal übermitteln zu können.

zu 2+3: "The function cannot be completed successfully until data is written into the buffer specified by the lpOutBuffer parameter." -> impliziert, dass du danach frei wieder über den Speicherbereich verfügen kannst.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nox« (28.07.2014, 19:34)


birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

28.07.2014, 21:23

Danke für die Antworten, jetzt ist es mir klar.

Werbeanzeige