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
fremde funktionen einbauen
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
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
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.
ich progge auch mit dev-c++, erstelle zb für mein roboterprojekt dll dateien. darum auch diese dll-frage.
was ist eigentlich ein shared object?Was spricht dagegen in C++ ein Shared Object (``.so``) zu erstellen?
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.
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
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
hier mal der code , der sehr langsam auf dem gp2x ist .
was kann pygame hier ins stocken bringen?
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()
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.
Vielleicht findet sich ja ein anderer dummer der auch davon ausgeht, dass deine undendlich viel wichtiger ist als seine eigene.
- 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
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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.audax hat geschrieben:Ja, wechsel die Sprache. Nicht der Performance wegen, sondern eher, weil du dann in anderen Foren postest
Was ich ja sehr lustig fand:
Code: Alles auswählen
if c.y <0>= Screen[0]+c.radius
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
musste mal fragen, wer das pygame erfunden hat.if c.y <0>= Screen[0]+c.radius
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.
sag mal du maulkorb, weisst du überhaupt welche projekte ich am laufen habe. die kannst du dir finanziell garnicht leisten als hobby.Aha. Python zu langsam....is klar.
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.
- 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
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!