2011-06-13 3 views
1

J'ai une animation échelle de gris 32 cadre d'un diamant qui explose en morceaux (soit 32 images PNG @ 1024x1024)iOS: la lecture d'un cadre par image animation échelle de gris dans une couleur personnalisée

mon jeu se compose de 12 couleurs différentes , donc j'ai besoin d'effectuer l'animation dans n'importe quelle couleur

ce que je crois exclut tous les cadres d'Apple, il exclut également beaucoup de code public pour animer image par image dans iOS.

Quels sont mes chemins de solution potentiels?

ce sont les meilleurs SO liens que j'ai trouvé:

que la dernière montre qu'il est tout simplement peut-être possible de charger une image en une texture GL chaque image (il le fait depuis la caméra, donc si j'ai tout en mémoire, ça devrait être encore plus rapide)

Je peux voir ces options (voir la liste plus paresseux premier, le plus optimisé dernier)

Option A chaque cadre (avec la permission de CADisplayLink), charger l'image pertinente du fichier dans une texture et d'afficher cette texture

Je suis assez sûr que ce soit stupide, sur l'option B

pré-charge l'option B toutes les images en mémoire puis comme ci-dessus, que nous vient charger m mémoire plutôt que de fichier

Je pense que cela va être la solution idéale, quelqu'un peut-il donner le pouce en l'air ou les pouces vers le bas? Précharger tous mes fichiers PNG en une seule texture GL de la taille maximale, créant ainsi une texture Atlas. chaque image, définissez les coordonnées de la texture sur le rectangle de l'Atlas pour cette image.

alors qu'il s'agit potentiellement d'un équilibre parfait entre l'efficacité de codage et l'efficacité des performances, le principal problème ici est la perte de résolution; Sur les anciens appareils iOS, la taille maximale de la texture est 1024x1024. si nous sommes en train de bourrer 32 images dans ceci (vraiment c'est la même chose que le bachotage 64), nous serions à 128x128 pour chaque image. si l'animation résultante est proche de plein écran sur l'iPad cela ne va pas à pirater

l'option D au lieu de chargement dans une seule texture GL, charge dans un tas de textures De plus, nous pouvons presser 4 images en une seule texture à l'aide des quatre canaux

Je déteste la quantité de codage fastidieux requise ici. Mon RSI commence à picoter même en pensant à cette approche

Je pense que j'ai répondu à ma propre question ici, mais si quelqu'un a déjà fait cela ou peut voir le chemin, merci de répondre!

Répondre

0

Si quelque chose de meilleures performances que (B) est nécessaire, il semble que la clé est glTexSubImage2D http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml

Plutôt que de tirer sur une image à la fois de la mémoire, nous pourrions organiser dire 16 images en échelle de gris 512x512x8 bits jointive En mémoire, envoyez ceci à GL comme une seule texture RGBA 1024x1024x32bit, puis scindez-la en GL en utilisant la fonction ci-dessus.

Cela signifierait que nous accomplissons un [RAM-> VRAM] transfert par 16 cadres plutôt que par un cadre.

Bien sûr, pour les appareils plus modernes, nous pourrions obtenir 64 au lieu de 16, étant donné que les appareils iOS plus récents peuvent gérer les textures 2048x2048.

Je vais d'abord essayer la technique (B) et le laisser à ce si cela fonctionne (je ne veux pas sur le code), et regardez ce si nécessaire.

Je ne peux pas trouver un moyen d'interroger le nombre de textures GL, il est possible de tenir sur la puce graphique. On m'a dit que lorsque vous essayez d'allouer de la mémoire pour une texture, GL renvoie juste 0 quand il manque de mémoire. cependant pour l'implémenter correctement je voudrais m'assurer que je ne navigue pas près du vent re: ressources ... Je ne veux pas que mon animation utilise autant de VRAM que le reste de mon rendu échoue ...

+0

liés: http://stackoverflow.com/questions/6683822/ios-applying-a-rgb-filter-to-a-greyscale-png –

0

Vous seriez en mesure de faire fonctionner cela très bien avec les API CoreGraphics, il n'y a aucune raison de plonger dans OpenGL pour un simple problème 2D comme celui-ci. Pour l'approche générale que vous devez prendre pour créer des cadres colorés à partir d'un cadre en niveaux de gris, voir colorizing-image-ignores-alpha-channel-why-and-how-to-fix. Fondamentalement, vous devez utiliser CGContextClipToMask() et ensuite rendre une couleur spécifique de sorte que ce qui reste est le diamant coloré avec la couleur spécifique que vous avez sélectionnée. Vous pouvez le faire à l'exécution, ou vous pouvez le faire hors ligne et créer une vidéo pour chacune des couleurs que vous souhaitez prendre en charge. Il est plus facile sur votre CPU si vous faites l'opération N fois et enregistrer les résultats dans des fichiers, mais le matériel iOS moderne est beaucoup plus rapide que par le passé. Méfiez-vous des problèmes d'utilisation de la mémoire lors de l'écriture du code de traitement vidéo, voir video-and-memory-usage-on-ios-devices pour une amorce qui décrit l'espace de problème. Vous pourriez tout coder avec des atlas de texture et des trucs complexes d'OpenGL, mais une approche qui utilise des vidéos serait beaucoup plus facile à gérer et vous n'aurez pas à vous soucier autant de l'utilisation des ressources, voir ma bibliothèque reliée dans la mémoire poster pour plus d'informations si vous êtes intéressé à gagner du temps sur la mise en œuvre.

Questions connexes