Forums Développement Multimédia

Aller au contenu

Moteur de rendu de sprites 2D via Stage3D

CODE Actionscript

34 réponses à ce sujet

#1 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 19:49 PM

De nouveau moi.
Si cette fois encore je trouve la réponse tout seul dans l'heure qui vient, j'arrête de poser des questions, c'est promis ;)

Le contexte de ma question, c'est que j'essaie d'utiliser le GPU pour faire le rendu de particules 2D. J' y suis arrivé avec Starling, et maintenant je regarde si je peux encore améliorer les performances en utilisant directement Stage3D.

J'ai donc des objets rectangulaires à afficher. Pour chaque objet j'ai:
- sa taille
- sa position
- sa rotation
- sa mise à l'échelle
- son opacité
- sa texture

J'essaie de faire un seul appel de drawTriangles() pour dessiner tous les objets.
Concernant la position/taille/échelle/rotation je vois 2 possibilités:

1- Je calcule en AS les coordonnées des vertices, d'après les différentes valeurs position/taille/échelle/rotation, puis je les charge dans le VertexBuffer

2- Je ne calcule rien en AS, mais je passe également les position/taille/échelle/rotation par le VertexBuffer. Et je trouve un Shader qui fait les calculs.

J'ai bien envie d'essayer la méthode 2. Qu'en pensez-vous?
Pour la programmation du shader, tout conseil sera le bienvenu. J'ai pensé à reconstituer une matrice dans les registres du gpu, d'après les position/taille/échelle/rotation, mais je ne vois pas du tout comment faire, ni où trouver de la doc qui m'explique un peu comment sont gérées les matrices.
Sinon je peux éviter les matrices et faire les calculs directement.

Toute idée est bienvenue :)

#2 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 19:57 PM

Hello !

Citation

2- Je ne calcule rien en AS, mais je passe également les position/taille/échelle/rotation par le VertexBuffer. Et je trouve un Shader qui fait les calculs.

Le problème c'est que tu ne dois pas faire ce calcul une seule fois mais autant de fois que tu as de rectangle. A moins d'avoir un VertexBuffer par rectangle (mais du coup tu fera un appel a drawTriangle par rectangle), je ne pense pas que ce soit possible (mais je n'y connais rien en Shader donc ne prend pas ce que je dis pour parole d'evangile)

#3 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 20:00 PM

Citation

je ne vois pas du tout comment faire, ni où trouver de la doc qui m'explique un peu comment sont gérées les matrices.

Même si PixelBender3D a été déprécié, regarde de ce coté car , à l'origine, c'est l'outil qu'avait choisi adobe pour creer des shader

#4 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 20:41 PM

Ah, le voilà! :mrgreen:

Pour le premier point que tu soulèves, je ne suis pas sûr de te comprendre.
Je pensais faire:

// Le rectangle. w2 et h2 sont la moitié de la largeur et la hauteur du rectangle
var vertices:Vector.<Number> = Vector.<Number>([
        - w2, - h2, 00, 0,                    // x, y, z, uv
        - w2, + h2,     0,      0, letterH / textureH,
        + w2, + h2, 0,  letterW / textureW, letterH / textureH,
        + w2, - h2, 0,  letterW / textureW, 0
]);
var vertexBuffer:VertexBuffer3D = _context3D.createVertexBuffer(4, 5);
vertexBuffer.uploadFromVector(vertices, 0, 4);

// scale et position
var scale:Number = 1;
vertices = Vector.<Number>([
        scale, scale, 1,        x, y, 0,        // scaleX, scaleY, scaleZ, tx, ty, tz
        scale, scale, 1,        x, y, 0,
        scale, scale, 1,        x, y, 0,
        scale, scale, 1,        x, y, 0
]);
var paramBuffer:VertexBuffer3D = _context3D.createVertexBuffer(4, 6);
paramBuffer.uploadFromVector(vertices, 0, 4);

Le problème que je vois c'est surtout que pour un seul rectangle, il faut remplir 4 fois le Vector de paramBuffer, une fois pour chaque angle du rectangle.

Pour l'instant on dirait que ça marche, sauf que j'ai encore unb petit problème avec la translation.

Et merci pour la piste pixelbender, j'y pensais pas :)

#5 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 21:01 PM

ah ok , je ne voyais pas ca comme ca :)

Alors oui, ca m'a l'air possible :)

Citation

il faut remplir 4 fois le Vector de paramBuffer, une fois pour chaque angle du rectangle.

Je sais que c'est possible de fournir les valeurs une seule fois et de les appliquer sur chaque vertex. Mais je ne sais pas comment (je n'ai pas encore vraiment essayé de coder des Shader à vrai dire, j'ai beaucoup regardé le code des autres mais je n'ai pas encore assez la confiance pour m'y mettre (sans doute parce que je n'ai pas les bases en Math nécessaire pour coder des Shader (ce serait bien que je comprenne parfaitement ce qu'est un dotProduct par exemple avant d'esperer pouvoir m'y mettre).


Bon courage pour la suite en tout cas
(et n'hesite pas a poster le code si jamais tu trouve :))

++

#6 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 21:17 PM

En fait apriori, tu devrais avoir un truc comme ca (mais c'est sans doute ce que tu fais deja)


var vertices:Vector.<Number> = Vector.<Number>([
        - w2, - h2, 0,  0, 0,                    // x, y, z, uv
        - w2, + h2,     0,      0, letterH / textureH,
        + w2, + h2, 0,  letterW / textureW, letterH / textureH,
        + w2, - h2, 0,  letterW / textureW, 0
]);
var vertexBuffer:VertexBuffer3D = _context3D.createVertexBuffer(4, 5);
vertexBuffer.uploadFromVector(vertices, 0, 4);

var infos:Vector.<Number> = new Vector.<Number>();
infos[0] = scaleX;
infos[1] = scaleY;
infos[2] = scaleZ;
infos[3] = x;
infos[4] = y;
infos[5] = z;

context.setVertexBufferAt(0, verts, 0, Context3DVertexBufferFormat.FLOAT_3); // XYZ
context.setVertexBufferAt(1, verts, 3, Context3DVertexBufferFormat.FLOAT_2); // UV

context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, infos, 6);
 

Par contre je ne sais pas trop comment récupérer les valeurs qu'on passe comme constante au sein du code AGAL

#7 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 21:21 PM

Ce lien devrait être utile :)

http://pixelante.ca/...vertex_lighting

#8 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 21:45 PM

Voir le messagetlecoz, le 05 November 2011 - 21:17 PM, dit :


var infos:Vector.<Number> = new Vector.<Number>();
infos[0] = scaleX;
infos[1] = scaleY;
infos[2] = scaleZ;
infos[3] = x;
infos[4] = y;
infos[5] = z;
context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, infos, 6);
 
Tout à fait, sauf que comme ça, les valeurs seront identiques pour chaque vertice traité. Et moi je veux avoir des infos différentes pour chaque rectangle. Donc de mêmes infos pour un paquet de 4 vertices.

Voir le messagetlecoz, le 05 November 2011 - 21:21 PM, dit :

Ce lien devrait être utile :)
http://pixelante.ca/...vertex_lighting
Je venais de le trouver! En effet c'est carrément de bons exemples!
http://pixelante.com/tutorials.php

J'ai bien avancé, je crois que je ne vais pas tarder à pouvoir poster le code :D

#9 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 22:02 PM

Super ça marche!
Merci pour ton soutien :)
J'ai plus qu'à tester les perfs.

Fichier(s) joint(s)



#10 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 22:29 PM

Nice !

Peux tu poster un zip contenant le html + le swf pour voir le résultat car windows m'ouvrent toujours mes swf avec fp10...

#11 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 22:47 PM

Voir le messagetlecoz, le 05 November 2011 - 22:29 PM, dit :

Nice !

Peux tu poster un zip contenant le html + le swf pour voir le résultat car windows m'ouvrent toujours mes swf avec fp10...
J'ai pas le html et ça me prendrait du temps de le faire, parce-que je sais pas le faire automatiquement, mais voici le zip contenant le swf si tu as besoin.

Fichier(s) joint(s)

  • Fichier joint  Main.zip   12.89 Ko   4 téléchargement(s)


#12 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 22:49 PM

Voilà: 10 000 bitmaps, sur ma machine un peu vieille ça tourne à 15~28fps, et j'ai un problème de transparence!
[edit] Ah non, 22~25fps en fait, c'est parce-que j'étais en mode débug.

Fichier(s) joint(s)



#13 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 23:07 PM

Voir le messagetlecoz, le 05 November 2011 - 22:29 PM, dit :

windows m'ouvrent toujours mes swf avec fp10...
Moi j'ai téléchargé le player standalone, et j'ai associé les fichiers .swf à cet exe. Tu ne peux pas le faire?

#14 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 23:13 PM

Voir le messagelilive, le 05 November 2011 - 22:49 PM, dit :

j'ai un problème de transparence!
Aïe aïe aïe!!!
On dirait qu'il est impossible de faire se superposer des triangles texturés avec transparence lors d'un même drawTriangle(). Les pixels sont calculés en fonction des pixels du triangle et des pixels du rendu tel qu'il était avant le drawTriangles().
Pffff, quelle mauvaise surprise, tout est par terre...

#15 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 23:22 PM

Citation

On dirait qu'il est impossible de faire se superposer des triangles texturés avec transparence lors d'un même

Tu veux dire que la superposition ne rend pas comme elle devrait dans le sens ou si on superpose une centaine de rectangle translucide le résultat reste translucide ?
Ou ca n'a rien à voir (moi c'est le résultat que j'obtiens de mon coté)

#16 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 23:58 PM

Voir le messagetlecoz, le 05 November 2011 - 23:22 PM, dit :

Tu veux dire que la superposition ne rend pas comme elle devrait dans le sens ou si on superpose une centaine de rectangle translucide le résultat reste translucide ?
Ou ca n'a rien à voir (moi c'est le résultat que j'obtiens de mon coté)
Dans la doc de Context3DBlendFactor est marqué:

Citation

A blend factor represents a particular four-value vector that is multiplied with the source or destination color in the blending formula. The blending formula is:

result = source × sourceFactor + destination × destinationFactor

In the formula, the source color is the output color of the pixel shader program. The destination color is the color that currently exists in the color buffer, as set by previous clear and draw operations.

Donc, durant un drawTriangles(), un pixel est calculé d'après la couleur du pixel d'un seul triangle et la couleur du pixel du fond au même endroit. La couleur du fond est celle d'avant le drawTriangles().

Si je comprends bien, si on dessine 100 triangles de même coordonnées lors d'un seul drawTriangle, la couleur des pixels sera uniquement fonction de la couleur du fond avant l'appel, et de la couleur des pixels du dernier triangle a être tracé. Les tracés des 99 premiers triangles ne servent à rien. D'où le résultat qu'on observe dans mon swf: si on voit des fonds blancs autour des lettres, ce n'est pas parce-que la texture est opaque, mais parce-que les pixels autour de la lettre étaient blancs sur le fond, avant le drawTriangles, et que c'est ces pixels qui apparaissent.

C'est vraiment dommage, je trouvais que ça cartonnait bien niveau perfs.

[edit] Ah ben non, j'avais pas compris (ou la doc n'est pas claire ;)), il est possible d'avoir une vrai transparence. Voir l'intervention de _pil_ plus bas, et les posts suivants.

Fichier(s) joint(s)



#17 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 November 2011 - 00:49 AM

Pour les yeux ;)

Fichier(s) joint(s)



#18 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 06 November 2011 - 01:39 AM

Ca rend super bien !

C'est vraiment reloud ces histoire de transparence...


EDIT : La premiere anim avec les milliers de M qui bouge, c'est completement hypnotisant :)

#19 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 06 November 2011 - 01:56 AM

Quelque chose me dit que c'est possible à faire :)


http://jpauclair.net...flash-molehill/

#20 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 November 2011 - 02:32 AM

J'ai trouvé un truc pour la transparence. Il est possible, dans le pixel shader, de choisir de ne pas tracer le pixel. En choisissant d'éliminer ainsi les pixels dont la transparence est sous un certain seuil, j'ai pu avoir une pseudo transparence: tous les pixels plus transparents que le seuil ne sont pas rendus.

J'en ai profité pour ajouter la gestion d'un alpha pour chaque rectangle, et tant qu'à y être, un multiplicateur de couleur.

Voici les shaders:

// Shaders ////////////////////////////////////////////////////////////////
var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
vertexShaderAssembler.assemble(
        Context3DProgramType.VERTEX,
       
        // va0  Coordonnées (FLOAT_3)
        // va1  Texture UV (FLOAT_2)
        // va2  scale (FLOAT_1)
        // va3  translation (FLOAT_2)
        // va4  rotation (FLOAT_1)
        // va5  color multiplier (FLOAT_4)
       
        // vc0-3 matrix
        // vc4  [1, 1, 1, 1]
       
        "mov vt0, va0 \n" +
        // changement d'échelle
        "mul vt0.xy, vt0.xy, va2.xx \n" +
        // définition des vecteurs de rotation
        "mov vt1, vc4 \n" +
        "cos vt1.x, va4.x \n" +
        "sin vt1.y, va4.x \n" +
        "neg vt1.y, vt1.y \n" +
        "mov vt2, vc1 \n" +
        "sin vt2.x, va4.x \n" +
        "cos vt2.y, va4.x \n" +
        // rotation
        "mov vt3, vt0 \n" +
        "dp3 vt3.x, vt0, vt1 \n" +
        "dp3 vt3.y, vt0, vt2 \n" +
        // translation
        "add vt3.xy, vt3.xy, va3.xy \n" +
        // conversion dans l'espace de coordonnées
        "m44 op, vt3, vc0\n" +
        // copy uv
        "mov v0, va1 \n" +
        // copy color
        "mov v1, va5"
);
var fragmentShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
fragmentShaderAssembler.assemble(
        Context3DProgramType.FRAGMENT,
       
        // v1  color multiplier (FLOAT_4)
        // fc0 seuil alpha [0, 0, 0, -0.5]
       
        // Trouver la couleur du pixel d'après la texture
        "tex ft0, v0, fs0 <2d,linear, nomip> \n" +
        // Sauter les pixels trop transparents
        "add ft1, ft0, fc0 \n" +
        "kil ft1.wwww \n" +
        // Multiplier la couleur
        "mul oc, ft0, v1 \n"
);
 

Bouger la souris de gauche à droite pour faire varier le fps.
Il y a 10 000 rectangles:


Ah ouais, ton lien, très bien, je vais regarder ça. Bon, évidemment ça risque de me gacher un peu le plaisir ;)

Fichier(s) joint(s)



#21 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 06 November 2011 - 03:29 AM

Wouhou !!!

:Hola:

#22 pierre.lepers

  • Members
  • PipPipPipPipPipPipPipPip
  • 793 messages

Posté 06 November 2011 - 12:14 PM

Pour la transparence, c'est une question de Zbuffer. Pour un pixel donné, seul le fragment avec le z le plus faible et tracé.

Tu peux forcer le tracé de tout les triangles :

_context3D.setDepthTest( false, Context3DCompareMode.ALWAYS );

Tu va perdre en perf, puisque ton fragment shader va maintenant s'executer plusieurs fois par pixel

#23 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 November 2011 - 20:09 PM

Voir le message_pil_, le 06 November 2011 - 12:14 PM, dit :

Pour la transparence, c'est une question de Zbuffer. Pour un pixel donné, seul le fragment avec le z le plus faible et tracé.

Tu peux forcer le tracé de tout les triangles :

_context3D.setDepthTest( false, Context3DCompareMode.ALWAYS );

Tu va perdre en perf, puisque ton fragment shader va maintenant s'executer plusieurs fois par pixel
Ah une option que j'avais pas vu!
Super, merci _pil_ :)

#24 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 07 November 2011 - 00:18 AM

Et voilà, en appliquant le conseil de _pil_ j'ai pu avoir une vraie transparence, au détriment des performances, on peut le dire.

J'ai fait 3 versions de l'animation, selon 3 modes de rendu différents:
Mode 0: Les sprites de premier plan sont dessinés en premier, sauf aux endroits où leur alpha est sous un seuil donné. Les sprites plus profond qui sont au même endroit ne sont pas dessinés. Un pixel n'est donc calculé qu'une fois. C'est ce que j'avais fait jusque-là.
Mode 1: Les sprites de premier plan sont dessinés en dernier, donc par dessus les autres. Un même pixel est donc calculé autant de fois qu'il y a de sprites à cet endroit. Les perfs en prennent un sacré coup.
Mode 2: Comme le mode 1, mais les pixles ne sont pas dessinés si leur alpha est sous un seuil donné, comme le mode 0. Cela perd donc en qualité mais permet de récupérer des fps, surtout si le seuil est élevé.

Voici les swf. En bougeant la souris gauche-droite on change le framerate. En bougeant haut-bas, pour les modes 0 et 2, on modifie le seuil d'opacité.




Et voici les sources commentées:

Au passage, j'ai un peu réduit le nombre d'opcode du vertex shader.

Donc, pour des sprites opaques ou qui supportent d'être affichés selon le mode 0, les performances sont vraiment bonnes (je rappelle qu'il y a 10 000 sprites). Si on veut une vraie transparence, on perd beaucoup en performances.

Encore merci _pil_ :)

Fichier(s) joint(s)



#25 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 07 November 2011 - 18:05 PM

Prochaine étape:
En faire une classe, ajouter la possibilité d'utiliser plusieurs textures différentes, et pouvoir générer la texture sheet en AS.

#26 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 07 November 2011 - 23:19 PM

Rien de vraiment neuf, mais après avoir galéré sur l'atlas de textures, je viens partager une autre version des anneaux qui bougent. Techniquement rien de neuf, mais j'ai modifié les trajectoires pour qu'on voit mieux qu'il y a plein de sprites, et aussi j'ai fait ce qu'il faut pour que les couleurs donnent mal aux yeux :mrgreen:

Fichier(s) joint(s)



#27 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 08 November 2011 - 23:12 PM

Voir le messagetlecoz, le 08 November 2011 - 06:33 AM, dit :

j'essaierais quand même de reproduire ta démo avec mon code (même si apriori je pense que ta méthode est mieux) parce que chez moi ta derniere demo tourne à 40 FPS, et c'est peu pour seulement 10000 planes (il doit y avoir un soucis qq part à moins que ca ne vienne du probleme de transparence, bref je vais essayer et on verra ce que ca donne en laissant le CPU faire les calculs de positions (ce serait vraiment étrange que ca tourne plus vite mais bon, faut tester pour être sur :)

Voir le messagetlecoz, le 08 November 2011 - 18:44 PM, dit :

Je viens de tester avec mon code (qui calcule les positions en AS3) et c'est effectivement bien plus lent (2-3x).

Mais je suis quand même surpris car on peut faire bouger le même nombre d'élément beaucoup plus vite en pure AS3 (sans gerer la transparence ni la couleurs par contre). Mais l'équivalent de ton code sans molehill (en faisant des copyPixels) tourne à peu prés à 30 fps sur mon poste à l'agence (qui ne supporte pas le GPU) alors que ton anim tourne à 7-8 et que mon code molehill tourne à 2-3...

Du coup, j'ai un peu de mal à comprendre la logique du truc... Comme si le CPU affichait au final plus vite les élement que le GPU... (en consommant 1000x plus de ressource par contre)
Diantre!

Chez moi, en copyPixel, sans mise à l'échelle, rotation, couleur ni transparence, ça tourne à 5 fps (mode 3 dans mon code).
Avec des draw(), mise à l'échelle, rotation, couleur et transparence, ça tourne à 1 fps (mode 4).
Avec Stage3D, et support limité de la transparence (mode 0) ça tourne à 53-57 fps.
Avec Stage3D, et transparence complète (mode 1) ça tourne à 10-14 fps.

Si tu veux regarder ça, pour comparer chez toi, tu peux changer le mode de rendu ligne 51:

Après, forcément, ça devrait dépendre de la config. Mon cpu n'est pas jeune (5-6 ans), par contre la carte graphique, même si premier prix, est de l'an dernier.

Fichier(s) joint(s)



#28 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 08 November 2011 - 23:29 PM

Quand à savoir si les performances sont bonnes ou pas pour 10 000 planes, ça je sais pas dire, j'ai pas l'expérience. Tu as vu mieux?
Pour voir si le problème vient du code AS de l'enterframe, j'ai essayé de ne mettre dedans que 3 lignes:
_context3D.clear ()
_context3D.drawTriangles()
_context3D.present()
Ça ne change rien aux performances.

#29 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 08 November 2011 - 23:30 PM

Avec molehill non, sans molehill oui , c'est ça qui est étrange.

#30 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 08 November 2011 - 23:32 PM

Bon sinon, je viens de trouver un algo en C# qui a l'air redoutablement efficace pour préparer les textures (il permet de choisir parmis 3 méthode de tri. Je vais essayer de porter ça ce soir (maintenant en fait :) ).

A tout à l'heure :)

#31 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 08 November 2011 - 23:42 PM

Voir le messagetlecoz, le 08 November 2011 - 23:30 PM, dit :

Avec molehill non, sans molehill oui , c'est ça qui est étrange.
Ah bon?
Avec 10000 planes de 50x50 pixels?
Tu as vu j'ai fait 2 posts consécutifs? Si tu pouvais tester mon code dans les différents modes pour comparer avec mes tests, ce serait bien.
Un avantage de molehill c'est peut-être que le fps chutte moins avec des sprites plus gros. A vérifier. Tu peux changer leur taille ligne 38.

Voir le messagetlecoz, le 08 November 2011 - 23:32 PM, dit :

Bon sinon, je viens de trouver un algo en C# qui a l'air redoutablement efficace pour préparer les textures (il permet de choisir parmis 3 méthode de tri. Je vais essayer de porter ça ce soir (maintenant en fait :) ).

A tout à l'heure :)
Super :)
Tout à l'heure, je ne serais plus là, j'ai une semaine chargée. Déjà là je devrais être couché :mrgreen:
Bon portage!

#32 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 09 November 2011 - 00:32 AM

Citation

Chez moi, en copyPixel, sans mise à l'échelle, rotation, couleur ni transparence, ça tourne à 5 fps (mode 3 dans mon code).
Avec des draw(), mise à l'échelle, rotation, couleur et transparence, ça tourne à 1 fps (mode 4).
Avec Stage3D, et support limité de la transparence (mode 0) ça tourne à 53-57 fps.
Avec Stage3D, et transparence complète (mode 1) ça tourne à 10-14 fps.

Alors là, je deviens fou... 5 FPS tu dis... pas 50 plutot ?!

Je ne suis plus à l'agence là et je n'ai pas les fichier, mais je posterai mon code de copyPixel demain parce que c'est incompréhensible qu'on ai des comportement si opposé sur nos machine (je ne doute pourtant pas que ton code soit bon... mais je ne comprend pas...)

Bon je continue mon texture-packer !
++

EDIT : es tu sur d'avoir testé en 'release' plutot qu'en 'debug' ?

#33 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 09 November 2011 - 09:32 AM

Voir le messagetlecoz, le 09 November 2011 - 00:32 AM, dit :

Alors là, je deviens fou... 5 FPS tu dis... pas 50 plutot ?!

Je ne suis plus à l'agence là et je n'ai pas les fichier, mais je posterai mon code de copyPixel demain parce que c'est incompréhensible qu'on ai des comportement si opposé sur nos machine (je ne doute pourtant pas que ton code soit bon... mais je ne comprend pas...)

Bon je continue mon texture-packer !
++

EDIT : es tu sur d'avoir testé en 'release' plutot qu'en 'debug' ?
Oui, 5fps, en release.
Comme je te dis mon CPU est bien plus vieux que ma carte graphique
AMD 3200+ à 2Ghz
ADI Radeon HD 4300/4500
Je testerai ton code. Tu as testé la dernière version du mien? Je l'ai posté plus haut.

#34 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 09 November 2011 - 15:49 PM

Hello !

Je me suis enflammé... Quand je disais 30 fps, c'était à l'oeil mais mes yeux sont pourris et je n'en ai pas pris compte. Je viens d'ajouter un compteur de fps et en fait c'est plutôt 19-20 (sur le poste de l'agence, sans doute plus chez moi)

voila le code

package  
{
        import flash.accessibility.ISearchableText;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.TimerEvent;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        import flash.text.TextField;
        import flash.utils.getTimer;
        import flash.utils.Timer;
        /**
         * ...
         * @author tlecoz
         */

        public class Test extends Sprite
        {
               
                private var textureBD:BitmapData
                private var render:BitmapData;
                private var first:Object = new Object();
                private var frame:int = 0;
                private var fps:int = 0
                private var time:int;
                private var nb:int = 10000
               
                private var txt:TextField = new TextField();
                private var timer:Timer = new Timer(1);
               
                private var pixels:Vector.<uint>;
               
               
                public function Test()
                {
                       
                        stage.scaleMode = "noScale";
                        stage.align = "topLeft";
                       
                        render = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0);
                        pixels = render.getVector(render.rect);
                        addChild(new Bitmap(render));
                        addChild(txt);
                       
                        // Calcul des dimensions du contenu de la texture
                        var drawWidth:int, drawHeight:int, textureW:int, textureH:int
                        var size:int = 50;
                        drawWidth = drawHeight = size + 10;
                       
                        // Calcul des dimensions de la texture
                        textureW = drawWidth;
                        textureH = drawHeight;
                       
                        // Création des 3 anneaux avec des tailles et transparences différentes
                        var cont:Sprite = new Sprite();
                        var r:Sprite = new Sprite();
                        r.x = drawWidth / 2;
                        r.y = drawWidth / 2;
                        cont.addChild(r);
                        var r1:Ring = new Ring(0xFFFFFF, drawWidth * .40, drawWidth * .25, 3);
                        var r2:Ring = new Ring(0xFFFFFF, drawWidth * .45, drawWidth * .18, 3);
                        var r3:Ring = new Ring(0xFFFFFF, drawWidth * .50, drawWidth * .05, 3);
                        r2.alpha = 0.4;
                        r3.alpha = 0.2;
                        r.addChild(r3);
                        r.addChild(r2);
                        r.addChild(r1);
                       
                        var o:Object,old:Object;
                        var i:int;
                        for (i = 0; i < nb; i++) {
                                o = new Object();
                                if (!i) first = o;
                                else old.next = o;
                                old = o;
                        }
                       
                        // Création du BitmapData
                        textureBD =  new BitmapData(textureW, textureH, true, 0x00000000);
                        textureBD.draw(cont);
                       
                        time =  getTimer();
                       
                        addEventListener(Event.ENTER_FRAME, update);
                }
                private function update(e:Event):void {
                        fps++;
                       
                        if (getTimer() - time > 1000) {
                                time += 1000;
                                txt.text = "FPS : " + fps;
                                fps = 0;
                        }
                       
                        frame++
                       
                        render.setVector(render.rect, pixels);
                        //render.fillRect(render.rect,0)
                       
                        var xc:int = stage.stageWidth >> 1;
                        var yc:int = stage.stageHeight >> 1;              
                        var xr:int = stage.stageWidth/4;
                        var yr:int = stage.stageHeight/4;
                        var i:int = 0
                        var o:Object = first;
                        var pt:Point = new Point();
                        var rect:Rectangle = textureBD.rect;
                       
                        pt.x = xc + xr * Math.cos(frame / 100 - i/1000)                 * (1 - 0.8 * i / nb) + (100 + 50 * Math.cos(i / 200 - frame / 15 - frame / 50)) * Math.cos(i + frame / 50)* (1 - 0.8 * i / nb);
                        pt.y = yc + yr * Math.sin(frame / 167.54 - i/1653 - i/1000)     * (1 - 0.8 * i / nb) + (100 + 50 * Math.cos(i / 200 - frame / 15 - frame / 50)) * Math.sin(i + frame / 50) * (1 - 0.8 * i / nb);
                       
                        while ( o = o.next) {
                                i++;
                                pt.x = xc + xr * Math.cos(frame / 100 - i/1000)                 * (1 - 0.8 * i / nb) + (100 + 50 * Math.cos(i / 200 - frame / 15 - frame / 50)) * Math.cos(i + frame / 50)* (1 - 0.8 * i / nb);
                                pt.y = yc + yr * Math.sin(frame / 167.54 - i / 1653 - i / 1000) * (1 - 0.8 * i / nb) + (100 + 50 * Math.cos(i / 200 - frame / 15 - frame / 50)) * Math.sin(i + frame / 50) * (1 - 0.8 * i / nb);
                                render.copyPixels(textureBD, rect, pt );
                        }
                       
                       
                }
        }

}
 

J'ai testé le tien, mais à vrai dire je n'ai pas vu de différence avec avant (ça tourne toujours à 40-41 chez moi).

#35 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 09 November 2011 - 18:48 PM

Salut tlecoz,

Ton code tourne à 6-7fps chez moi.

Voir le messagetlecoz, le 09 November 2011 - 15:49 PM, dit :

J'ai testé le tien, mais à vrai dire je n'ai pas vu de différence avec avant (ça tourne toujours à 40-41 chez moi).
Heu... hein?
Mon code n'est pas plus optimisé maintenant, donc c'est normal que tu ne vois pas de différence :P . Ce que je te proposais c'était de te le tester selon les différents modes, pour avoir exactement le même code qui utilise soit stage3d, soit copypixels, soit draw.



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)