2010-12-20 5 views
0

J'essaie de tracer des lignes rapides en utilisant pygame qui ne sont pas rendues directement à l'écran. J'ai une liste Python aussi grande que le nombre de pixels pour la résolution désirée, et stocke des valeurs entières correspondant au nombre de fois que le pixel a été frappé par l'algorithme de ligne. En utilisant ceci, une carte de chaleur 2D est construite, donc plutôt que de dessiner une valeur de pixel plate, les valeurs de pixel sont incrémentées en fonction du nombre de fois qu'une ligne la parcourt et les pixels "chauds" obtiennent des couleurs plus vives. La raison pour cela est que nous ne savons pas à l'avance combien de ces lignes vont être dessinées, et quel sera le nombre maximum de fois qu'un pixel donné va être touché. Puisque nous aimerions mettre à l'échelle la sortie afin que chaque rendu ait les valeurs RVB maximales et minimales correctes, nous ne pouvons pas simplement dessiner à l'écran.Dessin de lignes rapides dans pygame

Existe-t-il un meilleur moyen de dessiner ces lignes qu'un algorithme de Bresenham relativement naïf? Voici la partie critique de la fonction drawLine:

# before the loop, to save repeated multiplications 
    xm = [] 
    for i in range(resolution[0]): 
    xm.append(i * resolution[0]) 

    # inside of drawLine, index into the f list, of size resolution[0] * resolution[1] 
    for x in range(x0, x1 + 1): 
    if steep: 
     idx = y + xm[x] 
     f[idx] += 1 
    else: 
     idx = x + xm[y] 
     f[idx] += 1 

Le résultat final est mis à l'échelle et de tenir compte de l'écran sur la base de la valeur maximale à l'intérieur de f. Par exemple, si la valeur maximale est 1000, vous pouvez supposer que la valeur RVB de chacun des pixels est (f [i] * 255)/1000.

Les informations de profil indiquent que runtime est dominé par les recherches d'index en f. J'ai utilisé des questions précédentes ici pour prouver que ces listes de base sont plus rapides que des tableaux ou des tableaux en Python, mais pour dessiner des lignes comme ça, il semble toujours qu'il y ait de la place pour s'améliorer.

Quelle est une méthode rapide et efficace pour dessiner un nombre inconnu de lignes à l'écran, sachant que vous allez mettre à l'échelle la sortie à la fin de rendre à l'écran? Existe-t-il un bon moyen de se débarrasser des frais généraux de l'indice?

Répondre

1

Essayez Cython ou quelque chose de similaire. (Si vous le faites, je serais intéressé à savoir si/combien qui a aidé)

Cython est un langage de programmation pour simplifier l'écriture C et C++ l'extension modules pour l'exécution CPython Python . Strictement parlant, la syntaxe Cython est un surensemble de la syntaxe Python supportant en outre: Direct appelant des fonctions C, ou C++ fonctions/méthodes, à partir du code Cython. Typage fort des variables Cython, des classes et des attributs de classe en tant que types C . Cython compile en C ou C++ plutôt que Python, et le résultat est utilisé comme module Python Extension ou comme application autonome en intégrant le runtime CPython. (http://en.wikipedia.org/wiki/Cython)

+0

Bien sûr, vous avez besoin de 'cdef' correctement, sinon cela vous apportera ** au plus ** 10%. – delnan

+1

Parfait, Cython avec des instructions cdef numpy et appropriées a considérablement amélioré les choses, même avec les ajouts les plus basiques. Je vais continuer à brancher, mais jusqu'à présent, il est environ 80% -90% plus rapide avec le passage à l'indexation int explicite sur les tableaux numpy. Merci! – swrittenb