{"id":2104,"date":"2015-04-11T18:45:00","date_gmt":"2015-04-11T18:45:00","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=2104"},"modified":"2015-06-28T08:29:31","modified_gmt":"2015-06-28T08:29:31","slug":"le-performance-timer","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=2104","title":{"rendered":"Un Performance Timer pour synchroniser vos entit\u00e9s"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/timer-image.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-2105\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/timer-image.jpg\" alt=\"timer-image\" width=\"225\" height=\"225\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/timer-image.jpg 225w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/timer-image-150x150.jpg 150w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Dans un jeu, il peut \u00eatre utile de calculer le temps entre chaque affichage pour synchroniser la mise \u00e0 jour de certaines entit\u00e9s.<\/p>\n<p>En effet la vitesse de calcul fait par votre processeur peut rendre la vitesse de ces entit\u00e9s trop rapide.<\/p>\n<p>Par exemple la vitesse de d\u00e9placement d&rsquo;un mod\u00e8le peut \u00eatre plus rapide sur la machine d&rsquo;un PC avec un processeur plus rapide que le v\u00f4tre, parce que la boucle de rendu est appel\u00e9e plus fr\u00e9quemment que chez vous.<\/p>\n<p>Un m\u00e9canisme de calcul du temps pass\u00e9 entre chaque rendu d&rsquo;affichage permet de pallier ce probl\u00e8me.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>\u2013 Savoir lire du C++.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Nous allons utiliser la fonction <strong>QueryPerformanceCounter <\/strong>qui donne le temps pr\u00e9sent en \u00ab\u00a0count\u00a0\u00bb.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;windows.h&gt;\r\n\r\n__int64 A = 0;\r\nQueryPerformanceCounter((LARGE_INTEGER*)&amp;A);\r\n\r\n\/* Instructions *\/\r\n\r\n__int64 B = 0;\r\nQueryPerformanceCounter((LARGE_INTEGER*)&amp;B);\r\n<\/pre>\n<p>On fait la soustraction : B &#8211; A, et on a le temps pass\u00e9 (en count) entre l&rsquo;ex\u00e9cution de ces instructions !<\/p>\n<p>D&rsquo;autre part il nous faut le temps en seconde (et non en count !)<\/p>\n<p>Dond avec la fonction <strong>QueryPerformanceFrequency <\/strong>on obtient le count par seconde.<br \/>\nOn aura donc le temps escompt\u00e9 en seconde !<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n__int64 cntsPerSec = 0;\r\nQueryPerformanceFrequency((LARGE_INTEGER*)&amp;cntsPerSec);\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Le nombre de secondes escompt\u00e9 en un count est calcul\u00e9 par :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ Secondes par count :\r\nfloat secsPerCnt = 1.0f \/ (float)cntsPerSec;\r\n\r\n\/\/ Temps en secondes :\r\nvalueInSecs = valueInCounts * secsPerCnt;\r\n<\/pre>\n<p><strong><br \/>\nTemps pass\u00e9 entre chaque affichage :<\/strong><\/p>\n<p>On peut calculer le temps pass\u00e9 entre chaque rendu d&rsquo;affichage. Notons <em><strong>t<\/strong><\/em> le temps pass\u00e9 ;<br \/>\net <img src='https:\/\/s0.wp.com\/latex.php?latex=t+_%7Bi%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='t _{i} ' title='t _{i} ' class='latex' \/> le temps pass\u00e9 depuis le <em><strong>i\u00e8me<\/strong><\/em> affichage et <img src='https:\/\/s0.wp.com\/latex.php?latex=t+_%7Bi-1%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='t _{i-1} ' title='t _{i-1} ' class='latex' \/> le temps pass\u00e9 depuis le <em><strong>pr\u00e9c\u00e9dent<\/strong><\/em> affichage.<\/p>\n<img src='https:\/\/s0.wp.com\/latex.php?latex=%5CDelta+t+%3D+t+_%7Bi%7D+%7B+-+%7D+t_%7Bi-1%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\Delta t = t _{i} { - } t_{i-1} ' title='\\Delta t = t _{i} { - } t_{i-1} ' class='latex' \/>\n<p>&nbsp;<\/p>\n<p>On calcule ainsi le temps pass\u00e9 entre chaque affichage. On utilise cette valeur de temps afin de synchroniser la mise \u00e0 jour de nos entit\u00e9s dans la boucle de rendu :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nvoid MaBoucleDeRendu()\r\n{\r\n\u00a0\u00a0 \u00a0\/* Instructions *\/\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0__int64 currTimeStamp = 0;\r\n\u00a0\u00a0 \u00a0QueryPerformanceCounter((LARGE_INTEGER*)&amp;currTimeStamp);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0float fTimeSinceLastFrame = (currTimeStamp - prevTimeStamp) * cntsPerSec;\r\n\r\n\u00a0\u00a0 \u00a0UpdateScene(fTimeSinceLastFrame);\r\n\u00a0\u00a0 \u00a0DrawScene();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0prevTimeStamp = currTimeStamp;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/* Instructions *\/\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Voici un exemple<\/strong> de mise \u00e0 jour d&rsquo;une entit\u00e9 en utilisant la valeur <em>fTimeSinceLastFrame<\/em> (toujours changeante) :<\/p>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Nous avons vu de quelle fa\u00e7on synchroniser la mise \u00e0 jour de vos entit\u00e9s de fa\u00e7on \u00e0 ce qu&rsquo;elles varient dans le temps \u00e0 la m\u00eame vitesse sur toutes les machines.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans un jeu, il peut \u00eatre utile de calculer le temps entre chaque affichage pour synchroniser la mise \u00e0 jour de certaines entit\u00e9s. En effet la vitesse de calcul fait par votre processeur peut rendre la vitesse de ces entit\u00e9s trop rapide. Par exemple la vitesse de d\u00e9placement d&rsquo;un mod\u00e8le peut \u00eatre plus [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2104"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2104"}],"version-history":[{"count":64,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2104\/revisions"}],"predecessor-version":[{"id":3101,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2104\/revisions\/3101"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}