如何为游戏配置显示驱动,OpenGL?以及获取图形环境和窗口的信息
关注 1421
在 Pygame 中为游戏设置显示驱动
事实上,Pygame 包似乎没有提供直接设置显示驱动的函数或方法,当display
模块进行初始化时,Pygame 将根据当前的操作系统和用户权限,自行选择游戏所采用的显示驱动。在 Windows 中,可采用的显示驱动通常有windib
,directx
,在 UNIX/Linux 中,可采用的显示驱动通常有x11
,dga
,fbcon
,directfb
,ggi
,vgl
,svgalib
,aalib
。
当然,你可以通过在操作系统中添加环境变量SDL_VIDEODRIVER
,来指定显示驱动,比如,在 Windows 操作系统中,将SDL_VIDEODRIVER
设置为windib
。
获取当前显示驱动的名称
display
模块的get_driver
函数,可用于获取游戏当前使用的显示驱动的名称。
get_driver()
- 返回值
get_driver
函数的返回值是一个表示显示驱动名称的字符串。
# 导入并初始化 display 模块
from pygame import display
display.init()
print(f'当前显示驱动:{display.get_driver()}')
当前显示驱动:windows
获取和设置 OpenGL 属性
如果在调用set_mode
函数时,为参数flags
使用了OPENGL
,那么你可以使用display
模块的gl_get_attribute
和gl_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
函数已经被调用。
# 导入并初始化 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 变量
masks
,shifts
和losses
变量是包含四个整数的 Python 元组,四个整数被用于将颜色中的红色,绿色,蓝色,透明度写入像素。- blit_hw,blit_hw_CC,blit_hw_A,blit_sw,blit_sw_CC,blit_sw_A 变量
blit_hw
,blit_hw_CC
,blit_hw_A
,blit_sw
,blit_sw_CC
,blit_sw_A
变量可能始终保持为0
,如果为1
则表示硬件或软件加速的某一项功能已经启用。- current_h 变量
current_h
变量是表示游戏窗口表面高度的整数。- current_w 变量
current_w
变量是表示游戏窗口表面宽度的整数。
下面,我们在创建游戏窗口之前和之后,调用Info
函数来获取默认和当前的图形环境信息。
由于所设置的显示模式并不支持全屏模式下的表面大小 400x300,最终的表面大小被 Pygame 设置为了 640x480。
# 导入 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 字典,包含由操作系统提供的与游戏窗口有关的信息。
在下面的示例中,操作系统未提供与游戏窗口有关的信息。
# 导入并初始化 display 模块
from pygame import display
display.init()
# 获取由操作系统提供的关于游戏窗口的信息
print(f'游戏窗口信息:{display.get_wm_info()}')
{}