2010-10-28 5 views
0

Bonjour les gars: Je dois projeter beaucoup de points avant de les dessiner sur un cadre. mes codes sont coup:Comment rendre la matrice plus rapide?

-(Coordination*)xyWorldToDev:(Coordination*)pt isIphoneYAxis:(BOOL)isIphoneYAxis{ 
    CGPoint tmpPoint=CGPointApplyAffineTransform(CGPointMake(pt.x,pt.y),worldToDevMatrix); 
    Coordination *resultPoint=[[[Coordination alloc]initWithXY:tmpPoint.x withY:(isIphoneYAxis)?(sscy-tmpPoint.y):tmpPoint.y]autorelease]; 
    return resultPoint; } 

-(Coordination*)xyDevTo3D:(Coordination*)cPt{ 
    double x=0.0,y=0.0; 
    double divide=1+m_cView3DPara.v*cPt.y; 
    x=(m_cView3DPara.a*cPt.x+m_cView3DPara.b*cPt.y+m_cView3DPara.e)/divide; 
    y=(m_cView3DPara.d*cPt.y+m_cView3DPara.f)/divide; 
    return [[[Coordination alloc]initWithXY:x withY:sscy-y]autorelease]; 
} 
-(Coordination*)transformWorldTo3D:(Coordination*)pt{ 
    return [self xyDevTo3D:[self xyWorldToDev:pt isIphoneYAxis:NO]]; 
} 

Par conséquent, la méthode "- (Coordination *) transformWorldTo3D: (Coordination *) pt" est appelé des centaines de fois à cause de projection.

Mais je l'ai trouvé très très lent en appelant transformWorldTo3D! Existe-t-il un autre moyen de l'accélérer? Ou en utilisant un autre cadre qui pourrait calculer la valeur de projection plus rapidement?

+0

pouvez-vous ajouter le code qui appelle la transformWorldTo3D – Manny

Répondre

2

Les allocations d'objets sont coûteuses (par rapport aux opérations arithmétiques); et il semble que vous faites 2 séquences alloc-init-autorelease pour chaque point.

Ma première suggestion serait d'essayer de faire un peu de ce travail avec CGPoint s et d'éviter les allocations.

(En fait, c'est ma deuxième suggestion: mon premier est de profiler le code pour voir où le temps est passé.)

+0

j'avais utilisé CGPoint et stocké dans NSMutableArray via NSValue, mais il n'a pas de différence significative. Après avoir testé l'heure d'exécution, le goulot d'étranglement est CGPointApplyAffineTransform – catskytw

Questions connexes