URLhttps://learnscript.net/zh/pygame/display/graphics/
    复制链接转到说明  示例

    如何为游戏配置显示驱动,OpenGL?以及获取图形环境和窗口的信息

    我被代码海扁署名-非商业-禁演绎
    阅读 9:31·字数 2859·发布 

    在 Pygame 中为游戏设置显示驱动

    事实上,Pygame 包似乎没有提供直接设置显示驱动的函数或方法,当display模块进行初始化时,Pygame 将根据当前的操作系统和用户权限,自行选择游戏所采用的显示驱动。在 Windows 中,可采用的显示驱动通常有windibdirectx,在 UNIX/Linux 中,可采用的显示驱动通常有x11dgafbcondirectfbggivglsvgalibaalib

    当然,你可以通过在操作系统中添加环境变量SDL_VIDEODRIVER,来指定显示驱动,比如,在 Windows 操作系统中,将SDL_VIDEODRIVER设置为windib

    环境变量

    关于环境变量,你可以查看编程指南什么是环境变量一节。

    获取当前显示驱动的名称

    display模块的get_driver函数,可用于获取游戏当前使用的显示驱动的名称。

    get_driver()

    返回值

    get_driver函数的返回值是一个表示显示驱动名称的字符串。

    driver.py
    # 导入并初始化 display 模块
    from pygame import display
    display.init()
    
    print(f'当前显示驱动:{display.get_driver()}')
    当前显示驱动:windows

    获取和设置 OpenGL 属性

    如果在调用set_mode函数时,为参数flags使用了OPENGL,那么你可以使用display模块的gl_get_attributegl_set_attribute函数,来获取和设置与 OpenGL 相关的属性。

    gl_get_attribute(flag)

    flag 参数

    flag参数是需要获取的 OpenGL 属性所对应的整数,一般会选择pygame模块中以GL_开头的变量作为该参数的值,比如GL_CONTEXT_MAJOR_VERSION

    返回值

    gl_get_attribute函数返回一个表示 OpenGL 属性值的整数。

    gl_set_attribute(flag, value)

    flag 参数

    flag参数是需要设置的 OpenGL 属性所对应的整数,一般会选择pygame模块中以GL_开头的变量作为该参数的值,比如GL_CONTEXT_MAJOR_VERSION

    value 参数

    value参数是一个整数,对应了 OpenGL 属性的值。

    gl_set_attribute 函数应该在创建游戏窗口之前调用

    要设置 OpenGL 的某些属性,应该在创建游戏窗口之前调用gl_set_attribute函数,否则可能无法达到想要的效果。

    显示,窗口,屏幕

    更多关于display模块的set_mode函数的信息,请查看创建游戏窗口一段。

    在下面的示例中,第三个函数gl_set_attribute不会产生效果,因为set_mode函数已经被调用。

    opengl.py
    # 导入并初始化 display 模块
    from pygame import display
    display.init()
    
    from pygame import OPENGL, FULLSCREEN, GL_CONTEXT_MAJOR_VERSION, GL_ACCELERATED_VISUAL, GL_DEPTH_SIZE
    # 设置与 OpenGL 相关的属性 display.gl_set_attribute(GL_CONTEXT_MAJOR_VERSION, 4) display.gl_set_attribute(GL_ACCELERATED_VISUAL, 0)
    # 创建一个采用 OpenGL 的全屏游戏窗口 display.set_mode([0, 0], OPENGL | FULLSCREEN)
    # 下面的语句不会产生效果 display.gl_set_attribute(GL_DEPTH_SIZE, 32)
    # 获取与 OpenGL 相关的属性 print(f'GL_CONTEXT_MAJOR_VERSION:{display.gl_get_attribute(GL_CONTEXT_MAJOR_VERSION)}') print(f'GL_ACCELERATED_VISUAL:{display.gl_get_attribute(GL_ACCELERATED_VISUAL)}') print(f'GL_DEPTH_SIZE:{display.gl_get_attribute(GL_DEPTH_SIZE)}')
    GL_CONTEXT_MAJOR_VERSION:4
    GL_ACCELERATED_VISUAL:0
    # 并非代码中设置的 32
    GL_DEPTH_SIZE:16

    获取图形环境信息

    display模块的Info函数,将返回一个_VidInfo对象,该对象包含与当前图形环境相关的信息。在调用set_mode函数设置显示模式之后,你可以调用Info函数来验证显示模式是否已经生效。

    Info()

    返回值

    Info函数返回一个包含当前图形环境信息的_VidInfo对象。

    在创建游戏窗口之前调用 Info 函数可能会获得默认图形环境的信息

    如果在创建游戏窗口之前,调用Info函数,那么某些操作系统会提供默认图形环境的信息。

    display模块的_VidInfo对象,仅简单的包含了一些表示图形环境信息的变量,就目前而言,这些变量中的某些不会被设置,他们始终保持为0

    hw 变量

    hw变量可能始终保持为0,如果为1则表示已经启用了硬件加速。

    wm 变量

    wm变量始终保持为1,表示窗口可以使用窗口模式显示。

    video_mem 变量

    video_mem变量可能始终保持为0,表示用于显示的内存大小(以兆字节为单位),如果为0则表示大小未知。

    bitsize 变量

    bitsize变量表示用多少个 bit 来存储一个像素。

    bytesize 变量

    bytesize变量表示用多少个字节来存储一个像素。

    masks,shifts,losses 变量

    masksshiftslosses变量是包含四个整数的 Python 元组,四个整数被用于将颜色中的红色,绿色,蓝色,透明度写入像素。

    blit_hw,blit_hw_CC,blit_hw_A,blit_sw,blit_sw_CC,blit_sw_A 变量

    blit_hwblit_hw_CCblit_hw_Ablit_swblit_sw_CCblit_sw_A变量可能始终保持为0,如果为1则表示硬件或软件加速的某一项功能已经启用。

    current_h 变量

    current_h变量是表示游戏窗口表面高度的整数。

    current_w 变量

    current_w变量是表示游戏窗口表面宽度的整数。

    下面,我们在创建游戏窗口之前和之后,调用Info函数来获取默认和当前的图形环境信息。

    由于所设置的显示模式并不支持全屏模式下的表面大小 400x300,最终的表面大小被 Pygame 设置为了 640x480。

    info.py
    # 导入 display 模块和 FULLSCREEN,并进行初始化
    from pygame import display, FULLSCREEN
    display.init()
    
    # 尝试获取默认的图形环境的信息 info = display.Info() print(f'默认的表面大小:{info.current_w}x{info.current_h}')
    # 尝试创建一个表面大小为 400x300 并全屏显示的窗口 s = display.set_mode((400, 300), FULLSCREEN)
    # 获取当前的图形环境的信息 info = display.Info() print(f'表面大小:{info.current_w}x{info.current_h}')
    默认的表面大小:2560x1440
    表面大小:640x480

    获取窗口信息

    display模块的get_wm_info函数,其返回值是一个 Python 字典,包含了由操作系统提供的与游戏窗口相关的信息,字典中的键值对的键为字符串类型。get_wm_info可能不像你所期望的那样实用,因为操作系统可能不会提供关于游戏窗口的任何信息,函数会返回一个空的 Python 字典,而在另一些情况下,字典可能会包含一个键为window的键值对,其值为游戏窗口的句柄。

    get_wm_info()

    返回值

    get_wm_info函数的返回值是一个 Python 字典,包含由操作系统提供的与游戏窗口有关的信息。

    在下面的示例中,操作系统未提供与游戏窗口有关的信息。

    window.py
    # 导入并初始化 display 模块
    from pygame import display
    display.init()
    
    # 获取由操作系统提供的关于游戏窗口的信息 print(f'游戏窗口信息:{display.get_wm_info()}')
    {}

    源码

    src/zh/display/graphics·codebeatme/pygame·GitHub