2010-10-10 33 views
5

J'ai un TFrame Delphi natif qui émule la visionneuse Cumulus Tag Cloud de Roy Tanck, un plug-in Flash WordPress. Ce que fait ce plug-in est de créer une sphère de mots 3D qui tournent sur la surface d'une sphère "virtuelle". Vous pouvez le voir en action ici:Delphi 6: Delphi natif peut-il créer des graphiques fluides comme Flash?

http://www.roytanck.com/2008/03/06/wordpress-plugin-wp-cumulus-flash-based-tag-cloud/

Dans ma structure d'application chaque mot a son propre TBitmap et de rendre la sphère imprimer à un TBitmap temporaire tous les bitmaps est le mot, puis BitBlt() que TBitmap temporaire sur le Canvas d'un TPaintBox visible. L'opération de rendu se produit sur un événement de temporisateur TTimer qui se produit toutes les 50 millisecondes.

Cependant, peu importe combien j'essaie, il y a une "gigue" notable dans le mouvement des mots, en particulier par rapport au mouvement doux et soyeux du lecteur Flash. Je pensais que l'augmentation de la fréquence d'images pouvait aider et j'ai même essayé d'utiliser un minuteur multimédia mis à jour toutes les 10 millisecondes avec un verrouillage et un déverrouillage corrects de tous les Canvas en raison de la nature multithread du MM timer. Toujours nerveux. La seule chose que je peux comprendre est que les calculs que je fais aboutissent à des emplacements de pixels discrets pour chaque mot à restituer et qui provoquent la gigue. En revanche, et c'est une supposition, peut-être que Flash fait un tramage pour faciliter le rendu "entre pixels" ou peut-être l'anti-aliasing en temps réel et c'est pourquoi ça ne gigue pas?

Dans tous les cas, est-il possible d'obtenir le mouvement soyeux que je recherche en utilisant le code Delphi natif? Ou est-ce que la seule façon de le faire est d'aller jusqu'à quelque chose comme une solution Direct3D ou OpenGL? Je ne veux pas perdre de temps à peaufiner cette chose à mort si c'est une bataille perdue. D'un autre côté, si vous avez des conseils, j'aimerais les entendre. Je suppose que si je dois aller sur la route Direct3D/OpenGL c'est un gros travail et une courbe d'apprentissage, donc si je pouvais trouver un moyen de faire cela en code Delphi natif, j'aimerais beaucoup.

SUIVI EDIT: Est-ce l'impression d'une image bitmap « virtuelle » beaucoup plus grande et en utilisant une méthode de ré-échantillonnage comme celle donnée ici l'aide d'imprimer « vers le bas » au visible en toile ?: réelle

Scale an image nicely in Delphi?

+0

Avez-vous sur DoubleBuffering, AllPaintingInWmPaint, SupportsTransparentBackColor et UserPaint? En les utilisant lorsque vous effectuez un rendu GDI sur un formulaire, vous évitez les scintillements. – Nowayz

+0

Nowayz. Je n'ai pas de scintillement. La gigue est positionnelle, pas due à des repeints. –

+0

La réponse est définitivement oui. Mais si vous voulez des graphismes 3D vraiment fluides, le CPU n'est pas assez rapide. Vous devez utiliser le GPU, en utilisant OpenGL. –

Répondre

2

J'ai écrit un certain nombre de jeux en Delphi. C'est certainement faisable. Il y a un certain nombre de choses à surveiller.

Non seulement vous devez déclencher un événement régulièrement, mais également vérifier l'heure à laquelle il arrive et se déplacer en fonction de l'heure d'interrogation plutôt que d'assumer l'heure en fonction de la période d'attente attendue.

Si la précision du sous-pixel sans dépendance GPU est nécessaire, je recommanderais Antigrain Geometry ou son cousin Pascal AGGPAS pour Delphi.

Les polices d'animation peuvent présenter un problème supplémentaire car le rendu des polices contient souvent une logique qui permet de s'assurer que les traits fins apparaissent sur les limites des pixels. Le déplacement de texte rendu de cette manière peut changer d'aspect car différents traits peuvent sauter d'être alignés d'un pixel à l'autre.

Si la police est rendue alignée sur les pixels, elle serait peut-être mieux gérée si vous quantifiez le rendu en nombres entiers. Il sera toujours aligné sur les pixels, mais en déplaçant un pixel à la fois devrait le faire de manière cohérente à chaque fois.

+0

Je crois qu'une police GDI avec 'ANTIALIASED_QUALITY' (http://msdn.microsoft.com/en-us/library/dd183499 (v = vs.85) .aspx) ne sera pas" ajustée à la grille ", évitant le * "caractères rebondissants" * problème. –

1

À mon humble avis le chemin à suivre est Direct3D (ou OpenGL, mais étant donné que Delphi est Windows seulement peut-être que Direct3D est mieux). Il a été introduit exactement parce que le GDI n'est pas bon à de telles tâches. Flash prend en charge à la fois les graphiques vectoriels et raster, et peut ainsi mieux gérer ce type d'application que le GDI ordinaire.

+1

L'écriture d'une application OpenGL Delphi est très simple, car il existe une unité OpenGL.pas. L'écriture d'une application DirectX Delphi n'est pas si simple. –

+0

Mon expérience avec Direct3D est que quand ça marche c'est génial mais quand tu as un problème, surtout à cause d'un problème de codec quelque part dans la chaîne de filtre, la vie peut devenir très douloureuse très rapidement. C'est pourquoi je travaille si dur pour l'éviter. Je n'ai pas encore fatigué OpenGL et je veux vraiment le faire. –

+0

Je voulais simplement dire qu'étant DirectX la plate-forme graphique native native de Windows, il a un meilleur support. MS a montré qu'ils "n'aiment pas" OpenGL autant que –