Merhabalar ben bir pygame projesi oluşturmaya başladım ve oyunun giriş ekranına yağmur animasyonu yaptım. Bunun için içinde istediğim kadar yağmur.png olan dosyayı oyun döngüsünün içinde for döngüsü ile çağırıp (for i in bla bla) deyip i.x ve i.y şeklinde hareket verdim. 35 tane çağırdım aşağıya gelince otomatik olarak yukarı gidiyor. mantık bu şekilde. arkaya background koymayınca her şey güzel ama background koyarsam çok fazla kasıyor, damlalar çook yavaş hareket ediyor. bunun nedeni nedir?
Merhaba. Kodunuzu paylaşırsanız yavaşlığın sebebini daha kolay buluruz.
Buyrun:
import pygame
import random
from pygame import mixer
import sys
class Button():
def __init__(self, color, x,y,width,height, text=''):
self.color = color
self.x = x
self.y = y
self.width = width
self.height = height
self.text = text
def draw(self,win,outline=None):
#Call this method to draw the button on the screen
if outline:
pygame.draw.rect(win, outline, (self.x-10,self.y-10,self.width+20,self.height+20),0)
pygame.draw.rect(win, self.color, (self.x,self.y,self.width,self.height),0)
if self.text != '':
font = pygame.font.Font("C:/Users/hakan/Desktop/first_game/nature.ttf", 64)
text = font.render(self.text, 1, (0,0,0))
win.blit(text, (self.x + (self.width/2 - text.get_width()/2), self.y + (self.height/2 - text.get_height()/2)))
def isOver(self, pos):
#Pos is the mouse position or a tuple of (x,y) coordinates
if pos[0] > self.x and pos[0] < self.x + self.width:
if pos[1] > self.y and pos[1] < self.y + self.height:
return True
return False
class Screen():
def __init__(self, screen_width, screen_height, title, screen_name, color):
self.screen_width = screen_width
self.screen_height = screen_height
self.title = title
self.color = color
self.screen_name = screen_name
def draw_screen(self, title, screen_width, screen_height):
pygame.display.set_caption(title)
self.screen_name = pygame.display.set_mode((screen_width, screen_height))
def fill(self):
self.screen_name.fill(self.color)
def background(self, background):
self.screen_name.blit(background, (0, 0))
class Rain():
def __init__(self, rainImg, rainX, rainY, rainX_change, rainY_change, screen):
self.rainImg = rainImg
self.rainX = rainX
self.rainY = rainY
self.rainX_change = rainX_change
self.rainY_change = rainY_change
self.screen = screen
def draw(self):
self.screen.blit(self.rainImg, (self.rainX, self.rainY))
# Starting Screen
def starting_screen_func():
clock = pygame.time.Clock()
pygame.init()
start_buton = Button((0, 0, 0), 200, 150, 450, 180, "Start Game")
exit_buton = Button((0, 0, 0), 200, 410, 450, 180, "Exit Game")
start_screen = Screen(720, 1280, "Starting Screen", "starting_screen" ,(158, 17, 17))
start_screen.draw_screen("Starting Screen", 1280, 720)
rainImg = pygame.image.load("C:/Users/hakan/Desktop/second_game/rain_small.png").convert_alpha()
rain_list = []
for i in range(0, 45):
i = Rain(rainImg, random.randint(-1280, 1280), random.randint(-500, -200), 1, random.randint(4, 7), start_screen.screen_name)
rain_list.append(i)
running = True
while running:
background = pygame.image.load("C:/Users/hakan/Desktop/second_game/background.png").convert_alpha()
start_screen.background(background)
#start_screen.fill()
start_buton.draw(start_screen.screen_name)
exit_buton.draw(start_screen.screen_name)
for event in pygame.event.get():
pos = pygame.mouse.get_pos()
if event.type == pygame.QUIT:
running = False
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
if start_buton.isOver(pos):
start_buton.color = (255, 255, 255)
game()
elif exit_buton.isOver(pos):
exit_buton.color = (255, 255, 255)
sys.exit()
if event.type == pygame.MOUSEBUTTONUP:
if start_buton.isOver(pos):
start_buton.color = (79, 79, 79)
elif exit_buton.isOver(pos):
exit_buton.color = (79, 79, 79)
if event.type == pygame.MOUSEMOTION:
if start_buton.isOver(pos):
start_buton.color = (217, 217, 217)
else:
start_buton.color = (79, 79, 79)
if event.type == pygame.MOUSEMOTION:
if exit_buton.isOver(pos):
exit_buton.color = (217, 217, 217)
else:
exit_buton.color = (79, 79, 79)
for i in rain_list:
i.draw()
i.rainX += i.rainX_change
i.rainY += i.rainY_change
if i.rainY > 750:
i.rainY = random.randint(-500, 0)
elif i.rainX > 1280:
i.rainX = random.randint(0, 1280)
clock.tick(60)
pygame.display.update()
def game():
pass
starting_screen_func()
Bu haliyle problem şu satırda duruyor:
while running
döngüsü içerisinde resmi her seferinde baştan oluşturuyorsunuz, bu da her frame’de resmi baştan işlemek demek.
Resim ve font dosyalarını da paylaşırsanız kodu çalıştırıp deneyebiliriz.
şöyle dener misin belki işe yarayabilir
python3 -m py_compile your_file.py
sonra pycache klasöründe
yourfile.cpython39.pyc dosyası çıkacaktır önüne
sonra python3 yourfile.cpython39.pyc yapıp deneyebilir misin
Python kodlarını pyc’ye derleyip çalıştırmanın performansa nasıl bir katkısı olacak?
Normalde bytecode’u cache’lenmeyen ana modulun bytecode’unu cache’leyerek acilis aninda derleme masrafindan mili mikrosaniyeler kazandirabilir:
### 1
(venv) 13:04:04 0 aib@vivaldi:/tmp% /usr/bin/time ./a1.sh
14.46user 2.99system 0:17.44elapsed 100%CPU (0avgtext+0avgdata 9924maxresident)k
0inputs+0outputs (0major+1167976minor)pagefaults 0swaps
(venv) 13:04:24 0 aib@vivaldi:/tmp% /usr/bin/time ./a1.sh
14.18user 2.94system 0:17.11elapsed 100%CPU (0avgtext+0avgdata 9920maxresident)k
0inputs+0outputs (0major+1168941minor)pagefaults 0swaps
### 2
(venv) 13:04:43 0 aib@vivaldi:/tmp% /usr/bin/time ./a2.sh
13.96user 2.68system 0:16.62elapsed 100%CPU (0avgtext+0avgdata 9640maxresident)k
0inputs+0outputs (0major+1071511minor)pagefaults 0swaps
(venv) 13:05:02 0 aib@vivaldi:/tmp% /usr/bin/time ./a2.sh
13.81user 2.78system 0:16.57elapsed 100%CPU (0avgtext+0avgdata 9640maxresident)k
0inputs+0outputs (0major+1072541minor)pagefaults 0swaps
(venv) 13:05:21 0 aib@vivaldi:/tmp%
(venv) 13:09:04 0 aib@vivaldi:/tmp% cat a1.sh
#!/bin/bash
for a in {1..1000}; do
python a.py
done
(venv) 13:09:06 0 aib@vivaldi:/tmp% cat a2.sh
#!/bin/bash
for a in {1..1000}; do
python __pycache__/a.cpython-38.pyc
done
Saniyede 60 kere imaj yuklemeye calisan loop’a bir sey yapamaz, o ayri
Edit: Not: Olcumlerini gordugunuz kod basliktaki kodun import’larinin ve ana fonksiyon cagrisinin cikartilmis hali.
sen çalıştırdığın zaman tekrar tekrar derliyor ama böyle yaparsan (((((((((((belki))))))))))) işe yarayabilir