我和我的朋友正试图用OpenGL加速2D游戏。视频芯片组是Radeon X1250,似乎动力不足,可以显示多达80个1366x768全帧/秒。鉴于我们正在吸引许多精灵,在我们瞄准的60 FPS下,性能大幅下降。您能否提供使用OpenGL快速渲染2D的优化技巧?
编辑:一些澄清: 开发在Linux下的C ++中进行。我们用SDL做到了,但性能不尽如人意,所以我们决定切换到OpenGL,事实证明要快得多,当然还有一个推动实现更多功能,要求我们每帧重绘整个屏幕。
我们的测试程序在1366x768屏幕上呈现纹理化的256x256四元图块。如果在缓冲交换之前铺设单层瓷砖,则产生80 FPS,如果两层铺设的帧速率低于60 FPS。鉴于董事会将被要求同时解码和渲染一些小型MPEG,这可能是不能令人满意的。
我只是认为我可以通过游戏是2D来寻找优化 - 我想到了,例如: 1)如果可以禁用纹理缩放。 2)直接渲染到帧缓冲区(虽然我们听说glDrawPixels应该很慢。
答案 0 :(得分:4)
与往常一样,如果您指定了目标OpenGL的版本,则可以更轻松地获得更精确的答案。似乎这是StackOverflow上大多数与OpenGL相关的问题所缺少的。
如果将大量每顶点数据上传到服务器,请确保将顶点数据存储在缓冲区对象中。切勿使用即时模式,即 glBegin
/ glEnd
对。而是使用 glDrawArrays
, glDrawElements
或其他数组绘制调用。这已经带来了极大的性能提升。
透支本身并不慢,但确实无缘无故地燃烧填充物。但是遮挡剔除通常不值得初始性能设置成本。并且每片段混合会消耗很多填充物。
如果这些提示无效,我建议您检查您的应用程序是否真的受GPU限制。我有疑虑。瓶颈可能在其他地方。也许你的X visual / FBConfig不是硬件加速的?
答案 1 :(得分:4)
听起来你正在反对卡的最大填充率,再加上你正在进行混合,因此需要读取和写入。
如果你过度抽取帧缓冲区(特别是在高分辨率下),那么你最终会降低帧速率,因为卡的填充率有限制。
虽然现代卡可以进行大量操作,但它们仍然可以限制推动的像素数。
为了减少这个,一些建议是:
如果你这样做是为了获得一些时髦的烟雾/粒子效果,你可能无法使用所有或许多这些优化。
答案 2 :(得分:2)
OpenGL的设计速度很快,但可以编写它以使其性能较差。
有太多未知数可以提供很多帮助。例如,您正在使用哪种语言(我猜C ++),或者您自己编写了哪种框架?
您重新创建了多少屏幕?例如,您是否重新生成每个对象而不仅仅是翻译它们?
您可能会发现有用的问题:What are some best practices for OpenGL coding (esp. w.r.t. object orientation)?
如果您可以提供一些您已经分析过的示例,以确定减速的位置,那将会有所帮助。
如果您刚刚使用了线框,没有填充或纹理,那么您的表现如何?
你的游戏循环是什么样的?例如,是否与鼠标或键盘有任何交互,这种逻辑会影响帧速率吗?
我有一个问题,我正在重绘70fps,但我的音乐没有开始或以正确的毫秒结束,因此,我将循环更改为仅30fps并增加处理音乐的频率,以及我的表现有所增加。
答案 3 :(得分:2)
一个优化方法是从前到后绘制图层(虽然这确实没有透明度),启用Z-Buffering并利用早期Z功能。
但其他评论是正确的。用这么少的信息不可能说你怎么能加快速度......
答案 4 :(得分:1)
你确定渲染是一个问题,还是你有渲染的逻辑? OpenGL中的性能优化是一个非常重要的主题,所以我只是指向一个资源。