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