我正在尝试移动这张图片:
在我的PyGame屏幕上,从右到左再回来,然而,随着图像的移动,每一秒钟左右,我都会看到屏幕撕裂的闪烁,就像这样:
我使用的代码是一个类似下面这样的循环:
screen.blit(img, (x,y))
pygame.update((x,y),(w,h))
pygame.draw.rect(screen,(0,0,0),((x,y),(w,h)))
到目前为止,我已经尝试了以下方法来解决这个问题:
在创建屏幕时使用HWSURFACE
、FULLSCREEN
、DOUBLEBUF
标记,这没有任何效果,我还将我的.update(rect)
调整为.flip()
(因为使用DOUBLEBUF
时建议这样做?)
在GPU和CPU之间分配内存(我在树莓派2上运行),我已经尝试给两者更多的内存,没有变化。
设置一个clock.tick来限制更新速率到60FPS(上下也一样),这确实消除了一些撕裂,但不是全部
向左或向右调整每个增量的大小,使增量更小会减少撕裂,但也会降低速度。(不能让它太慢)
在以前的位置(移动图像以确保后面没有痕迹时)上绘制一个新的黑色表面而不是绘制一个黑色矩形,因为我在某个地方读到,HWSURFACE
比绘图更支持blit
,尽管我不能确认这一点?-这没有效果
如果任何人有任何其他解决方案可以改善这种情况,我将不胜感激。
我不希望从PyGame改为其他任何东西(比如pyglet),因为到目前为止,我已经使用PyGame完成了相当多的实现,但我对建议持开放态度。
干杯
编辑
请求的相关代码:
if scanner == True:
clocker.tick(clockspeed)
if x < 11:
slower = 3
if firstTime == True:
img.set_alpha(int(x * 25))
newSurf.set_alpha(int(x * 25))
screen.blit(newSurf,(xText,35))
pygame.display.update((xText,35),((xText + newSurf.get_width()),(50 + newSurf.get_height())))
img.set_alpha(255)
elif x > (divider - 15):
slower = 3
else:
slower = 0
firstTime = False
screen.blit(img, ((xStart - (x * increment) + slower),100))
pygame.display.update(((xStart - (x * increment) + slower),100),(95,450))
pygame.draw.rect(screen, (0,0,0), (((xStart - (x * increment) + slower),100),(95,450)))
slower
变量是为了给人一种惯性的感觉,当杆子到达其扫描速度的最左边和最右边时,它会放慢一点。
firstTime
变量用于在条形图第一次出现时淡入淡出。
在这下面有另一个循环,它非常相似,但会以另一种方式将图像扫回来。
发布于 2021-08-19 20:07:27
设置
vsync = true
在pygame.display.set_mode()
中
发布于 2019-04-22 00:48:35
这种撕裂只是屏幕呈现方式的产物。这条线的下一个位置是渲染,而前一个位置正在绘制。如果屏幕的刷新率和更新率是同步的,那么这个问题就会消失。但由于这几乎不可能做到这一点,我建议你的程序采取PICO-8在管理这方面采取的路线,等待屏幕刷新完成,然后改变屏幕缓冲区,以防止撕裂。我不确定是否有等待屏幕刷新完成的方法,但如果有,那么序列应该是:update back buffer -> wait for screen to stop being drawn -> flip buffers -> screen is drawn again
。
刷新是从左到右、从上到下逐个像素绘制屏幕的地方。这是因为与屏幕的三总线连接一次只让一个像素的亮度来自屏幕内存,因此每个像素都是按顺序绘制的。撕裂来自于记忆在刷新过程中的变化,因此线条移动到屏幕中途的位置。
https://stackoverflow.com/questions/30936313
复制相似问题