7
votes

Comment dessiner 2D pixel-by-pixel à XNA?

J'essaie de dessiner sur l'écran pixel-by-pixel à l'aide de XNA, mais j'ai des problèmes de ressources. Je pensais que le meilleur moyen serait d'avoir 1 texture qui met à jour chaque image, mais j'ai du mal à la mettre à jour. Voici ce que j'ai jusqu'à présent, tout comme un test: xxx

lorsque le dessin () est appelé la deuxième fois, je reçois l'erreur suivante:

"Le L'opération a été abandonnée. Vous ne pouvez pas modifier une ressource définie sur un périphérique ou après avoir été utilisée dans un support de carrelage. "

Si j'essaie de faire une nouvelle texture2D à Draw (), Je reçois rapidement une erreur de mémoire de mémoire. Ceci est pour Windows Phone. Il semble que j'essaie de le faire dans le mauvais sens, quelles autres options dois-je faire fonctionner?


2 commentaires

Je ne connaissais pas la réponse alors j'ai googlé "Texture procédurale XNA" (qui est ce que ce genre de chose est appelé). Il ne semble pas y avoir de manière simple et intégrée de faire cela. Il y a au moins trois suggestions communes (tampon, commandes de texture GPU, le faire dans un shader). Le dernier est évidemment optimal, mais nécessite des connaissances de programmation de shader. Vous voudrez peut-être effectuer la même recherche et parcourir ce qui est là-bas.


Pour que les personnes cherchent à dessiner sur les textures 2D de la mouche pixel-by-pixel, il a été répondu ici Stackoverflow.com/Questions/70022699/...


3 Réponses :


6
votes

Essayez le réglage graphiquesDevice.textures [0] = null avant d'appeler setData. En fonction de l'effet que vous trouverez peut-être une méthode plus performante, vous pouvez également envisager Silverlights WriteOeticBitmap.

Edit: Ceci est le code que j'ai testé dans l'émulateur: xxx


1 commentaires

Merci beaucoup, je l'ai eu pour travailler de votre exemple. Je pense que la première fois que je l'ai essayée, j'ai peut-être pu me procurer une texture2D dans le tirage ().



3
votes

Vous devez essentiellement faire comme indiqué à l'exception:

Pour vous assurer que la texture n'est pas définie sur le périphérique graphique, mettez ceci à la fin de Draw code>: P>

GraphicsDevice.Textures[0] = null;


0 commentaires

1
votes

Ne crée jamais ou ne modifie jamais une texture dans Draw () **. **

L'appel Spritbatch.Draw () s'attend à ce que le tampon graphiqueDevice contienne toutes les données de texture (par extension du tampon GPU), les modifications qui se produisent toujours (à partir de la mise à jour et de l'ISRUNNINGSLOWLY == True) à ce stade entraînera une déchirure lorsque rendu.

La solution de contournement de graphiquesDevice.textures [0] = null; bloque l'appel de dessin et le jeu jusqu'à ce que le transfert sur le GPU soit terminé, ralentit ainsi la boucle de jeu entière.

Réutilisez un objet Texure2D déclaré au niveau de la classe.


0 commentaires