Rapide de Conversion RGBA pour ARGB
Je suis en train de convertir un rgba tampon en argb, est-il possible d'améliorer l'algorithme suivant, ou tout autre moyen plus rapide pour effectuer une telle opération?
Tenant compte du fait que la valeur alpha n'est pas important une fois dans l'argb de la mémoire tampon, et doit toujours se terminer comme 0xFF.
int y, x, pixel;
for (y = 0; y < height; y++)
{
for (x = 0; x < width; x++)
{
pixel = rgbaBuffer[y * width + x];
argbBuffer[(height - y - 1) * width + x] = (pixel & 0xff00ff00) | ((pixel << 16) & 0x00ff0000) | ((pixel >> 16) & 0xff);
}
}
Vous devez vous connecter pour publier un commentaire.
Je vais me concentrer uniquement dans la fonction de permutation:
En supposant que le code n'est pas buggé (seulement inefficace), je peux deviner que tout ce que vous voulez faire est de swap à chaque seconde (paires de) octet (et bien sûr inverser le tampon), n'est-ce pas?
De sorte que vous pouvez obtenir quelques optimisations par:
Je voudrais réécrire le code comme suit:
Veuillez noter que le plus complexe des indices de calcul est effectué dans la boucle externe seulement. Il y a quatre acesses à la fois rgbaBuffer et argbBuffer pour chaque pixel, mais je pense que cela est plus que compensé par éviter les opérations au niveau du bit et de l'indixes calculs. Une autre solution serait (comme dans votre code) extraction/stockage d'un pixel (int) à la fois, et de faire le traitement sur place (ce econimizes dans l'accès à la mémoire), mais à moins d'avoir une méthode efficace pour permuter les deux octets et définir l'alpha localement (par exemple, certains assembly en ligne, afin que vous vous assurez que tout est effectué à des registres de niveau), il ne sera pas vraiment vous aider.
Code fourni est très étrange, car il mélange des composants de la couleur pas rgba->argb, mais rgba->rabg.
J'ai fait une exacte et la version optimisée de cette routine.
La première chose que j'ai faite est de simplifier votre brassage de l'expression. Il est évident que XRGB est juste RGBA >> 8.
Aussi j'ai supprimé le calcul de l'index de tableau à chaque itération, et utilisé des pointeurs comme les variables de boucle.
Cette version est environ 2 fois plus rapide que l'original sur ma machine.
Vous pouvez également utiliser de l'ESS pour traînant si ce code est prévu pour les CPU x86.
Utiliser de l'assemblée, ce qui suit est pour les processeurs Intel.
Cet exemple swaps de Rouge et de Bleu.
bswap edi
. Voir godbolt.org/g/hk2QiR