Pygame çok kasıyor

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.

1 Beğeni

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.

3 Beğeni

şö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

1 Beğeni

Python kodlarını pyc’ye derleyip çalıştırmanın performansa nasıl bir katkısı olacak?

2 Beğeni

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 :slight_smile:

Edit: Not: Olcumlerini gordugunuz kod basliktaki kodun import’larinin ve ana fonksiyon cagrisinin cikartilmis hali.

4 Beğeni

sen çalıştırdığın zaman tekrar tekrar derliyor ama böyle yaparsan (((((((((((belki))))))))))) işe yarayabilir

1 Beğeni