Seite 1 von 1

fremde funktionen einbauen

Verfasst: Dienstag 1. April 2008, 09:25
von sechsrad
hallo, ich habe meine ersten programme hinter mir.
und habeein einfaches pig-pong aus der pygamesammlung.

dieses habe ich umgesetzt für den gp2x.
da stelle ich fest das python dort sehr sehr langsam reagiert.
wie kann man in python selbsterstellte dll von c++ (kann die mit dec-c++ erstellen) dort einbinden. ich möchte evtl die matheroutinen schneller machen bzw meine eigenen nehmen.

mfg

Verfasst: Dienstag 1. April 2008, 09:33
von CM
Hallo und vor mir noch ein "willkommen im Forum"!

Ich weiß nicht was Du mit "die Matheroutinen" meinst, aber das Modul "math" in Python ist in C geschrieben. Zwar kannst Du noch Overhead von Python wegnehmen, aber ich bezweifle, ob Deine Routinen Dein Programm schneller machen - eher weniger stabil.

Hast Du denn mal getestet *warum* Dein Programm so langsam läuft? Wo klemmt es denn? Wirklich in der Mathematik?

Gruß,
Christian

Verfasst: Dienstag 1. April 2008, 09:42
von sechsrad
es wird ein pin-pong-ball von rechts nach links geschlagen und zurück und dazu dann den abprallwinkel bzw im dem winkel das wandern des balles zur anderen seite, bis wieder ein hindernis kommt.
Was spricht dagegen in C++ ein Shared Object (``.so``) zu erstellen?
was ist eigentlich ein shared object?
ich progge auch mit dev-c++, erstelle zb für mein roboterprojekt dll dateien. darum auch diese dll-frage.

Verfasst: Dienstag 1. April 2008, 09:46
von audax
Schau erstmal, was an deinem Programm so langsam läuft.

Das tut man mit einem Profiler, und zu unser aller Glück ist bei Python gleich einer dabei. Den darfst du in der Doku aber selbst suchen.

Verfasst: Dienstag 1. April 2008, 09:51
von CM
Woher kommt das Zitat? Hast Du sonst noch wo quer-gepostet?

Wenn ich Deinen ersten Thread richtig verstehe, solltest Du Dich vielleicht erst mal mit dem Tutorial auseinandersetzen. Im Übrigen hat audax recht.

Zu Deiner zitierten Frage: http://de.wikipedia.org/wiki/Programmbibliothek

Gruß,
Christian

Verfasst: Dienstag 1. April 2008, 10:16
von sechsrad
hier mal der code , der sehr langsam auf dem gp2x ist .
was kann pygame hier ins stocken bringen?

Code: Alles auswählen

import pygame 
from pygame.locals import * 
import sys, os 
import random 
from math import * 

pygame.init() 

Screen = (320,240) 
pygame.display.set_caption("Ping") 
icon = pygame.Surface((1,1)); icon.set_alpha(0); pygame.display.set_icon(icon) 
Surface = pygame.display.set_mode(Screen) 

pygame.mouse.set_visible(False) 

Ping = pygame.mixer.Sound('Ping.wav') 
Click = pygame.mixer.Sound('Click.wav') 
Ping.set_volume(0.1) 
Click.set_volume(0.1) 

Font = pygame.font.Font(None,22) 
Font2 = pygame.font.Font(None,18) 

CirclesInTheAir = 1 

class Circle: 
    def __init__(self,x,y): 
        self.x = x 
        self.y = y 
        angle = random.randint(0,360) 
        self.speedx = 0.7*cos(radians(angle)) 
        self.speedy = 0.7*sin(radians(angle)) 
        self.placesbeen = [] 
        self.radius = 2 
        self.add = 0 
        self.stopped = False 
        self.stoppedtime = 0 
Circles = [] 
#for x in xrange(CirclesInTheAir): 
#    Circles.append(Circle(Screen[0]/2,Screen[1]/2)) 
class Paddle: 
    def __init__(self,x,y,size,player): 
        self.rect = [x,y,10,size] 
        self.player = player 
Paddles = [] 
Paddles.append(Paddle(10,Screen[1]/2,50,1)) 
Paddles.append(Paddle(310,Screen[1]/2,50,2)) 
P1Score = 0 
P2Score = 0 
def GetInput(): 
    key = pygame.key.get_pressed() 
    for event in pygame.event.get(): 
        if event.type == QUIT or key[K_a]: 
            pygame.mouse.set_visible(True) 
            pygame.quit(); sys.exit() 
    if key[K_UP]: 
        for p in Paddles: 
            if p.player == 2: p.rect[1] += 3 
    if key[K_DOWN]: 
        for p in Paddles: 
            if p.player == 2: p.rect[1] -= 3 
    if key[K_w]: 
        for p in Paddles: 
            if p.player == 1: p.rect[1] += 3 
    if key[K_s]: 
        for p in Paddles: 
            if p.player == 1: p.rect[1] -= 3 
def Update(): 
    for c in Circles: 
        if c.add == 0: 
            c.placesbeen.append([c.x,c.y]) 
            c.placesbeen.reverse() 
            c.placesbeen = c.placesbeen[:25] 
            c.placesbeen.reverse() 
            c.add = 15 
        else: 
            c.add -= 1 
        if c.stoppedtime == 37: 
            Circles.remove(c) 
            continue 
    if len(Circles) < CirclesInTheAir: 
        Circles.append(Circle(Screen[0]/2,Screen[1]/2)) 
def Move(): 
    for c in Circles: 
        c.x += c.speedx 
        c.y += c.speedy 
    Update() 
def CollisionDetect(): 
    global P1Score, P2Score 
    for c in Circles: 
        if c.x <= 0-c.radius: 
            if not c.stopped: 
                c.stopped = True 
                c.speedx = 0 
                c.speedy = 0 
                P2Score += 1 
            else: 
                c.stoppedtime += 1 
        if c.y <0>= Screen[0]+c.radius: 
            if not c.stopped: 
                c.stopped = True 
                c.speedx = 0 
                c.speedy = 0 
                P1Score += 1 
            else: 
                c.stoppedtime += 1 
        if c.y >= Screen[1]: 
            c.y = Screen[1] 
            c.speedy *= -1 
            Click.play(0) 
    for p in Paddles: 
        if p.rect[1]-(p.rect[3]/2) <0> Screen[1]: 
            p.rect[1] = Screen[1] - (p.rect[3]/2) 
    for p in Paddles: 
        r = PygameRectFromRect(p.rect) 
        for c in Circles: 
            xdiff = c.x - p.rect[0] 
            ydiff = c.y - p.rect[1] 
            if abs(xdiff) <= (p.rect[2]/2) + c.radius and abs(ydiff) <p> 0:#right side 
                    c.x = r[0] + r[2] + c.radius 
                if xdiff < 0:#left side 
                    c.x = r[0] - c.radius 
                c.speedx *= 1.1 
                c.speedy *= 1.1 
def PygameRectFromRect(r): 
    tl = (  r[0]-(r[2]/2),  (r[1]+(r[3]/2))  ) 
    dim = (  r[2],  r[3]  ) 
    r2 = (tl[0],tl[1],dim[0],dim[1]) 
    return r2 
def IntegerisePoint(point): 
    returnpoint = [int(round(point[0])),int(round(point[1]))] 
    return returnpoint 
info_text = Font.render("Ping",True,(255,255,255)) 
info_text_draw_pos = ((Screen[0]/2)-(info_text.get_width()/2),10) 
def Draw(): 
    Surface.fill((0,0,0)) 
    for c in Circles: 
        light = 0 
        for p in c.placesbeen: 
            point = IntegerisePoint((p[0],Screen[1]-p[1])) 
            pygame.draw.circle(Surface,(light,0,0),point,c.radius) 
            light += 2 
        point = IntegerisePoint((c.x,Screen[1]-c.y)) 
        pygame.draw.circle(Surface,(255,255,255),point,c.radius) 
    for p in Paddles: 
        r = PygameRectFromRect(p.rect) 
        pygame.draw.rect(Surface,(255,255,255),(r[0],Screen[1]-r[1],r[2],r[3]),0) 
    Surface.blit(info_text,info_text_draw_pos) 
    p1_score_text = Font2.render("Player 1, Score "+str(P1Score),True,(255,255,255)) 
    p2_score_text = Font2.render("Player 2, Score "+str(P2Score),True,(255,255,255)) 
    Surface.blit(p1_score_text,(0+20,20)) 
    Surface.blit(p2_score_text,(Screen[0]-p2_score_text.get_width()-20,20)) 
    pygame.display.flip() 
def main(): 
    while True: 
        GetInput() 
        Move() 
        CollisionDetect() 
        Draw() 
if __name__ == '__main__': main() 

Verfasst: Dienstag 1. April 2008, 10:31
von audax
Wenn du zu faul bist, auch nur in die Dokumentation zu schaun und den Profiler auszuprobieren...helfe ich dir sicher nicht.

Vielleicht findet sich ja ein anderer dummer der auch davon ausgeht, dass deine undendlich viel wichtiger ist als seine eigene.

Verfasst: Dienstag 1. April 2008, 13:23
von jens
@sechsrad: Bitte code so einbinden: http://www.python-forum.de/faq.php#21

Verfasst: Dienstag 1. April 2008, 13:33
von sechsrad
hat sich erledigt.

python ist als interpreter zu langsam für dieses projekt auf dem gp2x.

muss wohl doch auf fenix umsatteln.

ich will nämlich nicht für den pc proggen.

Verfasst: Dienstag 1. April 2008, 14:05
von audax
Aha. Python zu langsam....is klar.
Bevor da kein Profiler drüber gelaufen ist glaub ich das einfach mal nicht ;)

Außerdem schreien mir viele Teile deines Codes entegegen "Ich bin ineffizient, optimier mich!".

€dit:
Wo ich mir den code mal angesehen habe...
Ja, wechsel die Sprache. Nicht der Performance wegen, sondern eher, weil du dann in anderen Foren postest :D

Verfasst: Dienstag 1. April 2008, 14:42
von Leonidas
audax hat geschrieben:Ja, wechsel die Sprache. Nicht der Performance wegen, sondern eher, weil du dann in anderen Foren postest :D
Naja, so drastisch würde ich es nicht formulieren. Aber über die Geschwindigkeit einer Sprache zu urteilen, wenn man nicht mit dem Profiler nachgesehen hat, was so langsam ist, ist echt schwach.

Was ich ja sehr lustig fand:

Code: Alles auswählen

if c.y <0>= Screen[0]+c.radius
Sah auf den ersten Blick wie Java 5 Generics aus ;)

Verfasst: Dienstag 1. April 2008, 17:43
von sechsrad
if c.y <0>= Screen[0]+c.radius
musste mal fragen, wer das pygame erfunden hat.
ich dachte ihr sprecht euch bei so etwas immer ab.
aber es scheint jeder seinen eigenen brei zu brutzeln.

wenn das programm auf 2 frame runterfällt, nützt auch kein grosses gefummel mit dem profiler mehr.

Verfasst: Dienstag 1. April 2008, 17:47
von sechsrad
Aha. Python zu langsam....is klar.
sag mal du maulkorb, weisst du überhaupt welche projekte ich am laufen habe. die kannst du dir finanziell garnicht leisten als hobby.

jetzt halt mal deine klappe oder gebe mal vernünftige ratschläge.

ich habe geschrieben ...für dieses projekt, wer lesen kann ist klar im vorteil du nase.

Verfasst: Dienstag 1. April 2008, 17:49
von sechsrad
Außerdem schreien mir viele Teile deines Codes entegegen "Ich bin ineffizient, optimier mich!".
das haben deine programmierkünstler mir gegeben, die eigentlich python kennen müssten.

Verfasst: Dienstag 1. April 2008, 17:52
von audax
Wow, ich hab Programmierkünstler? Wo, wo?

Und mal ehrlich: Du bist nur ein Fake-Account und verarscht uns, oder?

Verfasst: Dienstag 1. April 2008, 18:13
von Hyperion

Code: Alles auswählen

IndentationError: unindent does not match any outer indentation level
nelson@victory:~/src/Python/pygame-test$ python pong1.py
  File "pong1.py", line 121
    if xdiff < 0:#left side
                          ^
IndentationError: unindent does not match any outer indentation level
nelson@victory:~/src/Python/pygame-test$ python pong1.py
Traceback (most recent call last):
  File "pong1.py", line 16, in <module>
    Ping = pygame.mixer.Sound('Ping.wav')
pygame.error: Mix_LoadWAV_RW with NULL src
Hm ... also von dem indent Fehler mal abgesehen kann ich es so nicht ausführen!

Mir erscheint es aber bei einem flüchtigen Blick, dass Du viel zu viel berechnest - speziell in den Zeichen-Routinen! Aber da es keine Doku gibt, mag ich mir das auch nicht genauer angucken!

Dokumentier das mal und versuche den Quellcode besser zu formatieren (u.a. PEP8 beachten) - dann findet sich sicherlich das Hauptproblem!