我有一个本地的Delphi,它模仿了Roy Tanck的Cumulus Tag Cloud查看器,这是一个WordPress TFrame插件。该插件所做的是创建一个3D单词球体,它在“虚拟”球体的表面上旋转。你可以在这里看到它的实际效果:
http://www.roytanck.com/2008/03/06/wordpress-plugin-wp-cumulus-flash-based-tag-cloud/
在我的应用程序结构中,每个单词都有自己的TBitmap,为了呈现球体,我将所有单词的位图打印到一个临时TBitmap,然后将这个临时TBitmap ()输出到一个可见TPaintBox的画布上。渲染操作发生在每50毫秒发生一次的TTimer计时器事件上。
然而,无论我怎么努力,单词的移动都会有明显的“抖动”,特别是与Flash播放器柔滑流畅的移动相比。我认为增加帧速率可能会有所帮助,我甚至尝试使用多媒体计时器,由于MM计时器的多线程特性,该计时器每10毫秒更新一次,对所有画布进行适当的锁定和解锁。还是很紧张。我能想到的唯一一件事是,我所做的计算导致每个单词呈现时的离散像素位置,这会导致抖动。相反,这是假设,也许Flash可能会抖动来促进“像素之间”的渲染,或者可能会实时抗锯齿,这就是为什么它不会抖动?
在任何情况下,有没有可能使用本地Delphi代码获得我正在寻找的柔滑的运动?或者,唯一的方法是一直使用Direct3D或OpenGL解决方案?如果这是一场失败的战斗,我不想浪费时间去调整这个东西。另一方面,如果你有什么建议,我很乐意听听。我的猜测是,如果我必须走Direct3D/OpenGL路线,那将是一项艰巨的工作和学习曲线,所以如果我能找到一种用原生Delphi代码完成这项工作的方法,我会很高兴的。
后续编辑:打印到一个更大的“虚拟”位图,然后使用这里给出的重采样方法,是否有助于将“向下”打印到实际可见的画布?:
发布于 2012-01-30 08:46:39
我已经用Delphi写了很多游戏。这当然是可行的。有很多东西需要注意。
您不仅需要定期触发事件,还需要检查事件到达的时间,并根据轮询时间移动,而不是根据预期的等待时间假设时间。
如果需要不依赖图形处理器的亚像素精度,我会推荐Antigrain Geometry或它的Pascal表亲AGGPAS for Delphi。
动画字体可能有一个额外的问题,即字体呈现通常包含确保在像素边界上出现细笔画的逻辑。移动以这种方式呈现的文本可能会更改外观,因为不同的笔划可能会从一个像素对齐到下一个像素。
如果字体呈现为像素对齐,那么量化呈现为整数可能会管理得更好。它仍然会与像素对齐,但通过一次移动一个像素,应该可以使它每次都保持一致。
发布于 2010-10-10 21:05:40
我认为正确的方法是Direct3D (或者OpenGL,但考虑到Delphi只有Windows,也许Direct3D更好)。它的引入正是因为GDI不擅长这样的任务。Flash既支持矢量图形,又支持光栅图形,因此可以比旧的普通GDI更好地处理这类应用程序。
https://stackoverflow.com/questions/3898771
复制相似问题