Seite 1 von 1

Performance?

Verfasst: Mittwoch 2. Juni 2010, 15:16
von majinv
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

Re: Performance?

Verfasst: Mittwoch 2. Juni 2010, 15:50
von majinv
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...

Re: Performance?

Verfasst: Sonntag 6. Juni 2010, 21:38
von jonas
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:

Re: Performance?

Verfasst: Montag 7. Juni 2010, 14:53
von str1442
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.

Re: Performance?

Verfasst: Mittwoch 9. Juni 2010, 10:00
von majinv
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 ^^

Re: Performance?

Verfasst: Mittwoch 9. Juni 2010, 10:38
von majinv
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...

Re: Performance?

Verfasst: Mittwoch 9. Juni 2010, 10:52
von majinv
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]))

Re: Performance?

Verfasst: Mittwoch 9. Juni 2010, 12:51
von Dav1d
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]))

Re: Performance?

Verfasst: Mittwoch 9. Juni 2010, 12:53
von majinv
:mrgreen:
stimmt^^ danke :)