我几乎一辈子都是windows用户,每当我在任何图形应用程序上定义窗口大小时(游戏、jframes、glfw等等)该窗口将以像素为单位显示该大小。
然而,自从迁移到macOS之后,我注意到情况并非如此,背景中也出现了某种缩放现象,我想知道如何扭转这种情况,这样我就可以得到预期的屏幕大小。这里有一些例子。
这是一个游戏窗口,其大小被定义为1920x1080。我的笔记本电脑显示器分辨率为2560x1600,所以1080 p的窗口应该很容易安装,但它不能。
当然,我可以缩小窗口的大小--这是我倾向于做的事情,直到我成为图形的openGL,特别是gl_FragCoord函数,它才会产生这样的结果(在windows机器上,形状是完全中心的,大小也是正确的)。
我通常只是用尝试和错误硬编码一些值来解释这种扩展,但是有什么方法可以永久地为所有程序修复这个问题吗?
很抱歉有这么长的问题,并提前感谢您的回答!
(编辑)同时,im更倾向于寻找一种编程方式来解释这种扩展,而不是使用像switchresx这样的软件在本地res上强制显示,因为这使得mac几乎无法使用。
发布于 2022-09-30 20:15:23
你试过:
W, H =pygame.display.get_desktop_sizes()
虽然您的屏幕可能名义分辨率为2560x1600像素,但程序可能无法识别该分辨率。我将验证所传递的像素坐标是否与程序识别的坐标相关。
所以假设对于W,你得到了一个值,而不是2560,那么你就知道了缩放因子,并且可以相应地调整。
我有一种感觉,这与Retina显示器本身而不是操作系统有关。我猜想,在Retina显示器中,你有了我所指的‘子像素’。因此,对于您的程序标识的每个像素,您的程序有几个“子像素”,它们加起来的名义分辨率为2560×1600,而游戏只“看到”,让我们说1680x1050像素块,每个块包含'x‘Retina显示’子像素‘。
如果获取桌面大小返回您的标称显示值,请尝试使用以下代码实际测量显示大小:
import pygame as pg
MAIN = pg.display.set_mode((0, 0), pg.FULLSCREEN)
def GameUI(hrange, wrange):
for h in range(hrange):
if h % 10 != 0:
pg.draw.rect(MAIN,(255, 255, 255), (5,h,1,1))
elif h % 100 == 0:
pg.draw.rect(MAIN, (255, 255, 255), (5, h, 20, 1)) # draws long tick at intervals of 100
elif h % 10 == 0:
pg.draw.rect(MAIN, (255, 255, 255), (5, h, 10, 1)) # draws long tick at intervals of 10
for w in range(wrange):
if w % 10 != 0:
pg.draw.rect(MAIN,(255, 255, 255), (w, 5, 1, 1))
elif w % 100 == 0:
pg.draw.rect(MAIN, (255, 255, 255), (w, 5, 1, 20)) # draws long tick at intervals of 100
elif w % 10 == 0:
pg.draw.rect(MAIN, (255, 255, 255), (w, 5, 1, 10)) # draws long tick at intervals of 10
pg.display.update()
def Main():
run = True
# pick some value larger than your resoultion
hrange = 5000
wrange = 5000
while run:
for event in pg.event.get():
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
run = False
GameUI(hrange, wrange)
if __name__ == "__main__":
Main()这应该是程序识别的像素分辨率,它至少会为你提供猜测。
这里还有几个解决办法是使用宽度=0、高度=0和pygame.FULLSCREEN来自动设置屏幕的大小:
MAIN = pygame.display.set_mode((0, 0), pg.FULLSCREEN)
理论上,您也可以使用pygame.display.get_window_size()来查看它是否与您的标称分辨率或所测量的分辨率相匹配。如果是后者,那么您可以很容易地进行比较:
W, H =pygame.display.get_desktop_sizes()到pygame.display.get_window_size()
这是我在StackOverflow上的第一个回答,所以如果我不是完全正确的话,请友好地<3
编辑:
下面是一些可能有用的东西:How to find display scaling factor on retina/4k displays?
https://stackoverflow.com/questions/73912525
复制相似问题