[英]drawing lines from a list in pygame
我正在使用像素列表從pygame繪制線條。 我使用pygame.time.get_ticks()函數每秒將新像素添加到列表中,以便隨着程序的進行同時繪制多條線。 這是代碼片段:
screen_size = [self.xsize, self.ysize]
screen = pygame.display.set_mode(screen_size)
start_points = list()
start_points.append(self.get_random_pixel())
screen.fill((255, 255, 255))
while True
if time.time.get_ticks() % 1000 == 0:
start_points.append(self.get_random_pixel())
for i in range(len(start_points)):
old_coord = start_points[i]
new_coord = self.nearest_neighbor(old_coord)
pygame.draw.line(screen, self.get_col(old_coord), old_coord, new_coord, 2)
start_points[i] = new_coord
pygame.display.flip()
關於此的一些概念:1.運行此程序時,我只能得到一個線條圖。 2.隨着程序的前進,列表start_points似乎確實在增加更多的像素。 3.當列表的大小固定(例如100)時,我確實同時繪制了100條線。
那么這是怎么回事? 為什么隨着時間的流逝同時繪制更多的線條?
謝謝! 單體
考慮一下如果您的循環需要23毫秒才能運行,該怎么辦。 因此,第一次調用get_ticks
,您將獲得0。然后您將獲得get_ticks
,..., get_ticks
,..., get_ticks
,..., get_ticks
,...,依此類推。 您將需要23秒才能找到第一個可被1000整除的數字!
當然,在現實生活中,循環時間不是恆定的,而是高度可變的,但是您有基本相同的問題。
解決此問題的正確方法是圍繞事件循環或固定幀速率循環重新組織程序。
使用事件循環,您可以僅使用set_timer
每秒觸發一次事件。 同樣,除了在沒有任何反應的情況下盡快重繪和翻轉屏幕,持續消耗100%CPU甚至可能使游戲對事件的響應速度變慢之外,您僅在實際需要時重繪並翻轉屏幕即可。 ,幾乎不使用CPU,並且幾乎隨時准備響應。
以20fps的固定幀速率,您可以每20幀觸發一次。 再說一次,您將只以20次/秒的速度重繪屏幕,而不是盡可能快地重繪屏幕,因此CPU使用率將大大降低,並且可以在1/20秒內響應任何內容。
但是,如果您真的想這樣做,可以。 您只需要跟蹤下一次解雇。 例如:
next_line_time = 0
while True:
while time.time.get_ticks() >= next_line_time:
start_points.append(self.get_random_pixel())
next_line_time += 1000
附帶說明一下,您幾乎永遠不需要Python中的range(len(foo))
循環。 循環foo
; 那么您就不需要循環中的所有foo[i]
。 如果確實需要索引和值,則可以始終遍歷enumerate(foo)
,這會給您兩個。 例如:
for i, old_coord in enumerate(start_points):
new_coord = self.nearest_neighbor(old_coord)
pygame.draw.line(screen, self.get_col(old_coord), old_coord, new_coord, 2)
start_points[i] = new_coord
pygame.display.flip()
另外,您幾乎可以肯定不想在每行之后調用flip
。 繪制每條線都需要花費幾微秒的時間,並且嘗試以比監視器和/或您的眼睛檢測不到的更快的速度翻轉是一種浪費。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.