ArsLudica.org Forum

Effettua l'accesso o una nuova registrazione.

Inserisci il nome utente, la password e la durata della sessione.
Ricerca avanzata  

News:

Autore Topic: Bachi/funzioni non implementate su OpenGL ES per Android?  (Letto 3175 volte)

Id

  • Hero Member
  • *****
  • Offline Offline
  • Post: 929
  • [rend, slaughter, devour]
    • Mostra profilo
Bachi/funzioni non implementate su OpenGL ES per Android?
« il: Aprile 17, 2011, 17:37:29 »

Id, Android supporta OpenGL ES 1.1 oppure 2.0. Anche a me farebbe comodo che iOS supportasse XNA 4.0, ci metteremo un decimo a fare le cose. Non credo che ci sia un modo più sbagliato di fare le cose che pretendere che una piattaforma faccia qualcosa che non può fare. Tra le altre cose dalla prima release di Android la roadmap tracciata ha messo in chiaro che ci sarebbe stato ES 1.1 in attesa di passare stabilmente a tutto il feature set del 2.0.

Taglio che non ho tempo. Al limite aggiungo qcosa piu' tardi.
glIsTexture, cosi' per dire, e' OpenGL ES 1.1, infatti non e' implementata.
Poi magari Android 2.2. dice di supportare OpenGL ES 1.1, pero' intanto quella funzione non c'e' ne' su diversi device ne' sull'emulatore. Ed e' solo la prima che mi viene in mente su due piedi. Altre sono buggate, punto e basta. Certo, c'e' il workaround, ma secondo me non e' un ambiente maturo, tutto qui.  

O magari sono io che sbaglio e devo provare a chiedergliela con meno arroganza. Ma dubito che si fixino i bug e si implementino le funzioni solo per quello.  
« Ultima modifica: Aprile 17, 2011, 18:23:39 da Ziggybee »
Connesso
Stand or fall, no middle ground at all - Faedalien (Unlimited SaGa)

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Bachi su OpenGL ES per Android
« Risposta #1 il: Aprile 17, 2011, 17:47:26 »

Id, Android supporta OpenGL ES 1.1 oppure 2.0. Anche a me farebbe comodo che iOS supportasse XNA 4.0, ci metteremo un decimo a fare le cose. Non credo che ci sia un modo più sbagliato di fare le cose che pretendere che una piattaforma faccia qualcosa che non può fare. Tra le altre cose dalla prima release di Android la roadmap tracciata ha messo in chiaro che ci sarebbe stato ES 1.1 in attesa di passare stabilmente a tutto il feature set del 2.0.

Taglio che non ho tempo. Al limite aggiungo qcosa piu' tardi.
glIsTexture, cosi' per dire, e' OpenGL ES 1.1, infatti non e' implementata.
Poi magari Android 2.2. dice di supportare OpenGL ES 1.1, pero' intanto quella funzione non c'e' ne' su diversi device ne' sull'emulatore. Ed e' solo la prima che mi viene in mente su due piedi. Altre sono buggate, punto e basta. Certo, c'e' il workaround, ma secondo me non e' un ambiente maturo, tutto qui. 

O magari sono io che sbaglio e devo provare a chiedergliela con meno arroganza. Ma dubito che si fixino i bug e si implementino le funzioni solo per quello. 
Ma se è un'API Level 4 (Android 1.6)?

Ma che target avete? Che hardware usate?

Ho fatto una ricerca sul web e non risultano problemi simili a nessuno, il che è strano (nemmeno a me è mai capitato, e abbiamo target Android 2.1, di solito).

Sull'emulatore il supporto OpenGL è quello del PC sottostante esattamente come con succede con quello iOS. In generale non è affidabile come piattaforma per i test del 3D, per cui si consiglia sempre di fare test e debug direttamente dal device.

L'ho provata al volo qui da me e la funzione c'è eccome!

Ma che errore è? Il solito "LibES not implemented exception"?

Sui bug, quello è il mondo di OpenGL fuori dalle console.
Anche sulle varie generazioni di device Apple ci sono bachi.
« Ultima modifica: Aprile 17, 2011, 18:24:26 da Ziggybee »
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #2 il: Aprile 17, 2011, 18:34:18 »

Un'altra cosa ma come è architettato il codice?

Nel senso come ci arrivate a fare le chiamate native?

Mescolare codice Java e JNI come si fa in iOS con ObjC e C++ è sconsigliato per le stesse identiche ragioni: non tutto si converte in andata e ritorno e ci sono parecchi scenari in cui si ottengono interazioni inefficienti e distruttive.

Sulla board ufficiale per il supporto agli sviluppatori Android che dicono di queste anomalie?

Io una ricerca l'ho fatta e nessuno ha mai segnalato problemi simili, se non in altri contesti dovuti ad errori banali (tipo chiamare API 1.1 da un contesto 2.0 e viceversa, o per i limiti dell'emulatore).
« Ultima modifica: Aprile 17, 2011, 18:59:21 da Ziggybee »
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

StM

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 9.424
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #3 il: Aprile 17, 2011, 20:06:57 »

Non fai un po' troppe domande indiscrete, Anè'? ;D
Connesso

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #4 il: Aprile 17, 2011, 20:19:22 »

E' che a noi anomalie così gravi non sono mai successe, quindi sono curioso...

Noi però usiamo sempre e solo due approcci: OpenGL ES Managed da Dalvik (che spesso funziona meglio di quello nativo, specie se devi interagire con il "software sovrastante" diciamo così), oppure un modulo esclusivamente nativo, che viene chiamato da un'app dalvik all'avvio e poi gira in nativo sino alla fine del processo (o ad un evento di sistema).

Sorprendentemente il secondo metodo non sempre dà i risultati migliori in termini di prestazioni. Ci siamo scontrati con qualche baco di implementazione di OpenGL ES (che dipende dal chip usato e che comunque sono problemi localizzati a piccole differenze di implementazione che ci sono e ci saranno sempre per OpneGL) ma mai in problemi così macroscopici. Essì che abbiamo un codice di init particolarmente robusto ma mica siamo id Software...
« Ultima modifica: Aprile 17, 2011, 20:26:53 da Ziggybee »
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

Id

  • Hero Member
  • *****
  • Offline Offline
  • Post: 929
  • [rend, slaughter, devour]
    • Mostra profilo
Re: Bachi su OpenGL ES per Android
« Risposta #5 il: Aprile 18, 2011, 09:54:07 »

Id, Android supporta OpenGL ES 1.1 oppure 2.0. Anche a me farebbe comodo che iOS supportasse XNA 4.0, ci metteremo un decimo a fare le cose. Non credo che ci sia un modo più sbagliato di fare le cose che pretendere che una piattaforma faccia qualcosa che non può fare. Tra le altre cose dalla prima release di Android la roadmap tracciata ha messo in chiaro che ci sarebbe stato ES 1.1 in attesa di passare stabilmente a tutto il feature set del 2.0.

Taglio che non ho tempo. Al limite aggiungo qcosa piu' tardi.
glIsTexture, cosi' per dire, e' OpenGL ES 1.1, infatti non e' implementata.
Poi magari Android 2.2. dice di supportare OpenGL ES 1.1, pero' intanto quella funzione non c'e' ne' su diversi device ne' sull'emulatore. Ed e' solo la prima che mi viene in mente su due piedi. Altre sono buggate, punto e basta. Certo, c'e' il workaround, ma secondo me non e' un ambiente maturo, tutto qui. 

O magari sono io che sbaglio e devo provare a chiedergliela con meno arroganza. Ma dubito che si fixino i bug e si implementino le funzioni solo per quello. 
Ma se è un'API Level 4 (Android 1.6)?

Ma che target avete? Che hardware usate?

Ho fatto una ricerca sul web e non risultano problemi simili a nessuno, il che è strano (nemmeno a me è mai capitato, e abbiamo target Android 2.1, di solito).

Sull'emulatore il supporto OpenGL è quello del PC sottostante esattamente come con succede con quello iOS. In generale non è affidabile come piattaforma per i test del 3D, per cui si consiglia sempre di fare test e debug direttamente dal device.

L'ho provata al volo qui da me e la funzione c'è eccome!

Ma che errore è? Il solito "LibES not implemented exception"?

Eh, gia', e' quello. "Il solito".
Ma com'e' che un bug diventa "il solito" se la piattaforma e' buona?

Cmq, il target e' android 2.2.
E' che testare e debuggare sul device e' un po' un problema, perche' l'engine e' multithreaded (il thread principale fa partire tutto, poi viene spawnato un secondo thread nativo (al quale viene attaccata una vm con l'api apposita), e per via di un altro bug su gdbserver documentato qui (http://code.google.com/p/android/issues/detail?id=9713) o si jailbreaka il device o non c'e' verso.
Connesso
Stand or fall, no middle ground at all - Faedalien (Unlimited SaGa)

TheGentleman

  • Old Member
  • ****
  • Offline Offline
  • Post: 388
  • Let's fight like gentlemen.
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #6 il: Aprile 18, 2011, 11:16:58 »

OpenGL ES "managed" (non-nativo) è davvero migliore della controparte C?
A me sembra un wrapper vero e proprio, tant'è che non vuole buffer allocati nella heap della JVM.

Bachi di implementazione ne ho visti parecchi. Uno che m'ha fatto impazzire, se non ricordo male sul Samsung Galaxy S, è che GLint in alcune chiamate diventa stranamente un intero a 8 bit (le spec dicono che GLint deve avere almeno 32 bit).

Il punto è che se c'è un baco su iPhone o su una console, fai un workaround e non ci pensi più.
Ma su Android stai a chiederti: perché qui funziona e lì no?
« Ultima modifica: Aprile 18, 2011, 11:35:03 da TheGentleman »
Connesso
Ziggybee: "Id sei scandaloso!"

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #7 il: Aprile 18, 2011, 12:17:16 »

Ma per jailbreak intendi il root o roba veramente invasiva tipo recovery e flashing dei bootloader / modding del firmare? Che hardware è?

Rootare un device a fini di sviluppo nativo è una cosa che è prevista by design (è linux, linux funziona così), farlo con un device consumer non sempre è possibile (ad esempio i consumer HTC te lo impediscono a priori e hanno parte del kernel e delle partizioni di root criptate), questi produttori di solito hanno delle "versioni debug" per le aziende. Cosa dice il vostro produttore di hardware su questo?

Purtroppo il "bug" del debug multithreading nativo è una cosa nota (che fortunatamente si risolve ricompilando gdbserver in un certo modo, esattamente come avviene se fai native development su linux per le piattaforme embedded a singolo chip). Anche noi ci siamo scontrati con questo casino ma facevamo interventi sul SO... Nel nostro caso però tutto era più semplice perché il debug da emulatore è piuttosto affidabile, anche se poi sul device ci devi andare per il performance profiling...

Però occhio: Android 2.2 o inferiore supporta solo i thread managed per lo sviluppo end-user, quelli nativi non andrebbero usati per le applicazioni consumer (è nelle spec) ma solo a fini di sviluppo driver o del software nativo da includere con la distribuzione di un firmware. Questo potrebbe spiegare anche il problema che stai riscontrando sulle API OpenGL ES non implementate. Un processo spawnato nativamente ha dei limiti per aumentare l'efficienza della gestione della memoria.

Solo Anrdoid 2.3 supporta i thread nativi al 100% delle funzionalità con debug e tutto per lo sviluppo end-user (e non mi pare serva nemmeno il root), perché è la prima piattaforma a supportare i chip multicore anche per lo userspace. Infatti con gli SDK 2.3 fai tutto. Francamente io non ti consiglio di usare il 2.3 in sviluppo se targettate il 2.2 ma nemmeno di usare qualcosa per il 2.2 che non dovrebbe essere usato...

Hai provato a fare un POC tutto basato su Dalvik che faccia quelle cose? Non è detto che vada peggio, visto che devi fare affidamento sul multithreading (e quello managed è molto più reattivo di quello nativo perché l'SO e la CPU non fanno context switching, quindi vai leggero anche sulla cache della CPU).

Basta usare i criteri di ottimizzazione adeguati (un buon punto di partenza è leggere qualcosa per il performance computing su Java e poi andare nello specifico di Android).

Premesso che non posso sapere tutto il contesto completo, io farei così.

Mi fermerei un attimo dal fare e cercherei di capire bene cosa mi serve, cosa mi offre Android e se la piattaforma di riferimento scelta è realmente quella giusta, visto la pletora di problemi che stai avendo.

L'approccerei come iOS: invece di cercare workaround solo perché si possono fare porcate, mi limiterei a capire cosa posso fare con quello che ho a disposizione, senza fare troppi smanettamenti strani (anche perché poi c'è l'approvazione). Voglio dire, se le basi sono queste e non avete altre alternative, siete sicuri che poi tutto vada? Io mica tanto. Eppure la gente di giochi o software che usa massicciamente il 3D ne fa, quindi un altro metodo deve esistere, o no? Sarebbe assurdo pensare che chiunque debba fare tutti questi casini e che nessuno si lamenti troppo della cosa.

Occhio che questo potrebbe comportare due scelte: adeguare i due motori ad una nuova filosofia che sia più portabile oppure fare due engine separati che condividono le stesse interfacce & API (questa è la scelta che alla fine fanno tutti: costa un po' di più inizialmente ma il ritorno in termini di qualità dei prodotti è immenso).

Se ti può aiutare parecchie aziende con cui ho lavorato hanno engine 3D implementato su Dalvik.
Anche Unity a quanto pare cercherà di mettere a fattor comune più Dalvik possibile per arrivare sui device di fasci bassa (altro problema del codice nativo: vuole più RAM e quindi non gira su molti device entry-level).

Toglimi un'altra curiosità ma anche su iOS avete codice multithreaded *reale* (iOS 4 per capirci)?

Sulla normalità di OpenGL implementato alla cdc (o anche di DirectX se è per questo):

Hai mai provato a far girare codice iOS2 o 3 su un device iOS4? C'è una differenza abissale anche tra un 3G ed un 3GS, specie se il codice non gestisce le estensioni a modino. Ricordi quando ci fù il famoso update che lasciò i 3G lenti tanto da essere quasi inutilizzabili? Una svista, tra le altre cose, anche sul supporto per il vecchio codice legacy OpenGL ES.

Chi passa da Android a Apple ha lo stesso, identico problema, quindi non è un caso di Android è migliore o va giustificato. Nel rendering raramente anche i chip sequenziali di uno stesso produttore sono privi di sbavature, specie quelli su arrotondamenti e altri cazzi, che spesso sono un male minore per avere un'architettura hardware più efficiente. Mi ci gioco che anche il 3DS o NGP avranno problemi simili (per la cronaca il chip custoom dell'Xperia Play ,che dovrebbe essere simile a quello di NGP, senza i wrapper proprietari funziona ma anche no).

Quindi si, è normale come tutti gli sviluppi multipiattaforma, sul mobile poi la cosa si acuisce perché il requisito trainante è l'efficienza energetica.
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

Id

  • Hero Member
  • *****
  • Offline Offline
  • Post: 929
  • [rend, slaughter, devour]
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #8 il: Aprile 18, 2011, 12:51:15 »

Ma per jailbreak intendi il root o roba veramente invasiva tipo recovery e flashing dei bootloader / modding del firmare? Che hardware è?

Rootare un device a fini di sviluppo nativo è una cosa che è prevista by design (è linux, linux funziona così), farlo con un device consumer non sempre è possibile (ad esempio i consumer HTC te lo impediscono a priori e hanno parte del kernel e delle partizioni di root criptate), questi produttori di solito hanno delle "versioni debug" per le aziende. Cosa dice il vostro produttore di hardware su questo?

Purtroppo il "bug" del debug multithreading nativo è una cosa nota (che fortunatamente si risolve ricompilando gdbserver in un certo modo, esattamente come avviene se fai native development su linux per le piattaforme embedded a singolo chip). Anche noi ci siamo scontrati con questo casino ma facevamo interventi sul SO... Nel nostro caso però tutto era più semplice perché il debug da emulatore è piuttosto affidabile, anche se poi sul device ci devi andare per il performance profiling...

Dipende dal device.
Il problema e' il gdbserver, e' installata la versione buggata e di default non ci sono i permessi per metterne un'altra.
Sull'emulatore si puo', ok; ma quando poi "quel device li' " ha un problema, il debug e' "a vista" o a colpi di log.
Tornando a monte del discorso: e' mia opinione che se uno si ritrova a debuggare cosi' perche' non ha scelta, il problema e' la piattaforma, non lui.

Però occhio: Android 2.2 o inferiore supporta solo i thread managed per lo sviluppo end-user, quelli nativi non andrebbero usati per le applicazioni consumer (è nelle spec) ma solo a fini di sviluppo driver o del software nativo da includere con la distribuzione di un firmware. Questo potrebbe spiegare anche il problema che stai riscontrando sulle API OpenGL ES non implementate. Un processo spawnato nativamente ha dei limiti per aumentare l'efficienza della gestione della memoria.

JNI ha delle funzioni per convertire un thread nativo in thread managed, e su Android funzionano benissimo. 

Solo Anrdoid 2.3 supporta i thread nativi al 100% delle funzionalità con debug e tutto per lo sviluppo end-user (e non mi pare serva nemmeno il root), perché è la prima piattaforma a supportare i chip multicore anche per lo userspace. Infatti con gli SDK 2.3 fai tutto. Francamente io non ti consiglio di usare il 2.3 in sviluppo se targettate il 2.2 ma nemmeno di usare qualcosa per il 2.2 che non dovrebbe essere usato...

Hai provato a fare un POC tutto basato su Dalvik che faccia quelle cose? Non è detto che vada peggio, visto che devi fare affidamento sul multithreading (e quello managed è molto più reattivo di quello nativo perché l'SO e la CPU non fanno context switching, quindi vai leggero anche sulla cache della CPU).

Quindi non mi consigli di usare il 2.3 se targetto il 2.2. Giusto.
Ma non mi consigli neanche il 2.2, per via del multithread nativo. Giusto anche questo (ma se non va fatto, perche' ci sono i sample? vabbe').
Mi e' sfuggito il consiglio su cosa usare, pero'.

Torno a monte del discorso: non ho nessuno di questi problemi con iOS. Mi piacerebbe - da programmatore - che il mio lavoro consista nel programmare, non nel diventare mongolo dietro a bug della piattaforma/IDE/debugger non collaborativi, e in questo, a mio giudizio, Apple ha fatto un lavoro migliore; viceversa, Android da questo punto di vista e' una delle piattaforme peggiori su cui ho lavorato.
Connesso
Stand or fall, no middle ground at all - Faedalien (Unlimited SaGa)

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #9 il: Aprile 18, 2011, 12:53:42 »

OpenGL ES "managed" (non-nativo) è davvero migliore della controparte C?
A me sembra un wrapper vero e proprio, tant'è che non vuole buffer allocati nella heap della JVM.

Bachi di implementazione ne ho visti parecchi. Uno che m'ha fatto impazzire, se non ricordo male sul Samsung Galaxy S, è che GLint in alcune chiamate diventa stranamente un intero a 8 bit (le spec dicono che GLint deve avere almeno 32 bit).

Il punto è che se c'è un baco su iPhone o su una console, fai un workaround e non ci pensi più.
Ma su Android stai a chiederti: perché qui funziona e lì no?

OpenGL ES managed è un wrapper, vero. E' questo che per molti è insostituibile. Per farti un'esempio: in nativo se chiami una API che non è supportata (non dovresti mai arrivarci, perché ci sono le stringhe per le estensioni, come su PC o Mac), hai un'eccezione e l'app termina.

Sul managed, di solito, al massimo arrivi all'emulazione software (sempre che non sia possibile al wrapper comporre diverse chiamate OpenGL ES 1.0 per realizzare la stessa funzione).

Se il managed sia migliore del nativo va valutato da come è scritta l'applicazione ma posso dirvi che per la mia esperienza, la maggior parte di chi fa 3D lo fa managed e senza grossi problemi. Qualche vantaggio ci sarà no? Oppure gli sviluppatori Android sono le persone più discrete del mondo e non si incazzano mai.

La cosa vera è che uno non è che deve domandarsele le cose: ci sono cose che si possono fare e cose che non si possono fare. Sul mobile pianificare bene è l'unica cosa che paga anche sul lungo termine e no, non smetterò mai di dirlo, non è assolutamente vero che tutti gli iDevice sono uguali e basta fare le cose bovinamente. O meglio, è vero se uno si ferma alla versione current e via così, ma quella è una buona ricetta per fallire commercialmente. Il casino tra 3G-3GS non è un caso. Chi ha prodotti nati per 2G ha avuto problemi a coordinare le differenze senza interrompere il supporto immediatamente alle piattaforme più vecchie e lo stesso è accaduto nel passaggio 3-4 (con l'aggravante del 3GS che è quasi 4 ma non proprio). Poi c'è l'iPad ed ora l'iPad 2 che al momento è incasinato di bachi come tutte le prime release. Insomma, non è così vero e scontato.

Sulle particolarità dei device, spesso sono particolarità sui chip grafici, non dei produttori. Crediateci o no sono documentate, non vanno scoperte. Se c'è una strategia di produzione ci sarà un elenco dei device dove andare per forza, da questi si potrà tirare fuori un elenco dei chip sul mercato e indagare quali sono le API più affidabili e i workaround noti e necessari. Fatto questo si inzia a sviluppare. Sembra un processo lungo ma in realtà è roba piuttosto semplice per chi ha esperienza (roba di pochi giorni). E' un problema? Eppure su Mac o PC è molto peggio ma nessuno si lamenta troppo, nemmeno gli indie che fanno numeri molto più bassi di quelli attesi da App Store o Android Market... Come faranno mai?

Io non sono certo di quale sia la strategia migliore ma so per certo che dopo circa un anno anche su iOS i nodi inziano a venire al pettine. A meno di giochi veramente molto semplici. Non so se sia meglio conoscerli subito o posticiparli... Ci sono parecchi vecchi giochi top rated che hanno risentito tantissimo del non essere iOS 4 ready o iPad ready. Lo stesso Infinity Blade a dare per scontato un supporto per iPad 2 perfetto ha avuto settimane di feedback mediocri, visto che il titolo semplicemente crashava, per non parlare di Rage HD.

Se lo succedeva a Manelli's Simulator, adesso stavo a zappare i pomodori, perché mica sono Epic, io!

Francamente gli stessi problemi ci sono su Android ma non mi paiono molto peggiori, né per quantità né per durata nel tempo di eventuali "disservizi".
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #10 il: Aprile 18, 2011, 13:34:34 »

Però occhio: Android 2.2 o inferiore supporta solo i thread managed per lo sviluppo end-user, quelli nativi non andrebbero usati per le applicazioni consumer (è nelle spec) ma solo a fini di sviluppo driver o del software nativo da includere con la distribuzione di un firmware. Questo potrebbe spiegare anche il problema che stai riscontrando sulle API OpenGL ES non implementate. Un processo spawnato nativamente ha dei limiti per aumentare l'efficienza della gestione della memoria.

JNI ha delle funzioni per convertire un thread nativo in thread managed, e su Android funzionano benissimo.  

Beh, benissimo, aspettiamo un'attimo. Dipende come lo usi. Se hai una funzione render() che invochi in nativo la differenza non si nota. Entrare ed uscire dal contesto ha un costo piuttosto alto...

Io seguirei le best pratcice che prevedono di wrappare il codice per frame, logica (render(), physics(), ai()) o per componente al fine di evitare al minimo il cambio di contesto e il passaggio di troppi dati da dentro e fuori. Fare pipelining aiuta molto.

Solo Anrdoid 2.3 supporta i thread nativi al 100% delle funzionalità con debug e tutto per lo sviluppo end-user (e non mi pare serva nemmeno il root), perché è la prima piattaforma a supportare i chip multicore anche per lo userspace. Infatti con gli SDK 2.3 fai tutto. Francamente io non ti consiglio di usare il 2.3 in sviluppo se targettate il 2.2 ma nemmeno di usare qualcosa per il 2.2 che non dovrebbe essere usato...

Hai provato a fare un POC tutto basato su Dalvik che faccia quelle cose? Non è detto che vada peggio, visto che devi fare affidamento sul multithreading (e quello managed è molto più reattivo di quello nativo perché l'SO e la CPU non fanno context switching, quindi vai leggero anche sulla cache della CPU).

Quindi non mi consigli di usare il 2.3 se targetto il 2.2. Giusto.
Ma non mi consigli neanche il 2.2, per via del multithread nativo. Giusto anche questo (ma se non va fatto, perche' ci sono i sample? vabbe').
Mi e' sfuggito il consiglio su cosa usare, pero'.

Torno a monte del discorso: non ho nessuno di questi problemi con iOS. Mi piacerebbe - da programmatore - che il mio lavoro consista nel programmare, non nel diventare mongolo dietro a bug della piattaforma/IDE/debugger non collaborativi, e in questo, a mio giudizio, Apple ha fatto un lavoro migliore; viceversa, Android da questo punto di vista e' una delle piattaforme peggiori su cui ho lavorato.

Ti sei risposto da solo e già te l'ho scritto: fai quello che puoi fare, non quello che non puoi fare, forzando il sistema. Esattamente come faresti su iOS, non credo che lì ti metti a smanettare nei meandri dell'SO jailbreakato per arrivare a fare, che ne so, le stesse cose che potevi fare su PS2, no?

Mettiti nei panni di Epic: hanno rilasciato infinity blade su iPad 2 e non ha funzionato un cazzo per settimane abbassando sensibilmente la medi all'app: pensi che hanno portato il vecchio core grafico di iPad su iPad 2 o hanno inziato a capire cosa potevano aggirare, visto che Apple ancora non ha presentato la documentazione ufficiale per garantire la retrocompatibilità sulle nuove GPU e sulla nuova architettura dual core?

Esposto così mi pare piuttosto chiaro che il problema sia "voglio iOS su Android". Non lo avrai mai. Stop. E' un discorso fuori della logica. Se porti un'applicazione da PC a Mac la riscrivi quasi tutta non ti porti windows su PC o il Mac su Windows. Uguale se la porti da una console all'altra.

Non capisco che vuol dire "io sono un programmatore e voglio programmare" e cosa staresti facendo, scusa? Programmare è risolvere problemi, molti dei quali (anzi, quasi tutti) sono a monte del codice. Capito questo avrai risolto gran parte dei tuoi problemi.

Ogni piattaforma ha le sue peculiarità, devi sfruttarle, non abbatterle perché ne vorresti avere altre. Chi ti garantisce che i tuoi "fix" reggano al tempo? Before hacking. Start thinking!

Per essere chiari il mio consiglio è: se devi fare un engine per portare un gioco, la parte core dell'engine riscrivila secondo le specifiche del sistema operativo target. Se l'engine è fatto bene, non avrai problemi a metterci il codice del gioco su senza alcuna o con pochissime modifiche. Avrai molti meno problemi a mantenere le due versioni (che tanto non si evolveranno lo stesso in modi perfettamente paralleli) e non avrai codice dipendente da hack il cui futuro sarà piuttosto dubbio.
L'altra alternativa è pensare ad un software third party che dia queste garanzie. E qui entra in gioco la pianificazione strategica (che non è detto non possa proporre tu, visto che sei l'esperto).

A quel punto dovrai gestirti le discrepanze di OpenGL. Vabbene. Non c'è mai morto nessuno: si tratta di fare una lista della spesa. Il problema è un'altro: ma questa lista della spesa ve l'hanno comunicata? Se non sapete quali sono i dispositivi più importanti per le vostre esigenze commerciali, potreste menare il can per l'aia per settimane e fare un lancio disastroso (per la cronaca: qualcuno mi paga per dare questi consigli scontati, eh!).

Questo per cultura personale:

Mi parli così bene di iOS ma lo sai che la versione che avete usato voi per Master of Alchemy credo fosse la prima con un multithreading quasi reale? (Prima c'era una specie di preemption un po' zoppa se la caricavi troppo). Cosa avresti fatto prima? Perché andare di multithreading su dispositivi single core?
« Ultima modifica: Aprile 18, 2011, 13:48:33 da Ziggybee »
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

TheGentleman

  • Old Member
  • ****
  • Offline Offline
  • Post: 388
  • Let's fight like gentlemen.
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #11 il: Aprile 18, 2011, 13:49:33 »

Se il managed sia migliore del nativo va valutato da come è scritta l'applicazione ma posso dirvi che per la mia esperienza, la maggior parte di chi fa 3D lo fa managed e senza grossi problemi. Qualche vantaggio ci sarà no? Oppure gli sviluppatori Android sono le persone più discrete del mondo e non si incazzano mai.
L'unico vantaggio che vedo è evitare le beghe della comunicazione tra native layer e Dalvik, visto che fino a 2.3 come giustamente dici il supporto alle NativeActivity arriva da quella versione (si saranno accorti che nonostante quello che dicano i java evangelist, le performance rimangono comunque peggiori di quelle native, specie su device embedded, e Dalvik fa JIT da 2.2 in poi).

La cosa vera è che uno non è che deve domandarsele le cose: ci sono cose che si possono fare e cose che non si possono fare. Sul mobile pianificare bene è l'unica cosa che paga anche sul lungo termine e no, non smetterò mai di dirlo, non è assolutamente vero che tutti gli iDevice sono uguali e basta fare le cose bovinamente. O meglio, è vero se uno si ferma alla versione current e via così, ma quella è una buona ricetta per fallire commercialmente. Il casino tra 3G-3GS non è un caso. Chi ha prodotti nati per 2G ha avuto problemi a coordinare le differenze senza interrompere il supporto immediatamente alle piattaforme più vecchie e lo stesso è accaduto nel passaggio 3-4 (con l'aggravante del 3GS che è quasi 4 ma non proprio). Poi c'è l'iPad ed ora l'iPad 2 che al momento è incasinato di bachi come tutte le prime release. Insomma, non è così vero e scontato.
Sono su iPhone OS quando appunto si chiamava iPhone OS e c'era la 2.0, so benissimo che ci sono differenze. Il punto è: quante, per quanti modelli. Android, appunto, è come Windows.

Sulle particolarità dei device, spesso sono particolarità sui chip grafici, non dei produttori. Crediateci o no sono documentate, non vanno scoperte. Se c'è una strategia di produzione ci sarà un elenco dei device dove andare per forza, da questi si potrà tirare fuori un elenco dei chip sul mercato e indagare quali sono le API più affidabili e i workaround noti e necessari. Fatto questo si inzia a sviluppare. Sembra un processo lungo ma in realtà è roba piuttosto semplice per chi ha esperienza (roba di pochi giorni). E' un problema? Eppure su Mac o PC è molto peggio ma nessuno si lamenta troppo, nemmeno gli indie che fanno numeri molto più bassi di quelli attesi da App Store o Android Market... Come faranno mai?
So che sono "particolarità" dei chip e di chi ne produce i driver. Ma le particolarità vere e proprie sono documentate, i "non conforme allo standard" spesso non lo sono. Per Epic sarà una questione di tempo/soldi: quanto tempo ci vuole a fare un port per iOS? E per Android? Saprai meglio di me che se i costi sono maggiori del ricavo atteso, è meglio non cominciare neanche.

Io non sono certo di quale sia la strategia migliore ma so per certo che dopo circa un anno anche su iOS i nodi inziano a venire al pettine. A meno di giochi veramente molto semplici. Non so se sia meglio conoscerli subito o posticiparli... Ci sono parecchi vecchi giochi top rated che hanno risentito tantissimo del non essere iOS 4 ready o iPad ready. Lo stesso Infinity Blade a dare per scontato un supporto per iPad 2 perfetto ha avuto settimane di feedback mediocri, visto che il titolo semplicemente crashava, per non parlare di Rage HD.

Se lo succedeva a Manelli's Simulator, adesso stavo a zappare i pomodori, perché mica sono Epic, io!
Su questo hai ragione. Forse ho fatto trasparire il contrario, ma so benissimo che a ogni nuova release di iOS (anche minor) bisogna fare un giro sulle vecchie app e fixare roba. Per fortuna gli sviluppatori hanno accesso alle beta. Il fatto che molti siano così naïf da non pensarci è un problema.

Francamente gli stessi problemi ci sono su Android ma non mi paiono molto peggiori, né per quantità né per durata nel tempo di eventuali "disservizi".
Io ti dico: con Android mi è capitato che lo stesso cellulare, con la stessa versione di OS, un modello sotto brand di carrier e l'altro no, si comportassero in maniera sufficientemente diversa su alcune cose. Parlo di Java, non di codice nativo.
Con iOS la quantità di problemi di questo tipo (che, ripeto, ci sono e non ho mai affermato il contrario) è molto minore.
Connesso
Ziggybee: "Id sei scandaloso!"

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #12 il: Aprile 18, 2011, 14:13:53 »

Vabbé i telefoni del carrier hanno limiti assurdi, se è per questo il tethering ed i limiti sui download da rete 3G su iOS nascono proprio per mettere d'accordo i carrier senza dargli campo libero sui firmware. Il secondo punto è talmente rognoso che l'editoria su app sta precipitosamente tornando ai contenuti web, invece che quelli scaricabili e Apple, per evitarlo ora dà una UIWebView sensibilmente più lenta e meno compliant rispetto al browser di bordo, per scoraggiarli.

Sono piattaforme che hanno i loro scazzi come la metti la metti, purtroppo.

Io credo solo che pretendere una compatibilità totale nel fare porting dall'una all'altra è utopico ma, al tempo stesso, il fattore comune di hardware e GPU rende le cose molto più semplici (e non è un caso che telefoni più supportati su Android abbiano quasi tutti PowerVR SGX), rispetto ad altri contesti (tipo l'Xperia Play, per dirne una :)). Almeno per ci fa giochi e può slegarsi da aspetti meno proprietari delle API (dovreste sentire chi porta app complesse tra le due piattaforme, le differenze di OpenGL ES sono bazzecole a confronto all'avere un sistema comune e altrettanto affidabile per processare XML o web services...).

In tutto questo arriva MS e propone un approccio diverso, del tutto simile a quello che aveva portato al successo i PocketPC. Centralizzazione dell'OS, Hardware scolpito nella pietra, con l'esternalizzazione della manifattura. Ai developer piace molto e la piattaforma cresce bene, tanto che ci sono già due grossi analisti che pensano che dal 2014-2015 sarà una tra le due maggiori piattaforme. Un po' prematuro sparare così lontano ma ad oggi i numeri gli danno ragione.

L'OS è ancora immaturo (fortunatamente per funzionalità, non per bachi) ma Mango, previsto questa estate (dropperanno il numero dal nome della piattaforma), introduce altre 1500 feature per gli utenti (se c'era Jobs faceva un keynote di 8 giorni!) e si porta grosso modo al livello della concorrenza (Android ha già copiato le integrazioni social della rubrica unica di WP). Un numero consistente di migliorie, alcune delle quali le ritroveremo anche su XNA anche per PC ed Xbox: Silverlight ora può essere usato insieme ad XNA, visto che condividono la stessa accelerazione hardware e ci si possono fare giochi realtime con affidabilità. Prevedo un boom di manageriali e simulatori indie.

Sto traccheggiando ma credo sarà inevitabile farmi carico anche di questa piattaforma ;)
« Ultima modifica: Aprile 18, 2011, 14:18:01 da Ziggybee »
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"

Id

  • Hero Member
  • *****
  • Offline Offline
  • Post: 929
  • [rend, slaughter, devour]
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #13 il: Aprile 18, 2011, 18:42:12 »

Però occhio: Android 2.2 o inferiore supporta solo i thread managed per lo sviluppo end-user, quelli nativi non andrebbero usati per le applicazioni consumer (è nelle spec) ma solo a fini di sviluppo driver o del software nativo da includere con la distribuzione di un firmware. Questo potrebbe spiegare anche il problema che stai riscontrando sulle API OpenGL ES non implementate. Un processo spawnato nativamente ha dei limiti per aumentare l'efficienza della gestione della memoria.

JNI ha delle funzioni per convertire un thread nativo in thread managed, e su Android funzionano benissimo.  

Beh, benissimo, aspettiamo un'attimo. Dipende come lo usi. Se hai una funzione render() che invochi in nativo la differenza non si nota. Entrare ed uscire dal contesto ha un costo piuttosto alto...

Io seguirei le best pratcice che prevedono di wrappare il codice per frame, logica (render(), physics(), ai()) o per componente al fine di evitare al minimo il cambio di contesto e il passaggio di troppi dati da dentro e fuori. Fare pipelining aiuta molto.

Beh, io ho un thread secondario per il main loop, e non credo che uccidero' le performances con una chiamata alla VM per attaccare il thread quando viene creato, e una seconda per staccarlo quando viene distrutta l'applicazione. Per il resto, chiamate JNI ne faccio pochissime.

Solo Anrdoid 2.3 supporta i thread nativi al 100% delle funzionalità con debug e tutto per lo sviluppo end-user (e non mi pare serva nemmeno il root), perché è la prima piattaforma a supportare i chip multicore anche per lo userspace. Infatti con gli SDK 2.3 fai tutto. Francamente io non ti consiglio di usare il 2.3 in sviluppo se targettate il 2.2 ma nemmeno di usare qualcosa per il 2.2 che non dovrebbe essere usato...

Hai provato a fare un POC tutto basato su Dalvik che faccia quelle cose? Non è detto che vada peggio, visto che devi fare affidamento sul multithreading (e quello managed è molto più reattivo di quello nativo perché l'SO e la CPU non fanno context switching, quindi vai leggero anche sulla cache della CPU).

Quindi non mi consigli di usare il 2.3 se targetto il 2.2. Giusto.
Ma non mi consigli neanche il 2.2, per via del multithread nativo. Giusto anche questo (ma se non va fatto, perche' ci sono i sample? vabbe').
Mi e' sfuggito il consiglio su cosa usare, pero'.

Torno a monte del discorso: non ho nessuno di questi problemi con iOS. Mi piacerebbe - da programmatore - che il mio lavoro consista nel programmare, non nel diventare mongolo dietro a bug della piattaforma/IDE/debugger non collaborativi, e in questo, a mio giudizio, Apple ha fatto un lavoro migliore; viceversa, Android da questo punto di vista e' una delle piattaforme peggiori su cui ho lavorato.

Ti sei risposto da solo e già te l'ho scritto: fai quello che puoi fare, non quello che non puoi fare, forzando il sistema. Esattamente come faresti su iOS, non credo che lì ti metti a smanettare nei meandri dell'SO jailbreakato per arrivare a fare, che ne so, le stesse cose che potevi fare su PS2, no?

No, beh, non mi sono risposto da solo: ho delle cose da fare (debuggare) per la 2.2, ma sulla 2.2 non posso farle.
Chiaro che non mi metto con xcode a pretendere di debuggare il codice PS2, ma se devo lavorare su PS2 mi aspetto che Sony mi dia un debugger che funzioni. E questo su Android 2.2 non c'e' (per il codice nativo, almeno).

Esposto così mi pare piuttosto chiaro che il problema sia "voglio iOS su Android". Non lo avrai mai. Stop. E' un discorso fuori della logica. Se porti un'applicazione da PC a Mac la riscrivi quasi tutta non ti porti windows su PC o il Mac su Windows. Uguale se la porti da una console all'altra.

Non e' che voglio iOS su Android. Voglio un debugger che non si pianti una volta si' e una no che faccio partire del codice. Voglio un compilatore che compili il codice che scrivo, non che se ne dimentichi dei pezzi. Quello che voglio sono una toolchain decente e un'api affidabile. Poi che siano uguali o diverse da quelle iOS non mi importa.

Non capisco che vuol dire "io sono un programmatore e voglio programmare" e cosa staresti facendo, scusa? Programmare è risolvere problemi, molti dei quali (anzi, quasi tutti) sono a monte del codice. Capito questo avrai risolto gran parte dei tuoi problemi.

Ogni piattaforma ha le sue peculiarità, devi sfruttarle, non abbatterle perché ne vorresti avere altre. Chi ti garantisce che i tuoi "fix" reggano al tempo? Before hacking. Start thinking!

Programmare e' risolvere problemi, ma non e' detto che risolvere problemi sia programmare.
Se mi cade il soffitto di casa in testa, di certo e' un problema, ma non chiamo un programmatore. Chiamo un muratore!
Ci sono problemi che risolve un programmatore, e ci sono problemi che non sono compito suo, punto e basta.
Quando scrivo che "io sono un programmatore e voglio programmare, non diventare mongolo dietro a toolchain che non funzionano", intendo questo: che voglio fare il mio lavoro (risolvere i problemi che per lavoro devo risolvere) anziche' buttare tempo per trovare workaround e cose varie per risolvere i problemi di altri. SOPRATTUTTO perche' non so quanto durano e quanto funzionano.
Connesso
Stand or fall, no middle ground at all - Faedalien (Unlimited SaGa)

Ziggybee

  • Administrator
  • Hero Member
  • *****
  • Offline Offline
  • Post: 8.383
  • Gamer Extraordinaire
    • Mostra profilo
Re: Bachi/funzioni non implementate su OpenGL ES per Android?
« Risposta #14 il: Aprile 18, 2011, 21:35:41 »

No, beh, non mi sono risposto da solo: ho delle cose da fare (debuggare) per la 2.2, ma sulla 2.2 non posso farle.
Chiaro che non mi metto con xcode a pretendere di debuggare il codice PS2, ma se devo lavorare su PS2 mi aspetto che Sony mi dia un debugger che funzioni. E questo su Android 2.2 non c'e' (per il codice nativo, almeno).

Scusa però: su 2.2 non potesti fare quello che stai facendo. Perché è una funzionalità accessibile solo a chi fa i firmware o sviluppa sul kernel (e servirebbe un terminale apposito, con un kernel con le info di debug, un gdbserver corretto e via discorrendo). Se la usi stai usando una funzionalità non documentata, che è stata ufficializzata solo con Android 2.3.

Se fai una cosa del genere su Apple rischi il ban. Di questi tempi danno un anno, l'ho visto succedere con un comic reader che ha usato usare l'USB link (limitato alla cartella dati dell'App) poche settimane prima che Apple ufficializzasse gli shared folders.
Connesso
Matteo Anelli

Vazkor: "Altro che Apple TV"
 

Pagina creata in 0.021 secondi con 15 interrogazioni al database.