(python)pygame opengl比blitting慢得多

(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

我刚刚在pygame应用程序中实现了基本的opengl渲染,认为硬件加速会使程序运行得更快。相反,速度要慢得多

看起来问题出在绘图功能上

这是我的opengl绘图功能

    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周期。