2010-06-25 4 views
2

Je veux créer un simple moteur de rendu vidéo pour jouer, et faire des choses comme créer ce qui serait un système d'exploitation mobile juste pour le plaisir. Mon père m'a dit que dans les tout premiers ordinateurs, vous éditiez une adresse de mémoire spécifique et l'écran se mettait à jour. Je voudrais simuler cela dans une fenêtre de Windows. Est-ce que je peux faire ça avec C#?Comment puis-je modifier des pixels individuels dans une fenêtre?

Répondre

2

Il est un sujet complet qui est en dehors de la portée (elle ne convient pas, pas que je ne divaguer pendant des heures :-) de ce answer..but cela devrait vous aider à démarrer avec le dessin en C#

http://www.geekpedia.com/tutorial50_Drawing-with-Csharp.html

les choses ont un peu des vieux jours de la mémoire directe manipulation..although tout est toujours lié aux pixels.

Editer: Oh, et si vous rencontrez des problèmes de scintillement et que vous êtes bloqué, envoyez-moi une ligne et je vous enverrai un panneau DoubleBuffered pour peindre.

+0

Dans WinForms> v2.0, la double mise en mémoire tampon peut être activée avec le paramètre de la propriété DoubleBuffered: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered. aspx. – codekaizen

+0

Mais pas sur un panneau ou un contrôle géré: -D Allez-y et essayez-le .. il ignore activement votre tentative parce que la propriété DoubleBuffered est une valeur protégée. – Caladain

+0

Droite. Je suppose que j'ai oublié car il est si facile de simplement sous-classer le panneau et de définir cette propriété dans le constructeur. En tout cas, DoubleBuffered est juste un raccourci pour définir le style de contrôle à ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, donc alternativement vous pouvez simplement appeler SetStyle() avec cette valeur. – codekaizen

4

Ceci était fait parce que vous pouviez avoir un accès direct au tampon vidéo. Ceci n'est généralement pas disponible avec les systèmes actuels, car la mémoire vidéo est gérée par le pilote vidéo et le système d'exploitation. De plus, il n'y a vraiment pas de mappage 1: 1 du tampon de mémoire vidéo et ce qui est affiché plus. Avec autant de mémoire disponible, il est devenu possible d'avoir plusieurs tampons et de basculer entre eux. Le tampon actuellement affiché est appelé "tampon avant" et les autres tampons non affichés sont appelés "tampons arrière" (pour plus d'informations, voir http://en.wikipedia.org/wiki/Multiple_buffering). Nous écrivons généralement à des tampons arrières et ensuite le système vidéo met à jour le tampon avant pour nous. Cela fournit des mises à jour régulières, car le pilote vidéo synchronise la mise à jour avec la fréquence de balayage du moniteur.

Pour écrire en arrière tampons en utilisant C#, ma technique préférée est d'utiliser le WPF WritableBitmap. J'ai également utilisé le System.Drawing.Bitmap pour mettre à jour l'écran en y écrivant des pixels via LockBits.

+0

Bien que je sois sûr que c'est une meilleure solution, je ne comprends pas complètement le code et me connaissant, je gâcherais beaucoup de temps avec du code non managé: D –

+0

@Daniel - ce n'est pas un code non géré ... dangereux, bien sûr, mais il n'y a pas vraiment d'autre moyen de le faire rapidement. Vous pouvez utiliser GetPixel/SetPixel, mais vous ne pouvez pas avoir rapide. ;) – codekaizen

Questions connexes