SDL加速渲染

4
我正在尝试使用SDL 2.0了解整个2D加速渲染过程。那么我的问题是,在屏幕上绘制圆形的最有效方法是什么,以及为什么是这样?
有一些方法可以实现:
1. 首先创建一个软件表面,然后在该表面上绘制必要的像素,然后将该表面创建为纹理,最后将该纹理复制到渲染目标中。
2. 另一种实现方式是使用多次SDL_RenderDrawLine绘制圆形。我认为这就是SDL 2.0 gfx中实现的方式。
还有更有效的方法吗?
总的来说,如果我想手动绘制其他形状,而这些形状可能无法轻松地使用SDL提供的2D渲染API(如绘制线条或矩形)进行渲染,应该怎么做?
1个回答

1
使用圆形作为例子时,这是一个相当复杂的问题,更多地基于您希望实现的视觉效果,这将推动性能。绘制许多短线将根据您希望接近圆形的程度而大不相同,如果您愿意使用例如60条线,这将在小形状上几乎无缝地工作,但如果缩放则开始出现不是圆形的情况,性能可能会更好(取决于用户的硬件)。请注意,SDL_RenderDrawLines对于许多线条来说要快得多,因为它避免了渲染调用的许多上下文切换。

然而,如果您需要非常精确的圆形,并且需要数千条线才能获得良好的近似值,则直接使用位图并进行缩放和混合处理会更快。这也会给您带来“更平滑”的感觉。

就我个人而言,我认为硬件加速的渲染API除了一些特殊用途(如图形渲染和可能非常简单的GUI绘图)之外没有太多用处。对于任何更复杂的内容,我通常会使用基于位图的绘图。

关于第二部分,这还取决于您需要绘制的任何弧线的准确度。如果您可以轻松地将形状近似为几十条线,则速度会快,否则像素方法更好。


当我们使用线条绘制方法在屏幕上画圆时,实际上我们是通过仅绘制水平线来完成的,对吧? 因此,对于高度为600像素的圆形,无论您想要多么准确地绘制它,只需要绘制600个线条即可(其中许多实际上也可以绘制成矩形)。 我认为精度问题出现在您决定在何处绘制线条的起点和终点(始终在水平轴上)的时候。 同样的逻辑也适用于表面。 - Lan Pac
@LanPac 啊,我没有意识到你一直在指未纹理填充的圆。我以为你是指空心的。然而,如果是这样,从性能上来说,无论哪种方式都几乎没有什么区别。唯一的区别将是效果,位图将允许您使用平滑或子像素渲染实现抗锯齿外观,线条绘制将更加清晰,性能差异很小。 - Vality
感谢您的回复。 通常位图会更快。 但我的问题在于我想在运行时绘制各种形状。(不使用位图) - Lan Pac
@LanPac 啊,我明白了。在这种情况下,线性系统将起作用,尽管我敢打赌每像素和每行构建速度会相当接近。谢谢。 - Vality

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接