Just a warning, glBegin(), glEnd() is deprecated, and so you know it's an
old tutorial.

Have you tried  SFML's python binding? It's a bit like Pygame, and
abstracts the OpenGL functions for you.


On Tue, Jul 29, 2014 at 7:38 AM, sylvain.boussekey <
sylvain.bousse...@vertpingouin.fr> wrote:

> I tried that with almost no perf gain.
> I managed to do it in opengl but perfs are poor... The only advantage is
> that there is almost no fps differences when increasing resolution. But
> still framerate is poor. Here is roughly what I do (without knowing what I
> do really)e :
>
>     def openglblit(self, surf):
>         textureSurface = surf
>
>         textureData = pygame.image.tostring(textureSurface, "RGBA", 1)
>
>         width = textureSurface.get_width()
>         height = textureSurface.get_height()
>
>         texture = glGenTextures(1)
>         glBindTexture(GL_TEXTURE_2D, texture)
>         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
>         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
>         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
> GL_UNSIGNED_BYTE, textureData)
>
>         glClear(GL_COLOR_BUFFER_BIT)
>
>         glBindTexture(GL_TEXTURE_2D, texture)
>         glBegin(GL_QUADS)
>         glTexCoord2d(0,1)
>         glVertex2d(-1,1)
>         glTexCoord2d(0,0)
>         glVertex2d(-1,-1)
>         glTexCoord2d(1,0)
>         glVertex2d(1,-1)
>         glTexCoord2d(1,1)
>         glVertex2d(1,1)
>
>         glEnd()
>         glFlush()
>
>         glDeleteTextures(texture)
>
> But it seems that the conversion between pygame surface and opengl tex is
> slow.
> Argh !! I will really need to go full opengl if I want better perfs...
> sad...
>
>
> Le 2014-07-28 23:14, Noel Garwick a écrit :
>
>> vertpingouin,
>>
>> If you are doing that every frame as part of the sprites .draw or
>> .update method , its still possible the transform is what is taking up
>>
>> CPU time.  You may want to use something like this instead:
>>
>> class MySpriteThing( pygame.sprite.Sprite):
>>     image = None
>>     def __init___( self ):
>>
>>         .....
>>         if MySpriteThing.image is None:
>>             MySpriteThing.image = pygame.image.load( "foo.png" )
>>             size = MySpriteThing.image.get_size()
>>             new_width = size[0] * X_SCALE # where X_SCALE is the
>> ratio between RESOLUTION_X (the big resolution) and GRAPHICS_X (the
>> resolution the images were made at) ; ( 1920 / 640 )
>>             new_height = size[1] * Y_SCALE
>>             MySpriteThing..image = pygame.transform.scale(
>> self.image, ( new_width, new_height ) )
>>
>>         self.image = MySpriteThing.image
>>
>> ........
>>
>> # then, in your main loop, blit the sprites .image attribute to your
>>
>> display surface
>>
>> mySpriteGroup.draw( screen )
>>
>>  pygame.display.update()
>>
>> On Mon, Jul 28, 2014 at 4:41 PM, vertpingouin
>> <sylvain.bousse...@vertpingouin.fr [3]> wrote:
>>
>>  to Sam :
>>>
>>> Im using HWSURFACE flag but I got exatly the same framerate. The
>>> ideal
>>> would be to rewrite everything in openGL but I dont know it well...
>>> yet.
>>>
>>> to Noel:
>>> On the topic of performing transform one time only, Im not sure
>>>
>>> what
>>> mean here. If I scale my surface one time, it gets, say, 1920x1080,
>>> but
>>> then blitting is done only of a 640x480 part of the surface... So
>>> maybe
>>> I misunderstood something here.
>>>
>>> Im using this to transform :
>>>
>>> pygame.transform.scale(self.native, (SCREENWIDTH, SCREENHEIGHT),
>>> self.screen)
>>>
>>> where native is the little one and screen the big one. I assume
>>> that
>>> self.native is scaled then blit onto self.screen...
>>>
>>> I think this is the blitting that is slow because if I use a lesser
>>> resolution for self.screen, I almost get back my precious frames
>>> per
>>> second.
>>>
>>> It will be really cool to send my little native surface to my
>>> graphic
>>> card, then let it scale by itself. Dont know if its even possible.
>>>
>>>
>>> Le lundi 28 juillet 2014 à 11:50 -0400, Noel Garwick a écrit :
>>>
>>>  Right now you are blitting tiles to a 640x480 surface, and then
>>>>
>>> > performing a transform on the whole surface and then blitting it
>>> to
>>> > the display?
>>> >
>>> >
>>> > If this is the case, then try to only perform the scale operation
>>> when
>>> > the resolution is changed (instead of once each frame) and see
>>> how
>>> > that works.  I know you mentioned that the full screen blit
>>> operation
>>> > seems to be the main bottleneck, but this should help too.
>>> >
>>> >
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > On Mon, Jul 28, 2014 at 7:32 AM, Sam Bull <sam.hack...@sent.com
>>> [1]>
>>>
>>> > wrote:
>>> >         On lun, 2014-07-28 at 06:54 +0200, VertPingouin
>>> wrote:
>>> >         > So I came up with the idea of an hardware opengl
>>> texture
>>> >         stretching
>>> >         > instead of a dumb blit but I dont know how to
>>>
>>> achieve it.
>>> >         >
>>> >         > Anyone has already done this ?
>>> >         >
>>> >
>>> >
>>> >         You would just need to code the graphics in OpenGL
>>> without
>>> >         using
>>> >         pygame.Surface and pygame.draw. First though, check
>>> you are
>>> >         using the
>>> >         HWSURFACE flag, if you are running fullscreen, its
>>>
>>> possible
>>> >         this might
>>> >         provide the necessary speedup without going to
>>> OpenGL.
>>> >
>>> >
>>> http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode
>>> [2]
>>> >
>>> >
>>>
>>
>>
>>
>> Links:
>> ------
>> [1] mailto:sam.hack...@sent.com
>> [2] http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode
>> [3] mailto:sylvain.bousse...@vertpingouin.fr
>>
>
>


-- 
Jake

Reply via email to