2011-08-18 2 views
0

Dans mon application, j'ai besoin de dessiner un grand réseau (essentiellement, des petites boîtes connectées avec des lignes) et l'utilisateur sera en mesure de zoomer et de le déplacer. Ma première option était de dessiner le réseau directement sur le canevas, mais je pensais que ce n'était pas très efficace, parce que chaque fois qu'un événement pan se produit, le processus de dessin recommence. J'ai donc essayé d'utiliser un grand bitmap modifiable et de dessiner l'ensemble de mon réseau une seule fois (ou au moins à chaque fois que le zoom se produit), et de noircir les zones nécessaires au canevas.Dessiner sur bitmap vs directement sur le canevas

Mon problème est, puisque le réseau est assez grand, je reçois exception OOM lors de la création du bitmap ...

Que dois-je faire? Dessiner directement sur la toile? Utilisez plusieurs petites images?

Merci, Direz

+0

Vous pouvez diviser le réseau en plusieurs petites bitmaps, mais vous ne pouvez pas avoir toutes les parties du réseau à la fois. Vous pouvez créer les pièces hors écran uniquement lorsque les utilisateurs effectuent un panoramique sur cette zone. – Ronnie

Répondre

0

Vous n'allez probablement pas aimer ceci, mais si tout ce que vous faites est de dessiner des boîtes et des lignes, l'efficacité de la toile va être très élevée. Avez-vous un décalage de l'interface utilisateur ou quelque chose? Une chose que j'ai déconseillée est de dessiner des collections de sous-composants qui ne changeront pas ou pas du tout à un bitmap puis le rendu (la mise à l'échelle/le déplacement ne sont pas si coûteux si cela est fait au bon niveau). peut aider l'efficacité. J'ai essayé dans le passé de créer un cadre pour rendre un sous-ensemble semblable à une tuile d'une image plus grande existante, mais je n'ai pas rencontré beaucoup de succès. J'ai fait marcher les choses, mais le code devient moche. Oh, aussi un test rapide pour voir si le composant que vous visualisez est dans le rectangle créé par l'écran peut vous faire économiser beaucoup de temps processeur.

+0

Merci pour votre aide – Direz

1

Ma première question est combien de sprites vous avez d'aller à la fois? De loin, le mécanisme le plus rapide pour avoir de nombreux sprites sur l'écran est d'utiliser OpenGL en raison de l'accélération matérielle. La manière besy, sur Android, je l'ai trouvé à faire est d'utiliser le Android Cocos2d (à ne pas confondre avec la version ios) qui est disponible sur Google Projets. Vous devrez utiliser la documentation d'IOS afin de la comprendre et il y a quelques tutoriels décents pour commencer en ligne ... en particulier, le modèle hello world ici ... Www.sketchydroide.com/Blog/p?= 8. Il est démodé par rapport à la dernière IOS cocos2d mais c'est à prévoir. J'ai trouvé que les programmes s'exécutent beaucoup plus rapidement lorsqu'ils ne sont pas connectés à une session de débogage actif dans mes expériences. Si vous voulez coller à votre approche actuelle ou que ce qui précède n'est pas encore assez rapide, vous allez devoir essayer d'éliminer tout dessin qui n'apparaît pas à l'écran, ce qui signifie une fonction générale de la forme "si le Les valeurs x et y du sprite sont en dehors des limites de la zone visible, ne le dessinez pas "ce qui est fondamentalement comment la plupart des jeux de base de tuile traitent le problème.

Il semble que vous réalisez le dessin manuellement si vous faites des petits carrés. Je pense qu'il est plus conseillé d'aller de l'avant et de dessiner sur la toile, mais d'être très prudent sur la gestion de votre nombre de sprites et d'éviter les boucles pour la boucle de mise à jour si possible. Il est plutôt facile de maximiser votre petit combiné avec des opérations de dessin. Une autre option pourrait consister à dessiner la totalité du bitmap une fois en mémoire, puis à utiliser une opération de rectangle de copie pour transférer l'image à l'écran sans dessiner le bitmap complet que vous avez créé. Je pense que copy rect devrait être une opération rapide normalement, mais si vous l'utilisez pour dessiner l'écran entier, il semble que l'opération soit trop lourde et ne fonctionnera probablement pas aussi bien.

+0

Merci pour vos commentaires. A propos de votre dernière sugestion, je ne peux pas dessiner la totalité du bitmap en mémoire car je reçois un OOM avec la fonction createbitmap ... – Direz

Questions connexes