如何為遊戲設定顯示驅動,OpenGL?以及取得圖形環境和視窗的資訊
訂閱 480
在 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()}'){}