当前位置: 首页 > 知识库问答 >
问题:

(python)pygame opengl比blitting慢得多

谭修竹
2023-03-14

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

看起来问题是绘图功能。

这是我的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个月后到期)

http://pastebin.com/ApfiCQzw

我的源代码

https://bitbucket.org/claysmithr/warbots/src

注意:当我将其设置为不绘制任何图块时,我得到60 fps!如果我限制只画出现在屏幕上的图块,我也能得到20 fps,但这仍然比闪光慢得多

我试图绘制的瓷砖数量(64x64): 15,625

有没有办法测试我是不是真的硬件加速了?

我应该回到布利特吗?

编辑:闪光自动不绘制不在屏幕上的图块吗?这可能就是opengl如此缓慢的原因!

共有1个答案

严书
2023-03-14

如果我理解正确的话,你需要在每一帧中绘制数千个这样的纹理四合院。减速来自于您对每个四边形进行的多个OpenGL调用——在上面的代码中至少有16个。

您需要做的是分批绘制,一次绘制更多的基本体。

首先,你能把瓷砖合并成更大的单元吗?过去十年中制造的任何显卡都可以处理16Kx16K纹理贴图。你可以在不绑定新纹理的情况下绘制越多的四边形越好。

用顶点数组替换glBecin... glend块。即使在最糟糕的情况下,仍然一次绘制一个四边形,您也可以用2个、glVertex指针和glTexas Coord指针替换当前的10个OpenGL调用。

然后开始将平铺四边形合并到更大的顶点阵列中。添加rect而不是glTranslatef。x和rect。y值直接指向每个顶点。

glRotatef是一个问题,如果它真的必须为每个磁贴不同。如果它被限制在90度的倍数,那么你不需要它,而是交换周围的纹理弦。对于其他值,计算出如何使用sin和cos直接旋转纹理代码。

消除“平移”和“旋转每平铺”后,可以将所有计算的四边形顶点和纹理坐标粘贴到巨大的顶点数组中,只需两次调用即可绘制整个贴图。

希望这能有所帮助。

(对于真正的超性能,您可能希望使用GPU端顶点缓冲区对象和着色器,但从您的编码风格来看,我假设您希望使用OpenGL 1/2。)

 类似资料:
  • 我正在使用mongoose来计算匹配某个查询的文档数量。此查询的索引为: Mongo版本为3.2,收藏文档数量约为175万。 需要2分多钟。但如果我这么做了: 然后大约需要2.5秒。 我做错什么了吗?我能做些什么来加快速度吗? 编辑:解释日志。 计数: 为了找到。

  • 问题内容: 我正在重写我的一个Android应用程序以利用NDK,并且它每次要做的第一件事之一是打开一个1.5MB的文本文件(大约15万行),并将每一行放入数据中结构体。当我使用Java的BufferedReader.readLine()进行此操作时,从SD卡读取文件大约需要2.5秒。这是我用于此的代码: 将C 与ifstream一起使用需要更长的时间…对于同一文件大约需要3分钟。这是我在C 中使

  • 2)在火花中: 同样的,在Spark中需要30秒,在Python中需要1秒。 我的Spark比纯Python慢得多的几个可能原因:

  • 问题内容: Python比Java / C#慢吗? 性能比较c-java-python-ruby-jython-jruby- groovy 这是一个优化CPython的项目:空载吞咽 问题答案: 不要混淆语言和运行时。 Python(该语言)具有许多运行时实现。 CPython通常是解释型的,并且会比本机代码C#慢。取决于Java JIT编译器,它可能比Java慢。 JYthon在JVM中进行解释

  • 问题内容: 嗨,我想了解为什么下面的代码使用正则表达式进行拆分字符串拆分 比下面的python代码慢 这是 我在osx上使用clang ++。 使用-O3进行编译可以降低到 问题答案: 我将循环数增加到1000000,以获得更好的计时措施。 这是我的Python时间: 这等效于您的代码,但更漂亮: 定时: 这是为了避免构造和分配矢量和字符串对象而进行的优化: 定时: 这几乎是100%的性能提升。

  • 问题内容: 我在计算机上得到以下结果: 我认为这可能与int / long转换有关,但在2.7中并没有更快的速度。 问题答案: Python 2使用朴素的阶乘算法: Python 3使用分治法阶乘算法: 有关讨论,请参见Python Bugtracker问题。感谢DSM指出这一点。