Non je les mets dans des panels qui sont dans sur une grosse panel qui est sur une form.
Version imprimable
Non je les mets dans des panels qui sont dans sur une grosse panel qui est sur une form.
à moins de dire une grosse connerie, oublie alors tout ce qu'on a dit concernant directx, en fait moi (et je suppose aussi f-fisher) parlais(ions) de direct3d.
donc en fait tu ne te sers que du multithreading cpu.
Est-ce que je peux dans ce cas là combiner Direct3d et Directx pour multithreader sur gpu ?
ça ne te servirait que dans le cas ou tu ferais un rendu dans une fenêtre direct3d, ou que le codec de décompression puisse utiliser la puissance de calcul du gpu.
et encore pour le premier cas ça n'accélèrerait pas le moins du monde ton application.
et pour le 2ème sachant que ce que tu utilise est référencé dans la catégorie directx9, tu ne peux pas déléguer le calcul sur le gpu.
donc non, pas de mt gpu.
pour ça il faut voir plutôt du coté de cuda (nvidia), ati stream (amd), opencl ou de directcompute si tu veux absolument utiliser le gpu.
Dans le lien que tu as cité précedemment :http://www.codeproject.com/KB/threads/csThreading.aspx, la librairie OpenMP a l'air intéressante pour paralléliser des tâches. Je crois que je vais me contenter de la puissance de calcul du CPU, même si le mien est médiocre (T2500).
si tu utilises effectivement des threads (cf ton premier post) changer de bibliothèques de gestion te sera probablement pas d'un grand secours, regarde déjà si ce que tu as utilise effectivement tout ton processeur
Oui ça utilise tout mon processeur.
reste à voir si il n'y aurait pas une erreur dans ton algo
Si tu veux je peux poster tout mon code demain (là je suis pas chez moi) à 8h du mat' comme ça tu pourra voir s'il n'y a pas d'erreurs.
ouais, mais j'ai bien peur que je vais pas en trouver, on verra bien
@stardeath:
J'ai lancé mon appli en virant le D3DCREATE_MULTITHREADED, résultat 174 fps, en le remettant j'ai 186 fps...
Donc je suppose qu'avec un materiel adéquat, on peut se permettre de mettre ce flag.
Ma config:
Intel Core2Duo E8400 @ 3.0Ghz x2 sur FSB 1600.
3Go de RAM en DDR2 800 Mhz.
GeForce 9600 GT avec 1Go de VDDR3.
----------------------------------------------------------------------
Sinon, pour l'histoire de la video en MT, essaye de voir le combo D3D et Bink Video, je suppose que c'est la solution à ton problème.
Ma config: T2500 et go 7300 :lol:
F-Fisher as tu une idée si AudioVideoPlayback peut être utilisée avec direct3D ?
Voici mon code complet (Dis moi si tu veux que j'envoie les autres codes (constructeur et main)):
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using Microsoft.DirectX.AudioVideoPlayback; namespace videosCases { public partial class VideosCases : Form { public int N = 20; private Video[] v; private System.Threading.Thread[] t; private System.Threading.Thread f; private delegate void ChangeSize(Panel p); int i = 0; int verif = 0; // Initialisation de la form public VideosCases() { CreateHandle(); v = new Video[N]; t = new Thread[N]; //tv = new Thread[3]; InitializeComponent(); // Appel de la procédure d'initialisation du device Direct3D InitializeGraphics(); //Control.CheckForIllegalCrossThreadCalls = false; } // Procédure d'initialisation du device Direct3D public void InitializeGraphics() { //Creation des videos for (int x = 0; x < N; x++) { if(x<25) v[x] = new Video("videos/" + (x+1) + ".avi",false); else v[x] = new Video("videos/" + (x - 24) + ".avi", false); } for (int x = 0; x < N; x++) { v[x].Owner = panel[x]; v[x].Size = new System.Drawing.Size(80, 60); panel[x].Width = 80; panel[x].Height = 60; v[x].Ending += new EventHandler(v_Ending); //v[x].Disposing += new EventHandler(v_Disposing); t[x] = new Thread(new ParameterizedThreadStart(play)); t[x].Start((Object)v[x]); } } void play(Object v) { ((Video)v).Stop(); ((Video)v).Play(); } private void v_Ending(Object v, System.EventArgs e) { try { ((Video)v).Stop(); ((Video)v).Play(); } catch { } } private void panel1_MouseEnter(object panel, EventArgs e) { if (i < 10) { i++; ((Panel)panel).BringToFront(); ((Panel)panel).Width = 80 + (i * 8); ((Panel)panel).Height = 60 + (i * 6); } } } }
pour f-fisher : au temps pour moi, je n'ai fait que lire la doc, j'ai pas testé, désolé
hedisurfer : personnellement je préfère avoir la solution complète, pour direct lancer avec la bonne config.
Voici le lien megaupload: http://www.megaupload.com/?d=1G1W0HS0
Quelqu'un peut m'expliquer pourquoi quand je tournes l'application codée en VS c# avec des éléments du .net framework 3.5 sur un ordi sous 7 pro 32bits elle roule rapidement alors que sur un autre ordi sous 7 pro 64 bits elle roule très lentement (sur lequel le framework 3.5 est installé) ?
Bonjour.
Tu ne vois pas de différences parce que la lecture d'une video est déjà un processus multithreadé...
En fait, créer des threads comme tu le fais n'a aucun intérêt. Tout au plus, tu évites un blocage de l'interface graphique pendant le chargement et le lancement de la vidéo (selon le format vidéo utilisé, ce sera un blocage de quelques millisecondes à quelques secondes).
J'aimerais que tu m'expliques ce qui te fais penser que ça va améliorer les performances d'utiliser des threads ?
On utilise des threads pour effectuer plusieurs tâches en simultané. L'utilisation de thread ajoute des instructions au processeur (changement de contexte, etc...). Donc par définition, ajouter des instructions au processeur diminue les performances. Ou alors faut m'expliquer...
En ce qui concerne le lancement de plusieurs vidéos en même temps :
Lances une vidéo et regardes la charge du processeur. Imaginons, elle est de 20%.
Lances une deuxième vidéo et regardes la charge du processeur. Tu verra qu'elle aura doublée et sera de 40%.
Donc pour 5 vidéos, ton processeur sera à 100%.
Je pense mais c'est à vérifier, l'API .net AudioVideoPlayback utilise l'accélération matérielle, lorsqu'elle est disponible.
Avec cette API, une chose qui pourrait te permettre d'améliorer les performances, ce serait d'utiliser des codecs performants...
PS : quel est le format des vidéos utilisé (.wmv, .mpeg, .avi...) ?
Bonjour,
C'est des vidéos avi. mais de petite taille (3seconces) et de petite résolution (320x240). Est-ce que les codecs utilisent le cpu ? Dois-je installer sur mon ordi un codec performant pour avi ? J'ai déjà VLC (dernière version) alors normalement cela ne devrait pas poser de problèmes non ?
J'utilise le multithreading pour paralléliser le calcul de chaque vidéo mais si tu me dis que chaque vidéo est sur un thread alors c'est bon (de toute façon même en le virant c'est toujours pareil). D'ailleurs y-a-t-il une différence entre parallélisation de tâches et mulithreading ?
Je voulais savoir aussi si les events s'executent sur des threads à part ou pas ?
Pour votre question sur l'utilisation du CPU, elle augmente effectivement en rajoutant des vidéos (je l'avais confirmé dans les autres posts).
Absolument !
J'appuie à 100% tes explications ;)
Il n'est pas pertinent de créer des threads pour lire des vidéos.
Le résultat risque d'être nul et de trop solliciter le CPU
Moldavi a parfaitement bien tout expliqué.
En interne si tu lis une vidéo le sytème passe éventuellement par la création d'un ou de threads..
tu écris vouloir utiliser le multithreading pour paralléliser les calculs mais le code déjà crée par la technologie pour lire la vidéo le fait à ta place..
( ici
)Code:
1
2 Microsoft.DirectX.AudioVideoPlayback;