2010-01-27 25 views
0

en ce moment j'ai un goulot de bouteille dans mon programme, je suis en train d'écrire. J'essaie d'utiliser un geste de pincement pour contrôler l'échelle d'un UIImage. C'est le calcul de l'échelle qui fait ralentir le programme et devenir agité. ci-dessous est l'équation. ScaleMod Quelle que soit l'échelle actuelle, l'utilisateur a retiré ses doigts de l'écran. donc la prochaine fois que l'utilisateur fait une pincée, l'ancienne échelle est essentiellement le point de départ de la nouvelle action de mise à l'échelle.comment puis-je faire cette équation plus rapide

+1

C'est à peu près 3 opérations sans magie derrière elles. Êtes-vous sûr que c'est le goulot d'étranglement? Comme, avez-vous profilé votre application iPhone et découvrez combien de temps CPU est passé sur cette ligne? – zneak

+3

Je ne peux pas imaginer que le calcul de l'échelle serait un goulot d'étranglement. Presque certainement c'est l'échelle elle-même. –

+1

Je suis d'accord avec ceux qui disent que ce n'est probablement pas votre goulot d'étranglement. Mais il serait vraiment utile de connaître les types de ces variables - entiers? flotte? double? –

Répondre

2

1) Ne pouvez-vous pas calculer scaleMod/initialDistance une fois que currentDistance change. De cette façon, vous n'avez que cette valeur fois currentDistance, ce qui supprime une division.

2) Assurez-vous qu'il s'agit bien du goulot d'étranglement. Ce n'est probablement pas le cas, sauf si vous faites quelque chose de vraiment mal.

0

Vous pouvez stocker scaleMod/initialDistance. Lorsque la mise à l'échelle est active (les doigts de l'utilisateur sont toujours à l'écran), multipliez cette valeur par currentDistance si nécessaire.

Une fois que l'utilisateur a fini de pincer, stockez la nouvelle valeur scaleMod/initialDistance pour la prochaine fois que le pincement se produit.

1

Si vous fixez le scaleMod et initialDistance à des puissances de 2, vous pouvez utiliser des décalages pour une multiplication et une division plus rapides.

Voir here for reference.

0

Si vous faites un calcul avec int (ou un autre entier), voyez s'il peut le faire en utilisant la précision float. La division en virgule flottante est plus rapide que l'entier (moins de bits à diviser, en supposant que votre CPU a une unité à virgule flottante).

également, essayez de factoriser la division comme multiplication par une réciproque.

+0

Dans quel univers le flottant est-il plus rapide que l'entier pour une division? Certes, il existe des ensembles pathologiques de flottants et d'ensembles dégénérés d'entiers pour lesquels cela sera vrai. Vous semblez faire une déclaration générale. – gary

+0

@gary c'est généralement vrai. Regardez comment les nombres à virgule flottante sont représentés (indice: rappelez la division des pouvoirs). Comparez la latence d'instruction de IDIV et FDIV, http://siyobik.info/index.php?module=x86 – Anycorn

+0

La latence est juste une surcharge de pipeline, et n'est pas utile pour définir "plus rapide" pour une application réelle. Déclarer une instruction "plus rapide" en raison d'une latence plus faible équivaut à définir le vainqueur d'une course automobile en fonction de son temps de parcours pour atteindre la piste. Bien sûr, cela a un sens, mais pas beaucoup. Lorsque vous voulez voir comment une instruction fonctionne dans une application réelle, vous devez regarder le débit. À cet égard, les entiers sont toujours aussi rapides ou rapides. – gary

2

Pour tout type de trois vars, ce calcul peut facilement être effectué des millions de fois par seconde avec un impact faible sur les performances. Votre problème est ailleurs.