Graphics 使用整数位置时如何避免抖动?

Graphics 使用整数位置时如何避免抖动?,graphics,2d,sdl,Graphics,2d,Sdl,我正在用SDL做一个2D游戏。有一件事一直困扰着我,那就是当相机缓慢移动时,所有的物体都会相互抖动 这是因为SDL不支持亚像素定位,我必须使用整数来定位屏幕上的东西 这里有一个问题的快速示例,以防它还不明显。假设我有一个侧面滚动游戏,其中每个实体只有一个x位置: 实体位置: friend.x = 0.1 foe.x = 0.3 friend.x = 0 foe.x = 0 friend.x = 0.1 + 0.2 = 0.3 foe.x = 0.3 + 0.2 = 0.5 friend.x

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

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

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

实体位置:

friend.x = 0.1
foe.x = 0.3
friend.x = 0
foe.x = 0
friend.x = 0.1 + 0.2 = 0.3
foe.x = 0.3 + 0.2 = 0.5
friend.x = 0
foe.x = 1
呈现的内容:

friend.x = 0.1
foe.x = 0.3
friend.x = 0
foe.x = 0
friend.x = 0.1 + 0.2 = 0.3
foe.x = 0.3 + 0.2 = 0.5
friend.x = 0
foe.x = 1
现在让我们假设相机向左移动了
0.2

实体位置:

friend.x = 0.1
foe.x = 0.3
friend.x = 0
foe.x = 0
friend.x = 0.1 + 0.2 = 0.3
foe.x = 0.3 + 0.2 = 0.5
friend.x = 0
foe.x = 1
呈现的内容:

friend.x = 0.1
foe.x = 0.3
friend.x = 0
foe.x = 0
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
时,
friend
将跳转,而
foe
将保持静止。不幸的是,在实践中,在低速时,这是非常明显的

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


那么,我能做些什么来减少抖动呢?假设我在渲染时同时使用浮点位置和整数?

SDL不是罪魁祸首-监视器不支持亚像素位置,因为,嘿,像素定义。在某些罕见的情况下,您可以单独使用像素组件(点),但这需要了解实际显示器(不同显示器的不同颜色顺序,如RGB、BGR、垂直RGB等);这就是亚像素字体反序列化的工作原理。但字体只是一种颜色,在实际图像上它会产生疯狂的结果


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

接受此选项后,我找到了一个巧妙的解决方法:只需确保以相同速度移动的所有实体位置的分数部分是相同的。我所做的:1)级别定义文件中的所有位置现在都是整数。2) 停止移动的实体将捕捉回像素位置。3) 附着到其他实体的实体将其分数部分设置为其他实体的分数部分。很好!