Collecte d'un Bitmap et affichage, Optimisation ?
Posté : dim. 30 mai 2021 16:32
Bonjour,
J'ai besoin de récupérer, en boucle, un Bitmap JPEG (light: 80k) sur mon réseau local pour l'afficher dans la GUI.
Ca fonctionne !
Par contre je trouve, après des mesures de timing que la Fonction "intRead" est relativement lente (!)
Avec 'InetGet' ca met 2 fois moins de temps, par contre je le perd avec l'enregistrement du fichier, et l'affichage
J'ai fait des tests avec d'autre langages que je maitrise mieux que AutoIt, et c'est largement plus rapide (8 fois + rapide parfois)
Je pinaille, mais y a t'il un moyen de faire plus rapide en Utilisant Les Fonctions TCP ou autres ? ou des UDF de bas niveau.
'InetRead' doit refaire toute la séquence de connexion TCP + Authentification à chaque requêtes, ce qui doit lui faire pardre pas mal de temps (?)
Voici mon bout de code actuel:
Merci pour vos conseils !
AD
EDIT: J'ai testé avec la Lib UDF "winhttp.au3", je divise par 2 les Timings par rapport a "InetRead" c'est deja ca
J'ai juste remplacé "InetRead()" par une "_WinHttpSimpleRequest()" dans la boucle, les _WinHttpOpen()/_WinHttpConnect() etant eux hors de la boucle...
Peut faire mieux ?
J'ai besoin de récupérer, en boucle, un Bitmap JPEG (light: 80k) sur mon réseau local pour l'afficher dans la GUI.
Ca fonctionne !
Par contre je trouve, après des mesures de timing que la Fonction "intRead" est relativement lente (!)
Avec 'InetGet' ca met 2 fois moins de temps, par contre je le perd avec l'enregistrement du fichier, et l'affichage
J'ai fait des tests avec d'autre langages que je maitrise mieux que AutoIt, et c'est largement plus rapide (8 fois + rapide parfois)
Je pinaille, mais y a t'il un moyen de faire plus rapide en Utilisant Les Fonctions TCP ou autres ? ou des UDF de bas niveau.
'InetRead' doit refaire toute la séquence de connexion TCP + Authentification à chaque requêtes, ce qui doit lui faire pardre pas mal de temps (?)
Voici mon bout de code actuel:
Code : Tout sélectionner
#include <GDIPlus.au3>
HotKeySet('{ESC}', 'Exit1')
Func Exit1()
Exit
EndFunc
Global Const $UrlBitmap = "http://user:password@192.168.0.102/path/auto.jpg"
Global Const $iTimeInterval = 300 ; Interval entre chaque refresh
Global Const $iWidth = 1280, $iHeight = 720
Global $iTimes = 0
Global $hTimer = TimerInit()
Global $hGUI = GUICreate("", $iWidth, $iHeight)
Global $iPic = GUICtrlCreatePic("", 0, 0, $iWidth /2, $iHeight/2)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Do
If $hTimer And TimerDiff($hTimer) > $iTimes * $iTimeInterval Then
$iTimes += 1
; plus rapide par autre technique ? inetRead Prend entre 400 & 600ms (!)
Local $hBitmap = _GDIPlus_BitmapCreateFromMemory( InetRead( $UrlBitmap, 1+16 ) )
Local $hBitmap_Scaled = _GDIPlus_ImageResize($hBitmap, $iWidth / 2, $iHeight / 2)
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, 0, 0)
EndIf
Until GUIGetMsg() = -3
_GDIPlus_Shutdown()
GUIDelete($hGUI)
AD
EDIT: J'ai testé avec la Lib UDF "winhttp.au3", je divise par 2 les Timings par rapport a "InetRead" c'est deja ca
J'ai juste remplacé "InetRead()" par une "_WinHttpSimpleRequest()" dans la boucle, les _WinHttpOpen()/_WinHttpConnect() etant eux hors de la boucle...
Peut faire mieux ?