Merci à Core Animation, nous iOS programmeurs ont tendance à utiliser transformations affines (Par voie de CGAffineTransform) un lot. En étant capable de combiner plusieurs transformations 2D dans une seule matrice, nous avons la capacité de faire beaucoup d'effets d'animation cool avec seulement quelques lignes de code.
Prenons l'exemple suivant, qui est assez typique:
Pas mal, non? En seulement trois lignes de code, nous sommes capables à la fois à l'échelle et de traduire une vue ou une couche. Mais en réalité, il ya en fait assez peu d'opérations qui se passe derrière ces trois lignes de code. L' CGAffineTransformScale() les appels de fonction CGAffineTransformConcat() pour effectuer une opération de multiplication de matrice entre deux matrices affines. Mais, comme vous le savez probablement, vous ne pouvez pas multiplier une matrice 2x3 par une autre matrice 2x3. Pour multiplier les transformations affines, ils doivent être reconverti en 3x3 matrices vectorielles premier.
Sur les périphériques d'aujourd'hui (même les dispositifs mobiles), tout cela prend une quantité insignifiante de puissance de traitement. Mais parfois, lorsque vous faites beaucoup de ces transformations - disons mille ou dizaines de milliers par seconde - il peut être utile d'être capable d'éviter que la conversion et la multiplication des matrices.
Il se trouve que avec certains CGAffineTransforms couramment utilisés, vous pouvez tricher. Certaines matrices peuvent être réunis sans effectuer la multiplication matricielle. Par exemple, voici les matrices créées par CGAffineTransformMakeScale () et CGAffineTransformMakeTranslation (), respectivement:

Allez-y et multiplier ces deux ensemble. Branchez n'importe quel nombre de tx, ty, sx, Et sy et exécuter les numéros. Je vais attendre. Bon, vous n'avez pas à. C'est ce que vous obtiendrez:

Donc, si ce n'est le résultat que nous allons obtenir, pourquoi s'embêter passant par la multiplication des matrices, en premier lieu? Pourquoi ne pas simplement alimenter la matrice à la fois avec l'échelle et de traduire les valeurs dès le départ? Eh bien, nous le pouvons. Nous pouvons aussi faire la même chose avec de traduire et faire pivoter.
Cela est d'autant qu'il ya à faire:
C'est tout. Il enregistre seulement vous deux lignes de code:
Mais, votre allocation de pile est considérablement plus petit (un CGAffineTransform au lieu de deux CGAffineTransforms et un tableau 3x3 intermédiaires. Il vous fait également gagner dix-huit multiplications en virgule flottante et neuf additions en virgule flottante. 99,9% du temps, que nombre d'opérations va avoir aucune notable incidence sur votre demande - c'est une infime partie de la mémoire et FLOPS dans la plupart des situations normales.
Mais ... si vous faites beaucoup par seconde, ils peuvent s'additionner et il est agréable de savoir qu'il ya une façon que vous pouvez vous épargner peu de surcharge dans certaines situations.
Prenons l'exemple suivant, qui est assez typique:
CGAffineTransform transform = CGAffineTransformMakeTranslation(0, -translation);
transform = CGAffineTransformScale(transform, scaleFactor, scaleFactor);
view.transform = transform;Pas mal, non? En seulement trois lignes de code, nous sommes capables à la fois à l'échelle et de traduire une vue ou une couche. Mais en réalité, il ya en fait assez peu d'opérations qui se passe derrière ces trois lignes de code. L' CGAffineTransformScale() les appels de fonction CGAffineTransformConcat() pour effectuer une opération de multiplication de matrice entre deux matrices affines. Mais, comme vous le savez probablement, vous ne pouvez pas multiplier une matrice 2x3 par une autre matrice 2x3. Pour multiplier les transformations affines, ils doivent être reconverti en 3x3 matrices vectorielles premier.
Sur les périphériques d'aujourd'hui (même les dispositifs mobiles), tout cela prend une quantité insignifiante de puissance de traitement. Mais parfois, lorsque vous faites beaucoup de ces transformations - disons mille ou dizaines de milliers par seconde - il peut être utile d'être capable d'éviter que la conversion et la multiplication des matrices.
Il se trouve que avec certains CGAffineTransforms couramment utilisés, vous pouvez tricher. Certaines matrices peuvent être réunis sans effectuer la multiplication matricielle. Par exemple, voici les matrices créées par CGAffineTransformMakeScale () et CGAffineTransformMakeTranslation (), respectivement:
Allez-y et multiplier ces deux ensemble. Branchez n'importe quel nombre de tx, ty, sx, Et sy et exécuter les numéros. Je vais attendre. Bon, vous n'avez pas à. C'est ce que vous obtiendrez:
Donc, si ce n'est le résultat que nous allons obtenir, pourquoi s'embêter passant par la multiplication des matrices, en premier lieu? Pourquoi ne pas simplement alimenter la matrice à la fois avec l'échelle et de traduire les valeurs dès le départ? Eh bien, nous le pouvons. Nous pouvons aussi faire la même chose avec de traduire et faire pivoter.
Cela est d'autant qu'il ya à faire:
static inline CGAffineTransform CGAffineTransformMakeRotateTranslate(CGFloat angle, CGFloat dx, CGFloat dy)
{
return CGAffineTransformMake(cosf(angle), sinf(angle), -sinf(angle), cosf(angle), dx, dy);
}
static inline CGAffineTransform CGAffineTransformMakeScaleTranslate(CGFloat sx, CGFloat sy, CGFloat dx, CGFloat dy)
{
return CGAffineTransformMake(sx, 0.f, 0.f, sy, dx, dy);
}C'est tout. Il enregistre seulement vous deux lignes de code:
view.transform = CGAffineTransformMakeScaleTranslate(scaleFactor, scaleFactor, 0, -translation);Mais, votre allocation de pile est considérablement plus petit (un CGAffineTransform au lieu de deux CGAffineTransforms et un tableau 3x3 intermédiaires. Il vous fait également gagner dix-huit multiplications en virgule flottante et neuf additions en virgule flottante. 99,9% du temps, que nombre d'opérations va avoir aucune notable incidence sur votre demande - c'est une infime partie de la mémoire et FLOPS dans la plupart des situations normales.
Mais ... si vous faites beaucoup par seconde, ils peuvent s'additionner et il est agréable de savoir qu'il ya une façon que vous pouvez vous épargner peu de surcharge dans certaines situations.
Aucun commentaire:
Enregistrer un commentaire