0

J'écris un lecteur audio pour OSX. Une vue est une vue personnalisée qui affiche une forme d'onde. La forme d'onde est stockée en tant que variable d'instance de type NSImage avec NSBitmapImageRep. La vue affiche également un indicateur de progression (une ligne rouge épaisse). Par conséquent, il est mis à jour/redessiné toutes les 30 millisecondes.Comment accélérer le dessin d'une image mise à l'échelle? La restitution audio s'étouffe lors du redimensionnement de la fenêtre

Comme il faut un certain temps pour recalculer l'image, je le fais dans un fil d'arrière-plan après chaque redimensionnement de la fenêtre et mettre à jour l'image affichée une fois que la nouvelle image est prête. En attendant, l'image originale est mise à l'échelle pour adapter la vue comme ceci:

// The drawing rectangle is slightly smaller than the view, defined by 
// the two margins. 
NSRect drawingRect; 
drawingRect.origin = NSMakePoint(sideEdgeMarginWidth, topEdgeMarginHeight); 
drawingRect.size = NSMakeSize([self bounds].size.width-2*sideEdgeMarginWidth, 
           [self bounds].size.height-2*topEdgeMarginHeight); 
[waveform drawInRect:drawingRect 
      fromRect:NSZeroRect 
      operation:NSCompositeSourceOver 
      fraction:1]; 

La vue fait la plus grande partie de la fenêtre. Pendant le redimensionnement en direct, l'audio commence à s'étouffer. Sélectionner la "grosse" carte graphique sur mon Macbook Pro la rend moins mauvaise, mais pas beaucoup. L'utilisation du processeur se situe aux environs de 20 à 40% lors des redimensionnements en temps réel.
Les instruments suggèrent que le redimensionnement/redessin de l'image est le problème. Une fois que j'arrête de redimensionner la fenêtre, l'utilisation du processeur diminue et l'audio cesse de tomber en panne.

je l'ai déjà essayé de désactiver l'interpolation d'image pour accélérer le dessin comme celui-ci:

[[NSGraphicsContext currentContext] 
    setImageInterpolation:NSImageInterpolationNone]; 

Cela aide, mais audio selfs encore pendant redimensionne en direct.

Avez-vous une idée pour améliorer cela?
L'essentiel est d'éviter l'étouffement de l'audio.

+0

Lancez-vous l'audio à partir de votre thème graphique? – extraneon

+0

Oui. C'est considéré comme une mauvaise idée, non? Je peux voir pourquoi ☺ – bastibe

Répondre

1

Le rafraîchissement graphique ne devrait pas affecter la lecture audio. J'ai une application audio qui retranscrit en direct lors du redimensionnement de la fenêtre, ainsi qu'un fil d'arrière-plan pour rendre la forme d'onde, et il n'y a aucun problème à lire de l'audio. Le thread audio que le ioProc qui lit les données audio est un thread en temps réel, et a une priorité plus élevée que la plupart des autres threads.

Si votre thread graphique a un verrou ou appelle quelque chose qui bloque (y compris les allocations de mémoire ou la libération) quelque chose dans le fil audio, cela pourrait provoquer le bégaiement de l'audio. Les problèmes de multi-threading sont complexes, avec des problèmes tels que la sécurité du thread des structures de données, les verrous, l'inversion des priorités, le blocage et bien d'autres choses à gérer.

+0

Mon dessin ne dessine que des choses. Pas d'allocation ou de gros calculs sauf le 'drawInRect' montré. Dans mon cas, le rappel audio utilise le cycle principal comme défini dans 'AudioQueueNewOutput'. Le problème disparaît si je redessine la vue moins souvent (ce qui rend l'indicateur de progression moins lisse) – bastibe