2010-12-02 3 views
3

Je travaille sur une carte pour mon application de transport en commun. J'utilise SurfaceView, il s'agit d'une map basée sur les vignettes, il y a 2 threads en plus du fil de chargement principal et du fil de chargement bitmap.La carte à base de mosaïques personnalisées est lente

Les bitmaps sont des PNG 256 x 256 stockés sur la carte SD, je cache les bitmaps chargés, la capacité de cache est de 64 bitmaps. Il y a différents ensembles de bitmaps pour chaque niveau de zoom, ma carte a 4 niveaux de zoom, chaque niveau suivant est 2x plus zoomé. Malheureusement le défilement et le zoom de pincement ne sont pas lisses sur mon Nexus One, FPS est de 15 - 20. Quand aucun carreau n'est chargé FPS est 35 - 40. Si je baisse la priorité du fil de chargement bitmap, il devient complètement lisse mais Je vois souvent des carreaux non encore chargés (blancs) sur la carte - ce qui est encore pire que la non-régularité.

Alors, que pouvais-je faire? J'ai 2 idées à ce jour:

  • Essayez OpenGL, mais je ne veux pas y passer du temps et mon savoir ce FPS uniquement inreased par 3. Aussi je veux montrer popups (ce rouleau avec le map) après que l'utilisateur a cliqué sur les marqueurs de carte, que je ne sais pas comment faire dans GLSurfaceView.
  • Affectez une priorité faible au fil de chargement bitmap uniquement lorsque l'utilisateur touche l'écran ou lorsqu'une animation est en cours. J'ai essayé cela mais pour une raison inconnue il a semblé même empirer le problème un peu, toucher/ne pas toucher l'écran n'a eu aucun effet. Si c'était juste un bug que je peux corriger, il y a encore un autre problème. Si j'utilise un défilement cinétique pour déplacer rapidement la carte, je vais voir beaucoup de bitmaps non mis en cache.

Répondre

2

N'effectuez pas des entrées/sorties sur votre thread de rendu. (Comment pouvez-vous utiliser GLSurfaceView et ne pas utiliser OpenGL par la voie?)

J'ai écrit une carte à base de tuiles OpenGL vue et il est lisse comme le beurre sur un Nexus One (non mesuré les fps mais il est facilement aussi lisse que l'application de cartes sur un iPhone 4). L'astuce consiste à déplacer toutes les E/S du thread de rendu, à réduire les priorités de vos threads de travail et à demander immédiatementRender() à la fin du rendu courant si vous en connaissez un autre (par exemple, pendant un panoramique ou zoom), c'est-à-dire n'attendez pas que cela soit signalé par un autre fil. Recherchez Yell.com sur le marché pour le voir en action (peut-être seulement au Royaume-Uni).

+0

Désolé, ça devrait être SurfaceView, j'ai édité la question. Qu'est-ce qui te fait penser que je fais des IO dans le rendu du fil? J'ai un fil de dessin plus le fil supplémentaire de chargement de bitmap (IO). – fhucho

+0

Qu'en est-il du décodage des fichiers .png? Cela doit être fait sur votre thread de chargement aussi. Et votre thread de chargement doit avoir une priorité inférieure ou il affamera votre thread d'interface utilisateur du temps CPU. Si vous faites déjà tout cela, il se peut que vous ne voyiez que la lenteur des API de dessin 2D Canvas. –

+0

Et votre approche? Dessinez-vous chaque carreau visible à chaque image? Ce serait très lent ... bien mieux d'utiliser un bitmap hors écran pour lequel vous dessinez de nouvelles tuiles uniquement lorsqu'elles deviennent visibles. –

Questions connexes