Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pyglet提高批处理的性能?_Python_Opengl_Pyglet - Fatal编程技术网

Python 如何使用pyglet提高批处理的性能?

Python 如何使用pyglet提高批处理的性能?,python,opengl,pyglet,Python,Opengl,Pyglet,我有一些使用pyglet库创建批处理的代码。当满载时,整个装置包含大约10000个四芯。现在,当我运行渲染整个场景的脚本时(这是一个完全静态的场景),我得到3FPS。在我用于场景渲染器的原型中,唯一的一件事是,我将使用一些缓慢而草率编写的python代码构建贴图,对于完全相同的场景,该代码碰巧也以3FPS的速度运行。由于PygLET中的批处理是用C++管理的,所以我有一种困扰的感觉,我缺少一些明显的东西,导致批量在3FPS上绘制。 这是我的场景初始化代码: glViewport(0, 0, wi

我有一些使用pyglet库创建批处理的代码。当满载时,整个装置包含大约10000个四芯。现在,当我运行渲染整个场景的脚本时(这是一个完全静态的场景),我得到3FPS。在我用于场景渲染器的原型中,唯一的一件事是,我将使用一些缓慢而草率编写的python代码构建贴图,对于完全相同的场景,该代码碰巧也以3FPS的速度运行。由于PygLET中的批处理是用C++管理的,所以我有一种困扰的感觉,我缺少一些明显的东西,导致批量在3FPS上绘制。

这是我的场景初始化代码:

glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 10000.)
glMatrixMode(GL_MODELVIEW)
glClearColor(94.0/255.0, 161.0/255.0, 255.0/255.0, 0.5)
glClearDepth(1.0)
glShadeModel(GL_FLAT)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)  
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
这是运行每个帧以渲染场景的代码:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(0, 0, -1*self.mapZoomLevel)
glRotatef(self.mapPitch/5, 1, 0, 0)
glRotatef(self.mapRotation, 0, 0, 1)
glTranslatef(self.mapX, self.mapY, 0)
self.mapPrimitive.batch.draw()

如果场景是静态的,则应使用显示列表轻松修复该场景。一些供应商通过在内部将显示列表转换为VBO和GLMultiDrawerElements()来优化显示列表,因此一些糟糕的10k四边形应该没有问题。这就像是四行代码。

如果您使用的是CPython,则有一个快捷方式。Pypy已经支持pyglet一段时间了()。 切换到Pypy,您可以轻松地获得性能改进,并且基本上不需要更改代码。
希望对您有所帮助。

OS?OpenGL实现供应商?你能发布一个完整的,最小的程序来演示这个问题吗?任何问题都很可能出现在你的draw()函数中。。。你能发布代码吗?对于发现这一点的人:我认为直接使用VBO在这两种情况下都是最好的。@Bartvbl实际上在一些旧的实现上,当硬件T&L刚刚出现时,VBO有时比简单的顶点数组慢(我想它们需要更复杂的管道重新配置)。违反直觉但正确。在今天的硬件上,VBO当然可以被认为是优越的。但是,对于简单的科学可视化来说,尽管OpenGL4有很多优点,但没有什么能比得上
glBegin()
/
glEnd()
的简单性。