Domanda

Voglio spostare le varie parti della mia app in semplici script per permettere alle persone che non hanno una forte conoscenza di c++ per essere in grado di modificare e implementare le varie funzioni.

Perché è un tempo reale app, ho bisogno di avere qualche tipo di multitasking per questi script.Idealmente, lo voglio così che il c++ app chiama una funzione di script, quindi continua a funzionare (in c++ thread) fino a un punto di pausa (Wait(x)), oppure restituisce.Nel caso In cui in attesa che lo stato ha bisogno di essere salvato pronto per lo script per riavviare la prossima volta che l'app passanti dopo che è scaduta la durata.

Inoltre, gli script devono essere in grado di chiamare la classe c++ metodi, preferibilmente utilizzando il c++ le classi piuttosto che normale funzioni wrapper attorno classi c++.

Non voglio spendere una quantità enorme di tempo di attuazione, in modo usando un linguaggio di scripting è preferito per scrivere la mia.Ho sentito che e Python, Lua può essere integrato in una c++ app, ma non so come fare per raggiungere i miei obiettivi.

  • Gli script devono essere in grado di chiamare le funzioni in c++
  • Gli script devono essere in grado di "mettere in pausa" quando taluni vengono chiamate funzioni (es.Attendere), e riavviare nuovamente il c++ thread
  • Deve essere veloce-questo è un app e ci potrebbero essere potenzialmente un sacco di script in esecuzione.

Posso probabilmente rotolare il multitasking codice abbastanza facilmente, a condizione che lo script può essere salvato e riavviato (possibilmente da un thread diverso per l'originale).

È stato utile?

Soluzione

È possibile utilizzare Lua o Python.Lua è più "leggero" rispetto a python.Ha un footprint di memoria inferiore rispetto a python fa, la nostra esperienza è stata più facile da integrare (persone percorrenza su questo punto potrebbe variare).È in grado di supportare un insieme di script in esecuzione contemporaneamente.Lua, almeno, sostiene di arresto/avvio del thread nel modo desiderato.

Boost.python è bello, ma nella mia (limitata) esperienza, è stato difficile per noi per ottenere la compilazione per i nostri ambienti diversi ed è stato abbastanza pesante.Si ha (a mio parere) lo svantaggio di necessitare di Spinta.Per alcuni, questo potrebbe non essere un problema, ma se non hai bisogno di Boost (o non lo si utilizza), si introduce una tonnellata di codice per ottenere Spinta.python di lavoro.YMMV.

Abbiamo costruito Lua in applicazioni su più piattaforme (win32, Xbox360 e PS3).Credo che lavorare su x64.Il suggerimento di utilizzare Luabind è buona.Si conclude scrivendo la nostra interfaccia tra i due e anche se non è troppo complicato, visto che il codice colla vi farà risparmiare un sacco di tempo e forse di aggravamento.

Con entrambe le soluzioni, però, il debug può essere un dolore.Siamo spiacenti, non hanno una buona soluzione per il debug di script Lua che sono incorporati nella nostra app.Dal momento che non abbiamo utilizzato python nella nostra app non posso parlare di quali strumenti potrebbero essere disponibili, ma un paio di anni fa, il paesaggio era all'incirca le stesse poveri di debug.Avendo scripting per estendere la funzionalità è bello, ma i bug negli script può causare problemi e potrebbe essere difficile da individuare.

Il codice Lua di per sé è una sorta di disordinato a lavorare se è necessario apportare le modifiche.Abbiamo visto i bug in Lua codebase stesso, che erano difficili da rintracciare.Ho il sospetto che Boost::Python potrebbe avere problemi simili.

E con qualsiasi linguaggio di scripting, non è necessariamente una soluzione per i "non programmatori" per estendere le funzionalità.Potrebbe sembrare così, ma è probabile che il vento spendere una discreta quantità di tempo debug di script o forse anche Lua.

Detto questo, siamo stati molto felici con il Lua e hanno spedito in due partite.Siamo spiacenti, non hanno intenzione di abbandonare la lingua.Tutto in tutti, e l'abbiamo trovata meglio rispetto ad altre alternative che sono disponibili un paio di anni fa.Python (e IronPython) sono altre scelte, ma sulla base dell'esperienza, sembrano più pesante di Lua.Mi piacerebbe sentire altre esperienze in là, però.

Altri suggerimenti

Posso consiglia di dare un'occhiata a Luabind.Rende molto semplice per integrare Lua nel codice C++ e viceversa.È anche possibile esporre intere classi C++ per essere utilizzato in Lua.

La vostra scommessa migliore è quello di incorporare lua (www.lua.org) o python (www.python.org).Entrambi sono utilizzati nell'industria del gioco e sia l'accesso extern "C" funzioni relativamente semplice con lua avere un bordo qui (perché i tipi di dati sono più facili da tradurre tra lua e C).L'interfacciamento ad oggetti C++ sarà un po ' più di lavoro da parte vostra, ma si può anche cercare come fare questo su Google, o su lua, python o forum di discussione.

Mi auguro che aiuta!

Si può sicuramente fare quello che vuoi con Python. Qui ci sono i documenti sull'incorporamento di Python in un'applicazione. Sono abbastanza sicuro Lua sarebbe un lavoro troppo, io so solo che hanno meno familiarità con esso.

Stai descrivendo cooperativa multi-tasking, in cui lo script deve chiamare una Pausa o di Attendere funzione periodica.Forse una soluzione migliore sarebbe quella di eseguire il linguaggio di scripting nel suo thread, e quindi utilizzare i mutex o senza blocco code per le interfacce tra il linguaggio di scripting e il resto del programma.Che modo un buggy script che non chiama il Break() abbastanza spesso non possono accidentalmente congelare il vostro programma.

Date un'occhiata al Boost.Python biblioteca.Sembra che dovrebbe essere abbastanza semplice per fare quello che vuoi.

Guarda SORSO.Io l'ho usato per l'interfaccia con Python, ma supporta molte altre lingue.

Uno più votare per Lua.È piccolo, è veloce, non occupare troppa memoria (per i giochi la vostra scommessa migliore è quello di allocare grande buffer di inizializzazione e di re-indirizzare tutte Lua allocazioni di memoria c').Abbiamo usato tolua per generare associazioni, ma ci sono altre opzioni, la maggior parte di loro molto più piccolo e facile da usare (IMO) di spinta.python.

Come per il debug Lua (se si va questa strada), sono stato con DeCoda, e non è stato male.Si finge di essere un IDE, ma quasi non riesce, ma è possibile allegare Il processo di debug di visual studio, e andare giù la chiamata stack nei punti di interruzione.Molto utile per tenere traccia di bug.

È anche possibile incorporare C/C++ script utilizzando Ch.Sto usando per un progetto di gioco a cui sto lavorando, e lo fa bene.Bel mix di potenza e capacità di adattamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top