如何解决优化掉块加载
所以我正在 PyGame 中制作一个类似 Minecraft 的游戏,我有两件事需要优化。
当你死亡时,你会掉落你持有的所有物品。这在您有几个项目时没有问题,但是当您有多个项目时,帧速率会下降到看起来像 PowerPoint 的程度。
这是掉落物品的代码:
from random import randint
from OpenGL.GL import *
import numpy as np
import math
from functions import roundPos
class droppedBlock:
def __init__(self,gl):
self.gl = gl
self.blocks = {}
def addBlock(self,coords,name,dr=True):
self.blocks[len(self.blocks)] = [coords,randint(0,2) / 10,[0,"-"],dr]
def update(self):
cpy = self.blocks.copy().items()
for i in cpy:
pp = list(self.gl.player.position)
sx,sy,sz = 0.25,0.25,0.25
x,y,z = 0,0
X,Y,Z = x + sx,y + sy,z + sz
kx,ky,kz = i[1][0][0] - i[1][2],i[1][0][1] + 0.1 + i[1][3][0],i[1][0][2] + i[1][2]
br = False
for xs in (1,-1):
for ys in (1,-1,-2):
for zs in (1,-1):
if roundPos((pp[0] + xs,pp[1] + ys,pp[2] + zs)) == roundPos((x + kx,y + ky,z + kz)) and \
self.gl.player.hp > 0:
self.blocks.pop(i[0])
self.gl.blockSound.playPickUpSound()
self.gl.player.inventory.addBlock(i[1][1])
br = True
if br:
break
if br:
break
if br:
break
if br:
continue
vertexes = [
(X,z,x,X,z),(x,Z,Z),(X,]
rot = np.array([
[math.cos(i[1][4]),math.sin(i[1][4]),1],1,[-math.sin(i[1][4]),math.cos(i[1][4]),])
i[1][4] += 0.01
for e,j in enumerate(vertexes):
r1 = ((j[0],j[1],j[2],1),(j[3],j[4],j[5],(j[6],j[7],j[8],(j[9],j[10],j[11],1)) @ rot
vertexes[e] = (r1[0][0] + kx,r1[0][1] + ky,r1[0][2] + kz,r1[1][0] + kx,r1[1][1] + ky,r1[1][2] + kz,r1[2][0] + kx,r1[2][1] + ky,r1[2][2] + kz,r1[3][0] + kx,r1[3][1] + ky,r1[3][2] + kz)
block = self.gl.block[i[1][1]]
tex_coords = ('t2f',(0,1))
self.gl.stuffBatch.add(4,GL_QUADS,block[4],('v3f',vertexes[0]),tex_coords) # back
if i[1][5]:
self.gl.stuffBatch.add(4,block[5],vertexes[1]),tex_coords) # front
self.gl.stuffBatch.add(4,block[0],vertexes[2]),tex_coords) # left
self.gl.stuffBatch.add(4,block[1],vertexes[3]),tex_coords) # right
self.gl.stuffBatch.add(4,block[2],vertexes[4]),tex_coords) # bottom
self.gl.stuffBatch.add(4,block[3],vertexes[5]),tex_coords) # top
if i[1][3][1] == "-":
i[1][3][0] -= 0.003
if i[1][3][1] == "+":
i[1][3][0] += 0.003
if i[1][3][0] < -0.1:
i[1][3][1] = "+"
if i[1][3][0] > 0.1:
i[1][3][1] = "-"
if i[1][0][1] < -2:
self.blocks.pop(i[0])
continue
yy = i[1][0][1]
if roundPos((i[1][0][0],i[1][0][1],i[1][0][2])) not in self.gl.cubes.cubes:
yy -= 0.1
self.blocks[i[0]][0] = (i[1][0][0],yy,i[1][0][2])
self.blocks[i[0]][4] = i[1][4]
我还有一个 drawInfoLabel 会导致帧率下降很多。 这是 drawInfoLabel 代码:
def drawInfoLabel(gl,text,xx=0,yy=0,style=None,size=15,anchor_x='left',anchor_y='baseline',opacity=1,rotate=0,label_color=(255,255,255),shadow_color=(56,56,56),scale=0,shadow=True):
if style is None:
style = []
y = -21
ms = size / 6
for i in text.split("\n"):
ix = ms
iy = gl.HEIGHT + y + yy - ms
if xx:
ix = xx + ms
if yy:
iy = yy - ms
shadow_lbl = pyglet.text.Label(i,font_name='Minecraft Rus',color=(shadow_color[0],shadow_color[1],shadow_color[2],round(opacity * 255)),font_size=size,x=ix,y=iy,anchor_x=anchor_x,anchor_y=anchor_y)
lbl = pyglet.text.Label(i,color=(label_color[0],label_color[1],label_color[2],x=ix - ms,y=iy + ms,anchor_y=anchor_y)
if not style:
lbl.set_style("background_color",(69,69,100))
else:
for st in style:
lbl.set_style(st[0],st[1])
shadow_lbl.set_style(st[0],st[1])
if rotate:
glRotatef(rotate,0.0,1.0)
if scale:
glScalef(scale,scale,0)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
if shadow:
shadow_lbl.draw()
lbl.draw()
if rotate:
glRotatef(-rotate,1.0)
y -= 21
我想知道优化这些的最佳方法是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。