fremde funktionen einbauen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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.
Zuletzt geändert von sechsrad am Dienstag 1. April 2008, 09:46, insgesamt 1-mal geändert.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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() 
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@sechsrad: Bitte code so einbinden: http://www.python-forum.de/faq.php#21

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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.
Zuletzt geändert von sechsrad am Dienstag 1. April 2008, 17:51, insgesamt 1-mal geändert.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Wow, ich hab Programmierkünstler? Wo, wo?

Und mal ehrlich: Du bist nur ein Fake-Account und verarscht uns, oder?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
Antworten