2010-04-08 11 views
5

Sto lavorando a un progetto di debugger per il motore di scripting di un gioco. Spero di scrivere la GUI del debugger in C#. Il vero motore di debug, tuttavia, è incorporato nel gioco stesso ed è scritto in una miscela di patch C, C++ e assembly.Comunicazione tra processi C# <--> C++ per il motore di debug del gioco

Qual è il modo migliore per gestire la comunicazione tra la GUI del debugger e il motore di debug? I due verranno eseguiti in processi separati.

Grazie!

Andy

risposta

4

Se è possibile richiedere Windows Vista o versioni successive, e .Net 3.5 o versione successiva, named pipe forniscono semplice, ad alte prestazioni IPC. Controlla this article.

+1

I pipe denominati funzionano in XP e in .NET 2 (tramite PInvoke), quindi sono sempre una buona opzione. –

+2

E, diavolo, anche su Unix, dal momento che nessuno lo parla. –

+0

Non si può fare un ulteriore passo avanti e, nell'implementazione C#, implementarlo con WCF usando pipe con nome? – Jaxidian

2

Ho fatto questo un paio di anni fa. Script debugger è stato scritto in C# e eseguito su PC; il runtime di script è stato scritto in C++ e funzionava su tutto ciò che supportavamo al momento: PC, PS3, Xbox360, Wii, DS, PSP e PS2.

Qualunque cosa tu stia mirando, ti consiglio di inserire un qualche tipo di livello in modo che il debugger e il runtime siano isolati dal protocollo sottostante. Tieni le chiamate dell'API dove puoi tenerle d'occhio! Questo // lascia aperte le opzioni e (se fatto bene) semplifica il codice alle due estremità. Una sorta di sistema basato su pacchetti, con pacchetti di 1K o meno, mappa in modo tollerabile a qualsiasi cosa. (La trasmissione di> 1K può essere eseguita a un livello superiore, utilizzando solo l'API pubblica.)

Se si utilizza solo PC, si consiglia TCP/IP. È trasparente alla rete, tutti hanno familiarità con i suoi indirizzi IP e le porte, non è più difficile usare API-wise di named pipe.

Per un titolo di nuova generazione, se si vuole raggiungere un buon equilibrio tra compatibilità multipiattaforma e facilità di codifica, TCP/IP è ancora la strada da percorrere. Funziona su PC, Xbox360 e PS3.

(Per quanto riguarda le pipe denominate, il Target Manager di SN fornirà il supporto named pipe per PS3 e PS2, come ricordo, e passa attraverso la porta LAN dev invece della porta LAN del gioco, ma Xbox360 non lo supporta a Quindi potrebbe valere la pena supportarlo - ed è la tua unica opzione in PSP, se ricordo bene! - ma non è una panacea universale.

Personalmente, mi sono fermato dopo aver implementato il supporto TCP/IP, e io In sintesi, Wii e DS sono entrambi orribili, ma in modi diversi, e diversamente da qualsiasi altra cosa: la PSP supporta solo pipe denominate, per qualche motivo sconosciuto: PS3 e PS2 supportano TCP/IP, ma solo tramite la porta LAN del gioco. (La porta LAN del dev funziona in modo diverso. Non usarlo. Chiedi al tuo produttore più cavi di rete e salva il tuo benessere y.) Xbox 360 supporta TCP/IP, ma solo se si utilizzano le librerie di debug e solo tramite l'IP del gioco. (L'IP di debug funziona in modo diverso. Non utilizzarlo.)

In breve: qualunque cosa tu faccia, avrai bisogno di questo strato isolante.

+0

Fortunatamente sto prendendo di mira il PC con entrambe le applicazioni. Penso che andrò con le pipe nominate e implementerò il livello di isolamento come suggerivi tu.Ora-- Qual è il modo migliore per implementare un tale livello di isolamento? Non voglio scrivere una versione in C++ e un'altra in C#. C'è un modo semplice per usare il codice C++ in C# senza doverlo caricare da una dll? – Andy

+0

Non è possibile allontanarsi dalla DLL, ma è possibile scrivere codice C++ e utilizzare così com'è nel gioco. Quindi scrivi uno shim in Managed C++ e compila quello (e il codice C++) come progetto C++ gestito da usare nella soluzione del debugger. Dovrebbe essere abbastanza facile e funzionare in modo abbastanza trasparente. (Da parte mia ho appena scritto il codice due volte, una volta in C++ e una volta in C#, e non è stato male. Non mi piace condividere il codice tra gioco e strumenti se possibile, il codice finisce per essere tirato dentro 2 direzioni concorrenti contemporaneamente.) –

Problemi correlati