2015-06-06 13 views
14

Possiedo un motore di gioco C++ che attualmente supporta Windows, Linux e Android (NDK). È basato su SDL e utilizza OpenGL per il rendering.Esegui codice C# dall'applicazione C++ (Android NDK) gratuitamente

Uno dei vincoli di progettazione di questo motore di gioco è che il costo di sviluppo deve essere di $ 0,00 - costruendo il motore dovrebbe venire a costo zero (oltre alle ore uomo), devo essere autorizzato a ridistribuire liberamente il motore codice e binari, e gli utenti dovrebbero essere in grado di vendere giochi creati usando il motore senza restrizioni.

In questo momento, sto utilizzando un linguaggio di scripting interpretato molto lentamente per la logica del gioco: funziona davvero bene per scrivere codice di colla e semplici risposte agli eventi dell'interfaccia utente, ma non molto altro.

Mi piacerebbe sostituire questo sistema con una soluzione C# - avere l'utente compilare una libreria di classi C# (DLL) contenente la logica di gioco, e avere il lato C++ 'consumare' questa DLL e chiamare i ganci appropriati.

È stato piuttosto difficile trovare informazioni su come ottenere questo in modo multipiattaforma. Ogni piattaforma ha un modo diverso di ospitare i runtime necessari. Inoltre, la maggior parte degli articoli che ho trovato suggeriscono l'uso di framework completi che forniscono astrazioni di piattaforma già implementate nel mio motore.

C'è attualmente un modo per eseguire il codice da una DLL C# da un'applicazione C++ basata su NDK Android senza utilizzare un SDK completamente diverso e senza dover sborsare centinaia di dollari per una licenza?

In particolare, sto prendendo in considerazione alcune delle recenti iniziative di rete open source di Microsoft: tutto ciò che potrei usare? EDIT: per chiarire, Windows e Linux hanno un modo ben documentato di eseguire il codice .net "gratuitamente". Questa domanda riguarda specificamente la chiamata del codice gestito da un'applicazione NDK Android SENZA pagare i costi di licenza a Xamarin o ad un altro fornitore .

+0

Hai mai pensato di utilizzare un linguaggio di scripting JITable? – walkingTarget

+0

@walkingTarget Sì, ma mi piace molto il design del linguaggio di C#. – kiwibonga

risposta

1

E 'stato piuttosto difficile trovare le informazioni su come raggiungere questo obiettivo in modo cross-platform ...

Sto solo andando a affrontare la questione della "write once, run in tutto il mondo ".

Io costruisco e gestisco una libreria, composta da un unico insieme di sorgenti, che gira su Windows, Linux, OS X, Windows Phone, Android e iOS. Per fare ciò, dovevo scrivere tutto in C/C++ portatile e quindi creare DLL o oggetti condivisi.

Il progetto utilizza .Net interop per chiamare nella DLL e Android utilizza JNI per chiamare nell'oggetto condiviso. Su iOS viene creata una libreria statica piuttosto che un oggetto condiviso.

La DLL o l'oggetto condiviso ha alcune definizioni specifiche della piattaforma. Ad esempio, deve sapere come ottenere numeri casuali dal sistema operativo sottostante. Così avrà una funzione come:

bool GetRandomNumbers(unsigned char* ptr, size_t size) 
{ 
#if defined(WIN32) || defined(WIN64) 
    ... 
#elif defined(__linux___) || defined(linux) 
    ... 
#elif defined(__ANDROID___) 
    ... 
#endif 
} 

Quindi, mantenere la logica di business di base portatile e in una DLL o un oggetto condiviso, #define dove si deve a differenze di piattaforma astratti, e sarete OK.

In cima alla libreria portatile, si sovrappongono gli elementi della GUI specifici della piattaforma.

Se provi a scrivere questo in C# e poi lo usi su altre piattaforme, ti creerai problemi. L'unico modo per fare portabilità con una singola serie di fonti è utilizzare C/C++ portatile.

Ho anche visto la gente re-implementare in ogni lingua: C e Win32 per Windows, .Net per Windows, C per Linux, Cocoa per OS X, .Net per Windows Phone, Java per Android e CocoaTouch per iOS . Ciò crea circa 6 volte il lavoro, e i comportamenti non sono mai uguali su tutte le piattaforme.

+0

La domanda riguardava il codice di chiamata nei file dll gestiti su Android. Sembra che tu stia parlando dei metodi per chiamare il codice nei file nativi .dll/.so - un buon consiglio, non pertinente qui. – kiwibonga

1

Un popolare motore di script per i giochi è Lua; potresti considerare di usarlo, dal momento che è banalmente facile da collegare con C/C++. Se usi LuaJIT, è anche incredibilmente veloce su Android (e non shabby su iOS).

Un'alternativa da considerare è che se si crea il motore personalizzato su Cocos2d-X, non solo si ottiene Lua (o JavaScript) gratuitamente come motore di scripting collegato, ma si ottiene anche la portabilità su Windows (Win32 e Windows 8.1 Universal), iOS, Mac e Linux, un IDE (!!) e un'enorme comunità di supporto.

Oppure puoi dedicare molto tempo a capire come integrare C# nel tuo motore.

+0

Grazie, ma questa non è una risposta. – kiwibonga

+0

Dice che vuole un linguaggio di scripting più veloce. A tale riguardo fornisce una soluzione alternativa. – SomeCallMeTim

+1

No: Lua non è qualcosa che mi aiuterà a eseguire il codice C# nel mio progetto. La domanda inoltre non ha chiesto se approvassi o meno quello che sto cercando di fare. – kiwibonga

2

La risposta semplice è no, quello che stai cercando non esiste al momento. Dovrai eliminare/modificare i requisiti per trovare una soluzione.

Il più vicino che conosco è dot42 - che sembra supportare alcuni di .net su Android è stato recentemente inserito su github e il sito principale si spegne - ma non si fa menzione della licenza nel repository principale del compilatore (I ' ho aggiunto un bug per aggiornarlo ..)

Non è chiaro che supporti il ​​caricamento dinamico di C# .dll anche se pretende di compilare a DEX. (Ma può essere gratuito, a seconda di ciò che gli sviluppatori rilasciano come licenza ...)

Xamarin è l'unica altra alternativa fattibile che io conosca, ma come sapete, solo l'edizione iniziale è gratuita.

Se quello che stai cercando è un supporto di script puramente migliore, eliminerei i requisiti compilati e C# e trovo qualcosa che funzioni già su Android. Lua è la mia soluzione per questo tipo di cose, ma non l'ho mai usato su Android prima ... e molte altre opzioni esistono.