Question

J'ai actuellement un goulot de bouteille dans mon programme que je suis en train d'écrire. Je suis en train d'utiliser un geste de pincement pour contrôler l'échelle d'un UIImage. son calcul de l'échelle qui est à l'origine du programme de ralentir et devenir saccadé. ci-dessous est l'équation.

currentScale = (currentDistance / initialDistance) * scaleMod;

scaleMod est ce que jamais l'échelle actuelle était l'utilisateur a leurs doigts sur l'écran. de sorte que 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.

Était-ce utile?

La solution

1) Tu ne peux pas calculer une fois scaleMod / initialDistance en currentDistance est en train de changer. De cette façon, vous avez seulement faire que les temps de valeur currentDistance, ce qui élimine une fracture.

2) Assurez-vous que ce soit réellement le goulot d'étranglement. Il est très probablement pas, à moins que vous faites quelque chose de vraiment mal.

Autres conseils

Pour tout type de trois vars, ce calcul peut se faire facilement des millions de fois par seconde avec peu d'impact sur le rendement. Votre problème est ailleurs.

Si vous fixez le scaleMod et initialDistance à des puissances de 2, vous pouvez utiliser des changements pour la multiplication et la division plus rapide.

Voir ici de référence.

Vous pouvez stocker scaleMod / initialDistance. Lorsque l'échelle est actif (les doigts de l'utilisateur sont encore à l'écran), il faut multiplier cette valeur par currentDistance selon les besoins.

Une fois que l'utilisateur a terminé le pincement, stocker la nouvelle valeur scaleMod / initialDistance pour la prochaine fois que pincements arrive.

si vous faites le calcul avec int (ou un autre entier), voir s'il peut le faire en utilisant la précision du flotteur. division à virgule flottante est plus rapide que nombre entier (moins de bits pour diviser, en supposant que votre CPU) comporte l'unité à virgule flottante).

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

Vérifier que InitialDistance! = 0 premier! :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top