(python)pygame opengl比blitting慢得多
我刚刚在pygame应用程序中实现了基本的opengl渲染,认为硬件加速会使程序运行得更快。相反,速度要慢得多 看起来问题出在绘图功能上 这是我的opengl绘图功能(python)pygame opengl比blitting慢得多,opengl,pygame,Opengl,Pygame,我刚刚在pygame应用程序中实现了基本的opengl渲染,认为硬件加速会使程序运行得更快。相反,速度要慢得多 看起来问题出在绘图功能上 这是我的opengl绘图功能 def draw(self, screen): rect = self.texture.imagerect.copy() rect.x += self.xoffset rect.y += self.yoffset halfWidth = self.getWi
def draw(self, screen):
rect = self.texture.imagerect.copy()
rect.x += self.xoffset
rect.y += self.yoffset
halfWidth = self.getWidth()/2
halfHeight = self.getHeight()/2
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, self.texture.getTexID())
self.color.setGLColor()
glPushMatrix()
glTranslatef(rect.x,rect.y,0)
glRotatef(self.angle, 0, 0, 1);
glBegin(GL_QUADS)
glTexCoord2d(0,0)
glVertex2f(-halfWidth + self.pivot.x, -halfHeight + self.pivot.y)
glTexCoord2d(0,1)
glVertex2f(-halfWidth + self.pivot.x,-halfHeight + self.getHeight() + self.pivot.y)
glTexCoord2d(1,1)
glVertex2f(-halfWidth + self.getWidth() + self.pivot.x,-halfHeight + self.getHeight() + self.pivot.y)
glTexCoord2d(1,0)
glVertex2f(-halfWidth + self.getWidth() + self.pivot.x,-halfHeight + self.pivot.y)
glEnd()
glPopMatrix()
我的分析器为draw函数提供了什么
ncalls tottime percall cumtime percall filename:lineno(function)
312792 20.395 0.000 34.637 0.000 image.py:61(draw)
我的探查器文本的其余部分:(1个月后到期)
我的源代码
注意:当我设置为不绘制任何瓷砖时,我得到60 fps!如果我限制只画屏幕上出现的瓷砖,我也会得到20 fps,但这仍然比光点慢得多
我尝试绘制的瓷砖数量(64x64):15625
有没有办法测试我是否真的是硬件加速的
我应该回到布利特吗
编辑:blitting是否自动不绘制不在屏幕上的平铺?这可能就是opengl如此缓慢的原因 如果我理解正确的话,你需要在每一帧绘制数千个这样的纹理四边形。减速来自于您对每个四边形进行的多个OpenGL调用——在上面的代码中至少有16个 您需要做的是分批绘制,一次绘制更多的基本体 首先,你能把瓷砖合并成更大的单位吗?过去十年中制造的任何图形卡都可以处理16K x 16K纹理贴图。无需绑定新纹理即可绘制的四边形越多越好 更换glBegin。。带有顶点阵列的glEnd块。即使在一次只绘制一个四元组的最坏情况下,您也可以将当前的10个OpenGL调用替换为2个glVertexPointer和glTexCoordPointer 然后开始将平铺四边形合并到更大的顶点阵列中。不使用GLTRANSTEF,而是将rect.x和rect.y值直接添加到每个顶点 如果每个磁贴的glRotatef确实必须不同,那么它就是一个问题。如果它被限制为90度的倍数,那么您不需要它,只需交换纹理坐标即可。对于其他值,请了解如何使用sin和cos直接旋转纹理坐标 消除“平移”和“旋转每平铺”后,可以将所有计算的四边形顶点和纹理坐标粘贴到巨大的顶点数组中,只需两次调用即可绘制整个贴图 希望这有帮助
(对于真正的超性能,您可能希望使用GPU端的顶点缓冲区对象和着色器,但从您的编码风格来看,我认为您希望坚持使用OpenGL 1/2。)如果您关心性能,您正在做一些有点奇怪的事情。最重要的是,您正在以双精度传递纹理坐标。1.0的精度不比1.0f高,但GL必须将1.0转换为单精度,这样会浪费CPU周期。