Cette fin de semaine nous a appris que les versions windows des applis Raydium posaient problème sur certains Pentium 4 :
J'ai compilé un version windows du "Bomberfrag" qui est en cours de développement de facon à ce que Seldaek, qui a commencé à modéliser les persos du jeu, puisse se rendre compte du rendu de ses modèles. Sauf que le jeux n'affichait sur sa machine qu'un écran jaune. Après analyse des logs, il est ressortit qu'il semblait y'avoir un problème du coté des timers, mais sans qu'on puisse en savoir plus, puisque Seldaek habite loin
RyLe s'est chargé de trouver des machines qui posaient problème parmis celles qu'il voit passer tout les jours, et a réussi à confirmer qu'il s'agissait bien d'un problème avec les P4 récents (3 Ghz, a priori). Cela nous a permis de trouver une telle machine pour effectuer (enfin) des tests plus précis pour cerner le problème et le corriger, et c'est donc la machine de Flex qui a joué le cobaye. Après quelques heures d'acharnement, Raydium dispose maintenant d'un système pour "ajuster" sa lecture des timers du CPU et éviter le problème des P4, et ceux qui pourraient arriver avec les futurs CPU.
Pour ceux qui souhaitent des détails, le problème est en fait simple : Raydium utilise RDTSC (Read Timestamp Counter) pour avoir accès à un timer très précis situé dans le CPU lui même. La facon dont Raydium traite cette information fait qu'il dispose en moyenne de 20 minutes avant que ce compteur ne boucle. Mais les fameux P4 ont complétement changé la fréquence de ce compteur qui est excessivement plus précis sur ces CPU, à tel point que le compteur boucle environ chaque seconde ! La plage est trop faible pour les timers de Raydium, qui n'arrivent plus à "planifier" sur plus d'une seconde.
La correction a consisté à tester la fréquence du compteur au lancement de Raydium, de facon à déterminer un "diviseur" sur les valeurs lues ensuite avec RDTSC. La correction a fonctionné du premier coups sur deux des machines qui étaient concernées par le problème (Flex et Seldaek).
Notez que Linux n'a pas du tout été affecté par ce problème, sa lecture du RDTSC étant normalisée, elle ...
Ref :
MSDN : QueryPerformanceCounter