我有一个本机 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 代码中完成这项工作,我会喜欢的。
后续编辑:打印到更大的“虚拟”位图,然后使用此处给出的重新采样方法有助于将“向下”打印到实际可见的画布上吗?: