5

我有一个本机 Delphi TFrame,它模拟 Roy Tanck 的 Cumulus Tag Cloud 查看器,一个 WordPress Flash 插件。该插件所做的是创建一个在“虚拟”球体表面上旋转的 3D 文字球体。你可以在这里看到它的实际效果:

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

在我的应用程序结构中,每个单词都有自己的 TBitmap,为了渲染球体,我将所有单词的位图打印到临时 TBitmap,然后将临时 TBitmap 的 BitBlt() 打印到可见 TPaintBox 的画布上。渲染操作发生在每 50 毫秒发生一次的 TTimer 计时器事件上。

然而,无论我如何努力,文字的移动都会出现明显的“抖动”,尤其是与 Flash 播放器的丝般流畅的移动相比。我认为提高帧速率可能会有所帮助,我什至尝试使用多媒体计时器,由于 MM 计时器的多线程特性,该计时器每 10 毫秒更新一次,并正确锁定和解锁所有画布。还是很慌张。我唯一能想到的是,我所做的计算会导致每个单词呈现离散的像素位置,这会导致抖动。相比之下,这是假设,也许 Flash 可能会进行抖动以促进“像素之间”渲染,或者可能会实时进行抗锯齿,这就是它不抖动的原因?

无论如何,是否有可能使用本机 Delphi 代码获得我正在寻找的丝般平滑的运动?还是唯一的方法就是一直使用 Direct3D 或 OpenGL 解决方案?如果这是一场失败的战斗,我不想浪费时间把这东西弄死。另一方面,如果您有任何建议,我很想听听。我的猜测是,如果我必须走 Direct3D/OpenGL 路线,这是一项艰巨的工作和学习曲线,所以如果我能找到一种方法在本机 Delphi 代码中完成这项工作,我会喜欢的。

后续编辑:打印到更大的“虚拟”位图,然后使用此处给出的重新采样方法有助于将“向下”打印到实际可见的画布上吗?:

在 Delphi 中很好地缩放图像?

4

2 回答 2

2

我用 Delphi 写过很多游戏。这当然是可行的。有很多事情需要注意。

您不仅需要定期触发事件,还需要根据轮询时间检查事件到达和移动的时间,而不是根据预期的等待时间来假设时间。

如果需要不依赖 GPU 的亚像素精度,我会推荐Antigrain Geometry或者它是 Delphi 的 Pascal 表亲AGGPAS

动画字体可能有一个额外的问题,即字体渲染通常包含确保细笔画出现在像素边界上的逻辑。移动以这种方式呈现的文本可以改变外观,因为不同的笔划可以从与一个像素对齐跳到下一个像素。

如果字体被渲染为像素对齐,那么将渲染量化为整数可能会更好。它仍然会与像素对齐,但通过一次移动一个像素应该使其每次都保持一致。

于 2012-01-30T00:46:39.123 回答
1

恕我直言,正确的方法是 Direct3D(或 OpenGL,但鉴于 Delphi 仅是 Windows,也许 Direct3D 更好)。之所以引入它,正是因为 GDI 不擅长此类任务。Flash 支持矢量和光栅图形,因此可以比旧的普通 GDI 更好地处理此类应用程序。

于 2010-10-10T13:05:40.150 回答