在python3中增加FPS(使用Pygame渲染成千上万的东西)

2024-10-01 00:28:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个业余程序员,用python3从头开始创建RPG,我用Pygame处理图形。你知道吗

目前,我必须渲染不同的多边形,很快我还必须添加线。我的帧速率只是多边形是可怕的,约1 FPS,我无法想象它会下降到什么,一旦我添加线。你知道吗

问题是,在我渲染多边形之前,我还要做大量的计算,甚至要知道在屏幕上放置多边形的位置,因为我使用的是我自己编码的三维图形,所以这可能是低帧率的另一个原因。你知道吗

代码:

是的,很乱。。。你知道吗

class Obj:

def __init__(self, x, y, z, points, lines, surfaces):
    self.x = x
    self.y = y
    self.z = z
    self.points = points
    self.lines = lines
    self.surfaces = surfaces

#Mapper function
def drawObj(self, x, y, z, ha, va, screen, width, height):
    drawOrder = []
    #Draw points
    '''for point in self.points:
        n = [0, 0, 0]

        nx = point[0] + self.x - x
        nz = point[2] + self.z - z

        n[0] = nx*m.cos(va) - nz*m.sin(va) + x
        n[2] = nz*m.cos(va) + nx*m.sin(va) + z

        ny = point[1] + self.y - y
        nz = n[2] - z

        n[1] = ny*m.cos(ha) - nz*m.sin(ha) + y
        n[2] = nz*m.cos(ha) + ny*m.sin(ha) + z

        if n[2] > z - zoom:
            drawOrder.append([n[2], 'point', [m.floor((n[0] - x)*zoom/(n[2] - (z - zoom)) + width/2), m.floor((n[1] - y)*zoom/(n[2] - (z - zoom)) + height/2)], max(0, 255 - dist(n[0], n[1], n[2], X, Y, Z)*fog)])
    '''
    #Draw lines
    for line in self.lines:
        #Point 1
        n1 = [0, 0, 0]

        n1x = self.points[line[0]][0] + self.x - x
        n1z = self.points[line[0]][2] + self.z - z

        n1[0] = n1x*m.cos(va) - n1z*m.sin(va) + x
        n1[2] = n1z*m.cos(va) + n1x*m.sin(va) + z

        n1y = self.points[line[0]][1] + self.y - y
        n1z = n1[2] - z

        n1[1] = n1y*m.cos(ha) - n1z*m.sin(ha) + y
        n1[2] = n1z*m.cos(ha) + n1y*m.sin(ha) + z

        #Point 2
        n2 = [0, 0, 0]

        n2x = self.points[line[1]][0] + self.x - x
        n2z = self.points[line[1]][2] + self.z - z

        n2[0] = n2x*m.cos(va) - n2z*m.sin(va) + x
        n2[2] = n2z*m.cos(va) + n2x*m.sin(va) + z

        n2y = self.points[line[1]][1] + self.y - y
        n2z = n2[2] - z

        n2[1] = n2y*m.cos(ha) - n2z*m.sin(ha) + y
        n2[2] = n2z*m.cos(ha) + n2y*m.sin(ha) + z

        #Set coords for line
        l = [(n1[0] - x)*zoom/(n1[2] - (z - zoom)), (n1[1] - y)*zoom/(n1[2] - (z - zoom)), (n2[0] - x)*zoom/(n2[2] - (z - zoom)), (n2[1] - y)*zoom/(n2[2] - (z - zoom))]

        #Primitive rebound workaround
        '''if n1[2] <= z - zoom:
            l[0] = m.inf
            l[1] = m.inf

        if n2[2] <= z - zoom:
            l[2] = m.inf
            l[3] = m.inf'''

        drawOrder.append([(n1[2] + n2[2])/2, 'line', [m.floor(l[0] + width/2), m.floor(l[1] + height/2), m.floor(l[2] + width/2), m.floor(l[3] + height/2)], max(0, 255 - dist((n1[0] + n2[0])/2, (n1[1] + n2[1])/2, (n1[2] + n2[2])/2, X, Y, Z)*fog)])

    #Draw surfaces
    for surface in self.surfaces:
        f = []
        drawOrder.append([0, 'surface', [], []])
        for i in range(1,len(surface)):
            p = surface[i]
            n = [0, 0, 0]

            nx = self.points[p][0] + self.x - x
            nz = self.points[p][2] + self.z - z

            n[0] = nx*m.cos(va) - nz*m.sin(va) + x
            n[2] = nz*m.cos(va) + nx*m.sin(va) + z

            ny = self.points[p][1] + self.y - y
            nz = n[2] - z

            n[1] = ny*m.cos(ha) - nz*m.sin(ha) + y
            n[2] = nz*m.cos(ha) + ny*m.sin(ha) + z

            f.append([n[0],n[1],n[2]])

            if n[2] > z - zoom:
                drawOrder[len(drawOrder)-1][2].append([m.floor((n[0] - x)*zoom/(n[2] - (z - zoom)) + width/2), m.floor((n[1] - y)*zoom/(n[2] - (z - zoom)) + height/2)])

        ax = 0
        ay = 0
        az = 0
        for p in f:
            ax += p[0]
            ay += p[1]
            az += p[2]

        ax /= len(f)
        ay /= len(f)
        az /= len(f)
        drawOrder[len(drawOrder)-1][0] = az

        drawOrder[len(drawOrder)-1][3] = [surface[0][0], surface[0][1], surface[0][2], max(0, surface[0][3] - dist(ax,ay,az,x,y,z)*fog)]

    drawOrder.sort(key = lambda a: a[0], reverse = True)

    for drawTopic in drawOrder:
        if drawTopic[1] == 'point':
            '''color = (255, 255, 255, drawTopic[3])
            pyg.draw.circle(screen, color, (drawTopic[2][0], drawTopic[2][1]), 0)'''

        elif drawTopic[1] == 'line':
            color = (255, 255, 255, drawTopic[3])
            pyg.draw.line(screen, color, (drawTopic[2][0], drawTopic[2][1]), (drawTopic[2][2], drawTopic[2][3]))

        elif drawTopic[1] == 'surface':
            color = (drawTopic[3][0], drawTopic[3][1], drawTopic[3][2], drawTopic[3][3])
            pyg.draw.polygon(screen, color, drawTopic[2])

有什么想法吗?你知道吗


Tags: selflinesincossurfacepointsnzha