2015-09-23 18 views
5

Sono uno sviluppatore iOS abbastanza esperto, ma un novizio di SceneKit totale, che tenta di simulare alcuni pianeti in un'app di base.Ottimizzazione delle prestazioni di SceneKit con texture ad alta risoluzione

A tal fine, sto utilizzando mappe ad alta risoluzione normale e diffusa di Marte, Venere, ecc., Applicate alle sfere di base. E funzionano! Sono fantastici, esattamente quello che stavo cercando.

enter image description here enter image description here

Il problema è, mi sto uccisi dal compromesso qualità/memoria.

Posso ridimensionare le dimensioni delle trame per ridurre l'ingombro della memoria, ma al di sotto di una certa risoluzione i risultati (specialmente la mappa normale) iniziano a sembrare davvero molli e terribili. L'app deve essere in grado di ingrandire almeno fino al punto in cui il pianeta è largo, ma per mantenere qualsiasi nitidezza nelle montagne e nelle valli ho bisogno di usare una mappa normale PNG (sopra) a circa 6000 x 3000. Posso scalare il mappa diffusa fino a circa 1000 x 500, ma anche così, Ricevo periodici blocchi di memoria da una singola sfera che ruota delicatamente, con un'unica luce, senza sfondo, senza fisica e senza altra geometria.

Ora, So che è una mappa normale ad altissima risoluzione. Capisco. Ma allo stesso tempo, è solo una sfera, non fare nulla. Non è nemmeno vicino ad alcune delle complessità che ho visto altre app eseguite in modo impeccabile, anche con alcune trame abbastanza dettagliate. Sembra che ci debba essere un modo per ottenere trame di superficie ad alto dettaglio per un singolo oggetto, senza causare il crash dell'applicazione.

Quindi, essendo un novizio di SceneKit, mi chiedo: ci sono trucchi per ottenere una buona qualità delle texture di SceneKit senza utilizzare TUTTA la memoria del mondo? Forse un modo di gestire le trame dell'immagine, ricodificare i file, cambiare le impostazioni di scena/nodo, ecc.? In alcun modo per ottenere una qualità nitida con immagini più piccole o un minore utilizzo della memoria con le stesse immagini?

Vorrei citare felicemente qualche codice, ma in questo momento non c'è molto da mostrare. Applico le trame al nodo SceneKit in modo standard e funziona. Sto morendo dalla mancanza di memoria o dalla mancanza di qualità dell'immagine.

Qualcuno può darmi una mano?

+0

i dati geometrici non dovrebbero richiedere molta memoria. la fisica/l'animazione/le particelle dovrebbero essere trascurabili dal punto di vista della memoria. Quindi se tutto va bene (nessuna perdita) il 90% dell'uso della memoria dovrebbe essere usato dalle tue trame. quanti pianeti/trame grandi hai nello stesso tempo? hai provato a passare ad alta risoluzione/bassa risoluzione in base alla distanza tra un pianeta e il punto di vista? – Toyos

+0

@Toyos Ho solo un pianeta con due trame: normale e diffusa. Il pianeta funziona e gira correttamente, ma se provo a fare qualsiasi altra cosa (come aggiungere etichette alla vista, o andare alla schermata principale e tornare all'app) rischia una chiusura della memoria. Non tutte le volte, ma forse 1 su 3-4 volte. In modo abbastanza coerente da essere inaccettabile, e francamente un po 'sconcertante per una scena così semplice. Per quanto riguarda le risoluzioni di commutazione, è una buona idea, ma il pianeta in questa app rimane sempre in primo piano, quindi non c'è mai tempo per passare a una risoluzione più bassa. – Nerrolken

+0

Questo suona molto buggy, per me. A 1000x500 non dovresti avere alcun tipo di problema. Ma aggiungerò una cosa strana per provare ...per forza di abitudine uso sempre^2 texture di dimensioni. Quindi prova 1024x512, vedi se questo fa la differenza. Potrebbe perché le idee dietro l'imballaggio delle texture sono vecchie di decenni, e forse non sono state flesse per trarre vantaggio da un mondo più vario che coinvolge altri tipi di numeri. – Confused

risposta

0

Penso che l'idea sia quella di segmentare la trama della sfera in modo che visualizzi solo 60 gradi di trama in qualsiasi momento, in modo simile a come si visualizzano le immagini ad alta risoluzione durante lo zoom. Non sono sicuro di come farlo, ma questa è la mia ipotesi.

Problemi correlati