2009-04-15 6 views
0

J'ai 3 points bitmap.Quel est le moyen le plus rapide de dessiner une image sur une autre image?

Bitmap* totalCanvas = new Bitmap(400, 300, PixelFormat32bppARGB); // final canvas 
Bitmap* bottomLayer = new Bitmap(400, 300,PixelFormat32bppARGB); // background 
Bitmap* topLayer = new Bitmap(XXX); // always changed. 

je tirerai sur fond complexe bottomLayer. Je ne veux pas redessiner l'arrière-plan complexe sur totalCanvas encore et encore, donc je l'ai stocké dans bottomLayer.

TopLayer a été modifié fréquemment. Je veux dessiner bottomLayer to totalCanvas. Quel est le moyen le plus rapide?

Graphics canvas(totalCanvas); 
canvas.DrawImage(bottomLayer, 0, 0); step1 
canvas.DrawImage(topLayer ,XXXXX); step2 

Je veux que l'étape 1 soit aussi rapide que possible. Quelqu'un peut-il me donner un échantillon? Merci beaucoup!

Merci pour la réponse de unwind. Je vous écris le code suivant:

Graphics canvas(totalCanvas); 
for (int i = 0; i < 100; ++i) 
{ 
canvas.DrawImage(bottomLayer, 0,0); 
} 

cette partie prend 968ms ... il est trop lent ...

+0

sont des dimensions de bottoLayer toujours les mêmes que les dimensions totales de la toile? Si oui, pourquoi créer deux bitmaps? – user88637

+0

Merci, j'ai ajouté la raison dans la question. – user25749

Répondre

1

Presque toutes les opérations GDI + devraient être mises en œuvre par le pilote pour faire fonctionner autant que possible sur le GPU . Cela devrait signifier qu'une simple opération de copie bitmap 2D sera "assez rapide", même pour des valeurs assez grandes de "assez".

Ma recommandation est la plus évidente: ne vous inquiétez pas en passant du temps à chercher le moyen le plus rapide de le faire. Vous avez formulé le problème très clairement, alors essayez simplement de le mettre en œuvre aussi clairement, en le faisant comme vous l'avez souligné dans la question. Ensuite, vous pouvez bien sûr aller de l'avant et l'évaluer et décider de continuer la chasse.

Une illustration simple:

A 32 BPP 400x300 bitmap est d'environ 469 Ko. Selon this handy table, un Nvidia GeForce 4 MX à partir de 2002 a une bande passante de mémoire théorique de 2,6 Go/s. En supposant que la copie est faite en mode pur "overwrite", c'est-à-dire sans mélange de la surface existante (ce qui sonne bien, car votre copie est essentiellement un "clearing" du cadre aux données source de la copie) juste pour être sûr, nous obtenons:

(2,6 * 2^30/(4 * 469 * 2^10)) = 1453

Cela signifie que votre copie doit fonctionner à 1453 FPS, que je heureux supposer être "assez bon".

+0

Merci !, j'ai essayé mais il ne semble pas assez rapide ... – user25749

0

Si possible (et il ressemble à cela à partir de votre code), en utilisant DrawImageUnscaled sera significativement plus rapide que DrawImage. Ou si vous utilisez encore et encore la même image, créez un TextureBrush et utilisez-le.

Le problème avec GDI +, c'est que pour la plupart, il n'est pas accéléré. Pour obtenir les vitesses de dessin rapides, vous avez vraiment besoin de GDI et BitBlt, ce qui est très pénible à utiliser avec GDI +, surtout si vous êtes en code Managed (difficile à dire si vous utilisez C++ ou C++).

Voir ce post pour plus d'informations sur les graphiques rapidement dans .net.

Questions connexes