Donc walla j'ai envie de dire. (j'hésite à sortir un truc, mais c'est trop violent)
Bah oui Pygame est super pour faire des jeux. Bah oui Pygame franchement ça roxe du poney. Mais pour ce qui est des jeux de scrolling verticaux-horizontaux comme celui-ci, non il gère plus du tout. Et c'est bien connu. En me lançant là dedans je le savais.
Mais ce que peu de personnes savent, c'est que cette version d'Unamed, c'était un "prototype" dans le sens j'y met tout ce que je veux voir dans la finale. Et j'ai utilisé Pygame car je connais bien et que je savais que je pouvais pondre ce proto rapidement. Maintenant j'écris le truc sous PySFML.
Je m'exuse d'avance si ça passe pour un coup de gueule C'est juste que j'ai été "un poquito" irrité (c'est de ma faute aussi, c'est écrit nul part que je prévoyais cette "réécriture")
C'est pas un peu casse-gueule de faire un "prototype" de jeu sur une lib que tu sais inadaptée? Surtout que ta seule motivation pour choisir cette lib plutôt qu'une autre apparemment était que tu la connaissais déjà. Mais pour le temps que ça t'a pris pour faire un prototype, combien ça t'aurais pris en apprenant directement une lib adaptée et de commencer le jeu directement dessus? (J'ose supposer que ça aurait été plus facile, avec un outil adapté).
Après moi je suis pas grandement calé en python, je fais surtout du C et un peu de C++... Donc je ne suis pas une référence en programmation python (sans déc)... Mais je trouve ça quand-même saugrenu comme démarche.
Peut-être que ce qui l'intéresse dans ce projet, c'est de développer les différents aspects du jeu de toute pièce, non ?
Je comprend et soutiens le fait de pas vouloir partir sur un moteur de jeu, mais en pygame et la sfml, bon... D'autant que c'est pas son 1er jeu quoi...
Je suis en pleine réécriture, les perfs sont à 0 là ! Y a rien qui tourne xD
Et oui j'avais envie de me focaliser sur le moteur "pokémon" du jeu
Je savais que ça tiendrait pas la route, certes, mais ça m'a quand même permis de mettre en place quoi, les 4/5 du jeu ? Donc je pense que c'est vraiment pas mal perso !
Commencer direct dessus ? Bof bof. Ca aurait pris plus de temps car faut apprendre à se servir de la lib (chose que je fais depuis un petit moment maintenant), et j'aurais sûrement mal codé le truc car ça aurait été la première fois que je me serais servi de PySFML
Et pis la force de Python c'est l'oo. Donc la modularité. Donc oui je suis aussi modulaire dans mes choix (ma pensée est tordue oui)
Ca peut paraitre bizarre oui, grand smurf. Mais c'est mon choix Je trouve que je contrôle tout, et que là au moins je peux faire ce que je veux (et facilement) (ok Unity est super génial, et quand on connais bien, on peut faire mieux que ce que je fais là)
T'inquiète pas, j'ai quelques 20000 lignes de log grâce à CProfile
Maintenant, faut que je bosse ma migration, et ensuite on en reparlera
-
Edit : migration du main.py et de quelques fichiers ... terminée ! Et ça marche du tonnerre. Et grâce à tout ce que j'ai découvert (encore) cet aprem (j'ai téléchargé la doc ^^), je pense que ce portage pour être complet (même si plus long que prévu :/ ) ! En effet j'ai trouvé tous les "alias" de fonctions que j'utilisais avec Pygame dans PySFML (bon, faut chercher un peu par contre, et c'est assez tordu pour avoir la taille d'un texte xD faut faire un text.local_bounds.width)
Ah non, j'ai pas parlé des 20'000 FPS que donne PySFML (l'ayant fait sur le blog, j'ai zappé de le dire ici et sur ZDS (sur csp aussi je crois xD))
Gwënn : si je te donne le dt ça t'ira ? J'peux aller chercher ça
Edit : test fait (PySFML). self.clock.restart().milliseconds me donne bien un dt compris entre 48 et 66 millisecondes. Si on fait le calcul ensemble, on a ça : ~0.048 | ~0.066 sec.
Donc 1000 / 0.066 (j'prends la plus grosse valeur) donne ~15000 FPS.
Et j'ai aussi fait un petit script totalement con dont voici la source :
import sfml as sf
fen = sf.RenderWindow(sf.VideoMode(200, 200), "test SFML")
clock = sf.Clock()
fps = 0
while True:
fps += 1
if clock.elapsed_time.milliseconds >= 1000:
clock.restart()
print(fps)
fps = 0
L'output indique (en moyenne) 48'000 FPS (donc un dt en ms inférieur à 0.1)
Arrête de mesurer des fps - cette valeur ne sert à rien - et mesure le temps, en millisecondes, passé dans chaque frame. Eventuellement avec une moyenne, mais même mesurer le temps maximum est très bien.
Le temps de rendu est un budget. Tu as un budget de 16,7ms, tu ne dois pas le dépasser, et partant de là, tu peux prendre des décisions comme un budget financier : allouer 5ms au rendu, 3ms à la logique du jeu, 2ms au réseau, 1ms au son et attendre les quelques ms qui restent.
Le framerate est une mauvaise mesure de performances parce qu'elle ne permet pas de découper le temps de calcul suivant un budget, et parce que c'est très facile d'en tirer de fausses conclusions :
la technologie A donne 240 fps avec 10 objects, et 24 fps avec 100 objets;
la technologie B donne 120 fps avec 10 objects, et 110 fps avec 10 000 objets.
Dans cet exemple, en mesurant en temps, tu verrais que la technologie A coûte 0,4ms par objet, et la technologie B coûte 8ms systématiquement même à vide, mais 0,00...ms par objet. Tu n'as pas terminé ton jeu, tu es dans le cas "10 objets", tu ne peux pas juger sur la base du framerate parce que ça te mènerait à une mauvaise conclusion - ce que tu dois faire c'est mesurer le temps, et profiler qu'est-ce qui consomme ton budget.
793 10.994 0.014 10.994 0.014 {method 'display' of 'sfml.window.Window' objects} (équivalent de flip)
75 3.234 0.043 3.234 0.043 {method 'to_image' of 'sfml.graphics.Texture' objects} (équivalent d'un pygame.image.load().convert_alpha() ; grossièrement (si on compte pas le temps pour appliquer la texture à un sprite, chose super rapide))
Rendering engine est un wrapper que j'ai fait à Pygame
Donc rendering_engine.flip() appelle pygame.display.flip() et rendering_engine.load_image(path) appelle pygame.image.load(path).convert_alpha()
Comment dire ... (et ce ne sont que 2 échantillons) Soit je code mal avec la SFML, soit mon PC l'aime pas, soit Pygame est plus rapide ...
J'hésite. (je garde le portage dans un coin de ma tête mais l'enlève de mes priorités)
Test à blanc Donc 48000 = 1000 / x donc x (le dt) = en moyenne 1000 / 48000 (car 1000 / (1000 / 48000) = 48000 ; là je me suis pas planté xD) Donc un dt d'environ 0.02083 ms (si je me plante pas encore une fois d'unité )
Mais un test plus "conséquent" avec gestion des event (draw différents en fonction d'event) par poll() (donc stress du CPU car ca consomme bien plus que get ou wait), clear total (.clear() chez sfml et .fill() chez pygame) puis draw call et enfin actualisation (display pour sfml et flip pour pygame), donne des dt très beaux
0.23 ms de dt pour Pygame (en moyenne)
0.46 ms de dt pour SFML (en moyenne)
Pygame est toujours 2* meilleur j'm'tâte, surtout que la sfml gère mal les accents dans les Text() apparement
A chaque fois que je vois une mesure de framerate supérieure à 60fps (donc dénuée de sens), je tue un chaton, alors arrêtez.
Yaalval a écrit:
Pygame est toujours 2* meilleur j'm'tâte, surtout que la sfml gère mal les accents dans les Text() apparement
0.46ms, c'est 3% de ton budget de performances. C'est purement et simplement négligeable. Tu es en train de mesurer la charge a à vide - le cas à 10 objets dans mon exemple, et tu es en train de déduire que A est la meilleure solution parce qu'à vide, A est plus rapide (et je t'ai prévenu du danger de ce raisonnement). Quelles sont les performances de pygame sur un jeu complet ? Pourquoi voulais-tu passer à sfml ?
A vide, pygame est plus rapide, avec le premier objet, un pysfml bien géré vaut 100 pygame, j'étais a 10ms sur Endless caves avec pygame, je suis à 3ms avec pysfml sur Endless Rooms.
De plus, Endless Rooms est un jeu qui doit rafraîchir tout l’écran à chaque frame alors que Endless-caves n'avait que quelques sprites à effacer puis réafficher.
Donc "Pygame est toujours 2* meilleur" c'est un mensonge !
C'est cool d'avoir mis plusieurs zones ça permet de se balader un peu pendant le test . Le truc qui me déconcerte c'est l'utilisation de la souris ainsi que le placement des maps qui n'est jamais le même, décentrant au passage le héros ... mais à part ça c'est pas mal ^^
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script
Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script
Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script