Performance?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

Servus zusammen,

ich hab in meinem eisflächen Thread, meinen letzten Prototypen gepostet, den habe ich nun umgeschrieben...
eine graue fläche davor gesetzt ein bild dahinter und den alpha wert der grauen fläche hoch gedreht, damit man gerade noch so das bild
dahinter sieht... alles super.. ich hab mich n keks gefreut als das ging...^^

nun hab ich das ganze im fullscreen laufen lassen wollen... aber... dier performance ist absolut im keller...
der mal nur noch alle ... 5-8 cm einen "punkt" sodass der effekt des schreibens, überhaupt nicht mehr zu tage kommt...
liegt das einfach daran, dass ich zu sehr in den arrays rumhüpfe oder bin ich einfach betriebsblind?

Code: Alles auswählen

import pygame

screen = pygame.display.set_mode((400, 200))

blurr = pygame.Surface((1366, 768))
blurr.fill((230,230,230))
blurr.set_alpha(220)
blurr.set_colorkey((0,0,1))

image = pygame.image.load("Bildschirmfoto.png")
image.set_alpha(255)

brush = pygame.Surface((10,10))
brush.fill((0,0,1))

brushCircleRects = [[3,0,4,10],[2,1,1,8],[1,2,1,6],[0,3,1,4],[7,1,1,8],[8,2,1,6],[9,3,1,4]]

painting = False

running = True

while running:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT or event.type == pygame.KEYDOWN and
            event.key == pygame.K_ESCAPE):
            running = False

    pos = pygame.mouse.get_pos()
    for i in brushCircleRects:
        blurr.blit(brush,[pos[0] + i[0],pos[1] + i[1]],i)
   
    screen.fill((255,255,255))
    screen.blit(image,(0,0))
    screen.blit(blurr,(0,0))
    pygame.display.flip()
http://picfront.de/d/7Edq
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

ist es ansonsten evtl möglich, punkt genau, den alpha wert des bildes zu erhöhen...?
sprich anhand der x,y koordinate?

ich hab nur Surface.set_alpha gefunden... sodass ich zwar das ganze bild... aber nicht nur einen teil
hochsetzen kann...
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Hab nur das hier gefunden:

Code: Alles auswählen

pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface
pygame.Surface((width, height), flags=0, Surface): return Surface
Als Flags können wir “anfragen” (das heißt,
unter Umständen ignoriert SDL diese Anfrage wenn es Probleme geben
könnte), dass die Surface im Grafikkartenspeicher abgelegt werden soll
(Flag HWSURFACE) und/oder dass wir “per-pixel alpha” Unterstützung
wollen (Flag SRCALPHA)
.

Letzteres ist nicht empfohlen, da es langsam ist. In den meisten
Fällen ist es aber zum Glück nicht nötig, da man ja Colorkeys und einen
Transparenz-Wert für die komplette Surface angeben kann.
*Quelle*
Vielleicht hilft dir das ja?
Lg, Jonas :wink:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

1. Du musst die convert() Methode deiner Image Datei aufrufen, sonst wird die Bilddatei im Speicher im eingelesenem Format gespeichert und nicht in der SDL-internen, schnellen Variante.
2. Du zeichnest den gesamten Bildschirm bei jeder Iteration neu, was offensichtlich langsam ist (insbesondere im Fullscreen). pygame.sprite bietet abstrakte Klassen an, die es erlauben, nur eine Aktualisierung der notwendigen Bildschirmabschnitte durchführen zu lassen.
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

Danke ihr 2 :-)

so was schönes hab ich schon lange gesucht @jonas... vielen dank dafür...
und @str1442 das mit dem convert hatte ich schonmal gelesen, aber schon wieder verdrängt... danke für den tipp... hat allerdings
keinen unterschied gezeigt, jedoch bin ich den code durchgegangen und hab festgestellt, dass ich den hintergrund auch blite...
was natürlich sinnlos ist, als ich das rausnahm, gings auch schon ein bisschen besser, dennoch scheinst du recht zu haben...
daher hab ich einmal nach dem load das convert() eingearbeitet und lese mich derzeit in die sprites ein...
finde die doku könnte aber ruhig etwas verständlicher sein ^^
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

da ich die sprites auf die schnelle nciht verstanden habe, viel mir aber zum "glück"
die update funktion ein, die sollte doch eigentlich das verhindern was du gesagt hast... ?
sie sollte doch eigentlich nur das neu zeichnen, was ich angebe...

Code: Alles auswählen

import pygame

screen = pygame.display.set_mode((1366, 768), pygame.FULLSCREEN)

blurr = pygame.Surface((1366, 768))
blurr.fill((230,230,230))
blurr.set_alpha(220)
blurr.set_colorkey((0,0,1))

image = pygame.image.load("Bildschirmfoto.png")
if image.get_alpha() == None:
	image = image.convert()
else:
	image = image.convert_alpha()


brush = pygame.Surface((10,10))
brush.fill((0,0,1))

brushCircleRects = [[3,0,4,10],[2,1,1,8],[1,2,1,6],[0,3,1,4],[7,1,1,8],[8,2,1,6],[9,3,1,4]]
#left,top,width,heigth - rect

running = True

screen.blit(image,(0,0))
screen.blit(blurr,(0,0))
pygame.display.flip()

while running:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT or event.type == pygame.KEYDOWN and
            event.key == pygame.K_ESCAPE):
            running = False

    pos = pygame.mouse.get_pos()
    for i in brushCircleRects:
        blurr.blit(brush,[pos[0] + i[0],pos[1] + i[1]],i)
   
    screen.blit(image,(0,0))
    screen.blit(blurr,(0,0))
    pygame.display.update((pos[0],pos[1],10,10))
so... ich update nun eigentlich nur das quadrat, an dem meine maus sowieso schon ist...
dennoch geht die performance in den keller... immernoch der gleiche grund?

-- Neu sind nun die folgenden snippets:

Code: Alles auswählen

if image.get_alpha() == None:
	image = image.convert()
else:
	image = image.convert_alpha()
das war das was du schon vorher angeregt hast...

dann habe ich folgendes aus der schleife genommen...

Code: Alles auswählen

screen.blit(image,(0,0))
screen.blit(blurr,(0,0))
pygame.display.flip()
und

Code: Alles auswählen

pygame.display.update((pos[0],pos[1],10,10))
eingefügt... allerdings... ohne viel erfolg...
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

ich bin auch ein idiot... natürlich ist das das gleiche^^
ich habs mal geändert... etwas unkonventionell... aber es funktioniert^^

wen es interessiert ODER, was viel wichtiger ist, mir n tipp geben kann wie man es schöner vom code her gestaltet...

meine lösung:

Code: Alles auswählen

import pygame

#screen = pygame.display.set_mode((1366, 768), pygame.FULLSCREEN)
screen = pygame.display.set_mode((1366, 768))

blurr = pygame.Surface((1366, 768))
blurr.fill((230,230,230))
blurr.set_alpha(220)
blurr.set_colorkey((0,0,1))

image = pygame.image.load("Bildschirmfoto.png")
if image.get_alpha() == None:
	image = image.convert()
else:
	image = image.convert_alpha()


brush = pygame.Surface((20,20))
brush.fill((0,0,1))

brushCircleRects = [[6,0,8,20],[4,2,2,16],[2,4,2,12],[0,6,2,8],[14,2,2,16],[16,4,2,12],[18,6,2,8]]
#left,top,width,heigth - rect

running = True
screen.blit(image,(0,0))
screen.blit(blurr,(0,0))
pygame.display.flip()

while running:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT or event.type == pygame.KEYDOWN and
            event.key == pygame.K_ESCAPE):
            running = False

    pos = pygame.mouse.get_pos()

    blurr.blit(brush, (pos[0] ,pos[1]) )
   
    screen.blit(image,(0,0))

    a = 0
    for i in brushCircleRects:
	pygame.display.update((pos[0] + i[a],pos[1] + i[a+1],i[a+2],i[a+3]))
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

In den letzten 3 Zeilen is das a doch überflüssig, da a gleich 0 ist und nie verändert wird

Code: Alles auswählen

    a = 0
    for i in brushCircleRects:
        pygame.display.update((pos[0] + i[a],pos[1] + i[a+1],i[a+2],i[a+3]))

Code: Alles auswählen

    for i in brushCircleRects:
        pygame.display.update((pos[0] + i[0],pos[1] + i[1],i[2],i[3]))
Zuletzt geändert von Dav1d am Mittwoch 9. Juni 2010, 13:07, insgesamt 1-mal geändert.
the more they change the more they stay the same
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

:mrgreen:
stimmt^^ danke :)
Antworten