2010-04-08 21 views
5

Estoy trabajando en un proyecto de depuración para el motor de secuencias de comandos de un juego. Espero escribir la GUI del depurador en C#. Sin embargo, el motor de depuración real está integrado en el juego y está escrito en una combinación de C, C++ y parches de ensamblaje.Comunicación entre procesos C# <--> C++ para el motor de depuración de juegos

¿Cuál es la mejor manera de manejar la comunicación entre la GUI del depurador y el motor de depuración? Los dos se ejecutarán en procesos separados.

Gracias!

Andy

Respuesta

4

Si puede requerir Windows Vista o posterior, y .Net 3.5 o posterior, canalizaciones con nombre proporcionan sencilla, IPC de alto rendimiento. Consulte this article.

+1

Las tuberías con nombre funcionan en XP, y en .NET 2 (a través de PInvoke), por lo que siempre son una buena opción. –

+2

Y, demonios, también en Unix, ya que nadie lo menciona. –

+0

¿No puede llevar esto un paso más allá y, en la implementación de C#, implementar esto con WCF utilizando conductos con nombre? – Jaxidian

2

Lo hice hace un par de años. El depurador de scripts se escribió en C# y se ejecutó en PC; El tiempo de ejecución de scripts se escribió en C++ y se ejecutó en todo lo que admitíamos en ese momento: PC, PS3, Xbox360, Wii, DS, PSP y PS2.

Sea cual sea su objetivo, le recomiendo poner algún tipo de capa para que el depurador y el tiempo de ejecución estén aislados del protocolo subyacente. ¡Mantén las llamadas API donde puedes vigilarlos! Esto // deja sus opciones abiertas, y (si se hace bien) simplifica el código en ambos extremos. Algún tipo de sistema basado en paquetes, con paquetes de 1K o menos, se correlaciona tolerablemente con casi cualquier cosa. (La transmisión de> 1K se puede lograr en un nivel superior, utilizando solo la API pública).

Si solo está orientando su PC, recomiendo TCP/IP. Es transparente para la red, todo el mundo está familiarizado con sus direcciones IP y puertos, no es más difícil usar API que con nombre.

Para un título de próxima generación, si desea lograr un buen equilibrio entre la compatibilidad multiplataforma y la facilidad de codificación, TCP/IP sigue siendo el camino a seguir. Funciona en PC, Xbox360 y PS3.

(En cuanto a los conductos con nombre, Target Manager de SN le proporcionará soporte de canalización para PS3 y PS2, según recuerdo, y va a través del puerto dev LAN en lugar del puerto LAN del juego, pero Xbox360 no lo admite en todo. Así que valdría la pena apoyarlo, y es su única opción en PSP, si no recuerdo mal, pero no es una panacea universal.

Personalmente, me detuve después de implementar el soporte TCP/IP, y Estoy contento de haberlo hecho. Como resumen, el Wii y el DS son horribles, pero de diferentes maneras, y a diferencia de cualquier otra cosa. La PSP solo admite canalizaciones con nombre, por algún motivo desconocido. La PS3 y la PS2 son compatibles con TCP/IP. pero solo a través del puerto LAN del juego. (El puerto dev del LAN funciona de manera diferente. No lo use. Pídale a su productor más cables de red y guarde su sanit y.) Xbox360 admite TCP/IP, pero solo si está utilizando las bibliotecas de depuración y solo a través de la IP del juego. (La IP de depuración funciona de manera diferente. No la use.)

En resumen, haga lo que haga, necesitará esa capa aislante.

+0

Afortunadamente mi objetivo es PC con ambas aplicaciones. Creo que voy a utilizar tubos con nombre e implementar la capa de aislamiento como sugirió.Ahora-- ¿Cuál es la mejor manera de implementar tal capa de aislamiento? No quiero escribir una versión en C++ y otra en C#. ¿Hay alguna manera fácil de usar el código C++ en C# sin tener que cargarlo desde un dll? – Andy

+0

No puede alejarse de la DLL, pero puede escribir el código C++ y usar tal como está en el juego. Luego escriba un shim en Managed C++, y compile eso (y el código C++) como un proyecto administrado de C++ para usar en la solución del depurador. Eso debería ser lo suficientemente fácil y funcionar con bastante transparencia. (Por mi parte, solo escribí el código dos veces, una vez en C++ y una vez en C#, y no fue tan malo. No me gusta compartir el código entre el juego y las herramientas, si es posible, el código simplemente termina siendo arrastrado 2 direcciones competidoras a la vez). –

Cuestiones relacionadas