Quali problemi potrebbero verificarsi se si utilizzano sia l'API MonoGame sia l'API grafica sottostante?


10

In quali tipi di problemi si potrebbe incontrare se si stesse giocando con MonoGame e iniziando a chiamare anche l'API grafica sottostante?

Ad esempio, se volessi fare qualcosa in un progetto MonoGame che MonoGame non necessariamente supportava, o semplicemente non riuscivo a trovare la documentazione / esempio corretta ma potevo trovare un esempio di come farlo in OpenTK, sono io? mi sto mettendo in difficoltà se lo implemento usando OpenTK direttamente mentre utilizzo l'API MonoGame ovunque? In particolare sto cercando di scoprire se ci sono grandi problemi noti che potrebbero derivarne e non qualcosa di oscuro che accadrà in casi molto rari.

Ho provato a fare una piccola ricerca tramite Google e il sito GD.SE stesso e non sono riuscito a trovare molto. Forse MonoGame ha davvero coperto la maggior parte delle sue basi, ma cosa succede se volessi aggirare manualmente uno dei suoi problemi in sospeso o una funzionalità che non è ancora stata implementata?

In caso affermativo, quali tipi di problemi potrebbero sorgere e ci sono modi per mitigarli?

Risposte:


12

Nella maggior parte dei casi questi problemi rientrerebbero nella categoria di "comportamento indefinito" (non nel senso C ++, ma in una comprensione più ampia).

Quello che faresti è essenzialmente eludere l'astrazione fornita da MonoGame (ad esempio, questo ovviamente si applica praticamente a qualsiasi API di livello superiore). In tal modo, è possibile causare la violazione delle garanzie invarianti di classe, il che a sua volta significa che le ipotesi con cui gli autori di MonoGame sono stati in grado di scrivere il proprio codice potrebbero non essere più vere e il codice potrebbe comportarsi in modo imprevisto. Il tuo codice non può più fare affidamento sulle invarianti garanzie dell'astrazione, dal momento che le hai infrante.

Questo comportamento imprevisto includerà, potenzialmente, l'intera gamma di tale comportamento, dai semplici artefatti di rendering agli arresti anomali o al danneggiamento della memoria.

  • Ad esempio, se giocherelli con un po 'di stato dell'API di rendering eseguendo l'esecuzione in giro per MonoGame stesso, potrebbe non essere in grado di rilevare quel cambiamento di stato (poiché probabilmente non eseguirà il polling dell'API sottostante per le modifiche, è più efficiente semplicemente supponiamo che sia quello che controlla l'API e tiene traccia delle modifiche stesse). Di conseguenza, al prossimo passaggio di rendering potrebbe decidere che non è necessario aggiornare qualcosa che dovrebbe in effetti essere aggiornato e che la scena potrebbe non essere visualizzata correttamente.

  • Oppure potresti confondere con l'API sottostante e modificare il conteggio dei riferimenti di alcuni oggetti dispositivo (supponendo D3D), il che significa che potrebbe essere rilasciato prematuramente da MonoGame o accidentalmente non rilasciato, con conseguente probabile arresto anomalo o perdita di risorse.

  • Oppure potresti fare qualcosa che funzioni, ma poiché ti stai agitando in modo non supportato e con funzionalità non documentate o schemi di accesso imprevisti, potresti trovare il tuo codice orribilmente rotto alla prossima versione.

  • Oppure potresti fare qualcosa, funziona bene per alcune versioni, ma in seguito ti imbatti in qualche altro bug e hai difficoltà a rintracciarlo, quindi chiedi aiuto alla gente di MonoGame, magari inviando una segnalazione di bug perché sei sicuro che sia un problema nel loro codice. Non possono riprodurre il bug, ovviamente, e finalmente viene fuori che stai facendo questo strano hackery ad accesso diretto ea quel punto - indipendentemente dal fatto che il tuo hackery sia o meno la causa principale del bug - loro probabilmente smetterai di spendere risorse per la tua correzione semplicemente perché stai facendo una cosa non supportata (o almeno, probabilmente ti declasseranno).

Naturalmente, in alcuni casi potrebbe essere assolutamente necessario eludere l'API, forse per aggirare un bug nel software di spedizione per il quale la patch ufficiale non verrà rilasciata in tempo. Se è assolutamente necessario per fare questo, si dovrebbe prendere l'approccio morbido: cercare di ambito l'accesso diretto quanto più possibile precisa, e assicurarsi che si tenta di lasciare lo stato delle API sottostante immodificato possibile quando si è finito con la vostra ingerenza . Non è una garanzia di successo, ma può aiutare.

Idealmente, eviterai del tutto questo genere di cose, però.


3

Concordo pienamente con la risposta di Josh, ma vorrei aggiungere alcuni pensieri.

Lo scopo di MonoGame è portare l'API XNA su molte piattaforme. Se stai usando OpenTK direttamente ti stai limitando solo a quelle piattaforme che lo supportano. Pertanto, potresti perdere uno dei principali vantaggi dell'utilizzo dell'astrazione.

Se ti accorgi di voler fare qualcosa che MonoGame non supporta o hai problemi a trovare la documentazione, fai prima la domanda più specifica su cosa stai cercando di fare. Potresti scoprire che esiste già un modo per farlo o forse è una funzionalità pianificata che non è stata ancora implementata.

Dopo averne discusso, è possibile che tu, o qualcun altro, sia possibile implementare le funzioni mancanti in MonoGame a beneficio di tutti.


3

Riguardo a come mitigare i problemi che sorgono nel combinare queste due idee:

MonoGame è open source, modificalo direttamente e non devi preoccuparti dei problemi derivanti dall'uso di entrambi.

Se pensi di aver bisogno di roba aggiuntiva, allora sicuramente: crea un fork. Usa quel codice base e aggiungi il tuo sopra di esso. Ricompila MonoGame e il gioco è fatto. Ciò ti consentirebbe anche di aggiornare il fork di MonoGame quando viene aggiornato (ovviamente dovrai correggere eventuali conflitti che potrebbero sorgere nel processo).


Chiunque abbia votato verso il basso, per favore, dì la tua ragione, così posso imparare la prossima volta se senti che ho scritto qualcosa di sbagliato.
Timotei

1
Come risponde alla domanda?

1
Bene, si potrebbe eludere qualsiasi problema derivante dalla combinazione di questi due (monogame + API sottolineata) modificando direttamente la fonte del monogame (ovvero, in un unico posto). Si prega di notare la sua ultima domanda: "In tal caso, che tipo di problemi potrebbero sorgere e ci sono modi per aiutare a mitigare questi problemi?"
Timotei,

Buon punto Timotei, ho fatto una piccola modifica per rendere un po 'più chiaro quale sia la tua risposta.
MichaelHouse

Mi piace questo punto. Penso che avrebbe davvero più senso tentare di trovare un posto appropriato all'interno del monogame per implementare una funzionalità piuttosto che implementarla specificamente nella propria libreria di giochi. Ci sono ovvie insidie ​​nel non comprendere correttamente il monogame e nel metterlo ancora in atto in modo errato, ma questo è un altro problema.
SpartanDonut
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.