代码之家  ›  专栏  ›  技术社区  ›  futlib

处理整数位置时如何避免抖动?

  •  1
  • futlib  · 技术社区  · 11 年前

    我正在使用SDL制作2D游戏。有一件事一直困扰着我,那就是当相机缓慢移动时,所有的物体都会相对抖动。

    这是因为SDL不支持亚像素定位,我必须使用整数在屏幕上定位。

    这是一个问题的快速示例,以防它还不明显。假设我有一个侧滚游戏,每个实体只有一个x位置:

    实体职位:

    friend.x = 0.1
    foe.x = 0.3
    

    渲染内容:

    friend.x = 0
    foe.x = 0
    

    现在假设相机向左移动 0.2 :

    实体职位:

    friend.x = 0.1 + 0.2 = 0.3
    foe.x = 0.3 + 0.2 = 0.5
    

    渲染内容:

    friend.x = 0
    foe.x = 1
    

    在那里,它抖动。两者都应该移动得很小,但呈现的是 friend 根本没动,而且 foe 向右跳了整整一个像素。当相机移动另一个时 0.2 向左, 朋友 会跳 敌人 将保持静止。不幸的是,在低速行驶的情况下,它实际上非常明显。

    缓解这一问题的最简单方法似乎是在内部使用整数位置,但我无法真正让它在我的游戏中发挥作用,只是在物理方面不太好。我在绝望中尝试了各种舍入方法,但这在实践中似乎没有任何改变。四舍五入时仍有这个跳跃点。

    那么,我能做些什么来减少抖动吗?假设我被两个浮点位置卡住了,并且在渲染时必须处理整数?

    1 回复  |  直到 11 年前
        1
  •  2
  •   keltar    11 年前

    SDL不应受到指责——监视器不支持亚像素位置,因为,嘿, 像素 释义在一些罕见的情况下,您可以单独使用像素组件(点),但这需要了解实际显示器(不同显示器的不同颜色顺序,如RGB、BGR、垂直RGB等);这就是亚像素字体抗锯齿的工作原理。但字体只是一种颜色,在实际图像上会产生疯狂的结果。

    我认为唯一适当的解决方案是提高分辨率。监视器的分辨率,或者通过将图像渲染为更高分辨率的渲染目标,然后通过一些过滤将其降采样回监视器分辨率。