Bonjour à tous,
Je développe actuellement un moteur graphique sous OpenGL et j'ai eu il n'y a pas longtemps du matériel neuf de haut de gamme. Seulement, quand j'exécute mon moteur, je découvre que je ne parviens pas à utiliser mes cartes graphiques à 100 %. Mais un cœur de mon CPU est au max, celui qui contrôle le rendu. Le souci est qu'il est impossible de faire du multi-threading avec OpenGL. Donc, entre des appels de fonctions OpenGL (en C, donc) il y a des boucles, conditions, incrémentations et compagnie ...
Mon idée pour aller plus vite, est de générer des fonctions directement en langage machine pour le rendu graphique sur les autres cœurs. Donc les boucles, conditions (etc…) seraient donc exécutées une seule fois sur un autre thread, en ne mettant bout à bout que les appels OpenGL nécessaires dans un emplacement mémoire. Puis, cet emplacement mémoire serait exécute comme si c'était une fonction par le thread chargé de faire les appels OpenGL. Fini, donc, les pertes de temps entre chaque appel OpenGL.
Jusque là, j'ai juste programmé en assembleur juste pour utiliser les instruction SSE (1 à 4.2) pour accélérer les opérations sur les floats et dans le langage « humain » (ex : mov eax, [ebx]).
Est-il possible d'exécuter un emplacement mémoire comme si c'était une fonction ?
Comment fait-on ?
Comment appelle-t-on une fonction C avec l'assembleur ?
Connaissez vous une bonne documentation assembleur pour avoir les valeurs hexadécimales correspondantes aux instructions ?
Merci de votre lecture ainsi que de vos réponses.
Partager