python 我怎样才能加快我的pygame raycaster的纹理渲染?

k2fxgqgv  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(112)

我建立的光线投射器本身工作的很好,但是当我添加纹理的时候它就有问题了。我只得到~1-2fps运行的投射器与纹理,而〉120 fps否则。我是相当新的编程。所以我希望一些优化的帮助。
“list”是从光线投射中获得的所有距离值。“clist”是光线接触墙壁的x & y位置的mod。look是玩家正在观看的上/下Angular 。
我去掉了阴影和阴影,因为这会让它更慢

def disp(list , clist):
    rayspace = ceil(WIDTH / len(list))
    for i in range(len(list)):   
        top = round(HEIGHT / 2 + 12000/list[i] + (look))
        bottom = round(HEIGHT / 2 - 12000/list[i] + (look))
        if top > bottom:
            tallness = top - bottom
        else:
            tallness = bottom - top
        y = 0
        j = bottom
        while not(j == top):
            y += HEIGHT/tallness
            k = 0
            while not(k == rayspace):
                color = wallpaper.get_at((floor(clist[i]/rayspace + k * 2), floor(y)))
                color = (color[0] , color[1]  ,color[2] )    
                screen.set_at((round(i * rayspace) + k , j) , color)
                k+=1
            j+=1

我已经用while循环替换了for循环,删除了所有全局变量,并在导入时使用“from”,这有一点帮助,但仍然非常慢
如果有任何需要澄清的代码,我很乐意帮助

a0zr77ik

a0zr77ik1#

首先,如果一个计算的结果对于一个循环的每一次迭代都是相同的,那么你不需要在循环的每一次迭代中都这样做,你只需要在循环之前做一次,试试这样的方法:

def disp(list , clist):
    rayspace = ceil(WIDTH / len(list))
    half_height = HEIGHT / 2
    for i in range(len(list)):   
        top = round(half_height + 12000/list[i] + (look))
        bottom = round(half_height - 12000/list[i] + (look))
        if top > bottom:
            tallness = top - bottom
        else:
            tallness = bottom - top
        y = 0
        j = bottom
        delta_y = HEIGHT / tallness
        clist_i_div_rayspace = clist[i] / rayspace
        round_i_mul_rayspace = round(i * rayspace)
        while not(j == top):
            y += delta_y
            k = 0
            floor_y = floor(y)
            while not(k == rayspace):
                color = wallpaper.get_at((floor(clist_i_div_rayspace + k * 2), floor_y))
                color = (color[0] , color[1]  ,color[2] )
                screen.set_at((round_i_mul_rayspace + k , j) , color)
                k+=1
            j+=1

另外,not(j == top)是否应该比j != top快?

相关问题