2011-12-02 1 views
3

Je travaille actuellement sur une application web où seuls les changements de pixels individuels sont connus, qui sont mis en œuvre comme un événement:optimisation de toile lors du changement de pixel sont connus

function pixelChanged(x, y, color)

Ceux-ci doivent être à une toile . J'ai essayé deux méthodes pour y parvenir:

  1. pixels dessiner directement avec fillRect
  2. apprendre par coeur les pixels et les mettre sur la toile avec putImageData tous les quelques microsecondes

Maintenant, ces deux méthodes semblent avoir une mauvaise performance. Le premier entraîne de nombreux redessins, le second redessine l'image entière, même si seulement une petite zone a changé.

Ma question spécifique est, s'il y a une meilleure méthode pour implémenter ceci (peut-être quelque chose comme 1., mais d'une certaine façon retardée?).

Et si non, quelle méthode de ceux-ci devrais-je préférer? Comment puis-je l'optimiser dans ce cas?

Merci à l'avance et meilleures salutations,

copie

+2

Avez-vous essayé d'utiliser getImageData(), en modifiant les pixels, puis en mettantImageData() lorsque vous êtes prêt? –

+0

dans le cas de 1. les appels à pixelchanged se produisent-ils dans le même 'cycle d'appel', ou y a-t-il un délai entre eux (settimout, userinput, etc.)? Vous pourriez essayer le double tampon. Dessiner sur un canevas hors écran et copier la totalité du canevas sur le canevas visible toutes les quelques secondes. Je ne sais pas si cela va améliorer votre méthode n ° 2. – Gerben

+0

@JamesClark Non, je ne l'ai pas fait. C'est vraiment une belle amélioration. :-) – copy

Répondre

1

L'approche que j'ai prise est de casser une grande image dans une grille NxN et redessiner les zones spécifiques qui ont changé. J'ai trouvé une taille décente qui équilibre le nombre de redraws contre la taille d'un redraw pour être autour de 50x50px. Si vous avez besoin du nombre optimal exact pour un maximum de px/s, je l'ai quelque part de benchmarks. Donc, si vous avez un changement de 60x60, vous allez réécrire entre 4 et 9 carrés de 50x50.

+0

Bonne idée, je vais essayer. – copy

0

Commander ce article avec des approches différentes pour la toile d'optimisation. Je vous suggère de combiner plusieurs optimisations et de voir comment ça se passe. Veuillez noter que nos yeux ne reconnaissent pas les changements de pixels fréquents sur une grande surface, il est donc logique d'amortir les changements de pixels et d'effectuer plusieurs changements à la fois. Notez également que le navigateur a besoin de plusieurs millisecondes pour appliquer vos modifications, donc ne faites pas d'intervalle trop petit.

Questions connexes