OpenGL 的低性能水平

Posted

技术标签:

【中文标题】OpenGL 的低性能水平【英文标题】:Low preformance levels with OpenGL 【发布时间】:2015-10-24 02:30:16 【问题描述】:

我的 OpenGL 项目的性能水平明显较低,有时速度慢到足以使应用程序崩溃。它每秒运行大约 1 帧,但我更喜欢 20 帧,或者如果可能的话,我更喜欢 60 帧。所以我的程序所做的是,它需要一个位图文件,从一个像素中获取红色、绿色和蓝色,将相同颜色的像素存储在 HDC 中,重置坐标等,直到完成所有像素并将其打印到屏幕上。

这是我的代码:

#include "bitmap_image.h"
#include <windows.h>
#include <gl/gl.h>
#include <iostream>
using namespace std;
HDC Image(HDC hDC, string File_Name, int x_position, int y_position, int length, int height)

File_Name = "C:/Users/David/Pictures/" + File_Name + ".bmp";    
bitmap_image image(File_Name);      // Open the bitmap
unsigned char red;
unsigned char green;
unsigned char blue;
restart:
image.get_pixel(x_position, y_position, red, green, blue);     // Get the red green and blue from x_position and y_position and     store it in red green and blue. 
glBegin (GL_TRIANGLES);                                        // Make a pixel at x_position and y_position with red green and blue.
glColor3ub (red, green, blue);
glVertex2f (-1 + 0.0015 * x_position, 1 - 0.003 * y_position);
glVertex2f (-1 + 0.0015 * x_position, 0.997 - 0.003 * y_position);
glVertex2f (-0.9985 + 0.0015 * x_position, 1 - 0.003 * y_position);
glEnd();
glBegin (GL_TRIANGLES);
glColor3ub (red, green, blue);
glVertex2f (-1 + 0.0015 * x_position, 0.997 - 0.003 * y_position);
glVertex2f (-0.9985 + 0.0015 * x_position, 1 - 0.003 * y_position);
glVertex2f (-0.9985 + 0.0015 * x_position, 0.997 - 0.003 * y_position);
glEnd();
if (x_position==length)      // If x_position equals to length of bmp set x_position to 0 and add 1 to y_position.

if (y_position==height)      // If bmp is done loading go to done.

goto done;

x_position = 0;
y_position = y_position + 1;

x_position = x_position + 1;
goto restart;
done:         
return hDC;           


void Load_Image(HDC hDC)

SwapBuffers(hDC);                                  // Load the image


int main()

int x = 0;                                                                                                    
int y = 500;
HDC River = Image(hDC, "River", 0, 0, 1340, 678);                // make the river
HDC Turtle_1 = Image(River, "Turtle", x, y, 95, 65);            // make the turtle 10 pixels away on the river
x = x + 10;                                                                                              // push the turtle 10 more pixels
HDC Turtle_2 = Image(River, "Turtle", x, y, 95, 65);            // make the turtle 20 pixels away on the river
x = x + 10;                                                                                              // and so on... 
HDC Turtle_3 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_4 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_5 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_6 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_7 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_8 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_9 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_10 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_11 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_12 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_13 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_14 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_15 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_16 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_17 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_18 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_19 = Image(River, "Turtle", x, y, 95, 65);
x = x + 10;
HDC Turtle_20 = Image(River, "Turtle", x, y, 95, 65);
Load_Image(Turtle_1);               // Load the images to make the video
Load_Image(Turtle_2);
Load_Image(Turtle_3);                                                               
Load_Image(Turtle_4);
Load_Image(Turtle_5);
Load_Image(Turtle_6);
Load_Image(Turtle_7);
Load_Image(Turtle_8);
Load_Image(Turtle_9);
Load_Image(Turtle_10);
Load_Image(Turtle_11);
Load_Image(Turtle_12);
Load_Image(Turtle_13);
Load_Image(Turtle_14);
Load_Image(Turtle_15);
Load_Image(Turtle_16);
Load_Image(Turtle_17);
Load_Image(Turtle_18);
Load_Image(Turtle_19);
Load_Image(Turtle_20);

关于代码的注释#1:您可以在http://partow.net/programming/bitmap/找到bitmap_image.h

关于代码的注释 #2:我省略了 OpenGL 函数,例如:EnableOpenGL、DisableOpenGL 等。

有什么解决方案可以让它更快吗?谢谢!

【问题讨论】:

【参考方案1】:

使用该代码,您可以使用 glBegin(GL_TRIANGLE_STRIP) 并摆脱大约一半的 gl 调用。

但是为什么要处理位图的单个像素而不是将该位图设置为纹理并让视频硬件完成所有工作?

【讨论】:

我正在从一个文件中加载一个位图,但到目前为止我还没有找到适用于此的教程。如果你认为这是我应该做的,我会怎么做? @wdt12 你最终会想要使用glTexImage2D,但是还有很多其他的 gl 调用来支持它。 还有一个问题:当我尝试编译它时,我得到了这个错误 - 无法将参数 '2' 的 'std::string' 转换为 'GLuint aka unsigned int' 到 'void glBindTexture( GLenum, GLuint)' 我需要用某种方式输入文件名吗?我正在尝试从使用 MS Paint 制作的 24 位位图加载它。 @wdt12 有一系列的步骤来加载纹理并设置它并准备好使用。请咨询 www.opengl.org。【参考方案2】:

预加载图像,并使用 valarray() 引导自己并使用 AI,通过 gsplice() 以保守的顺序添加位图,其中最慢的 fps 来自非预格式化的动作会更快。

这样想。你有 18 个号码。你有多少种方法可以把它们排列好?你什么时候可以从这些订单之间的位置开始,记住你已经看过这个,然后开始同样的顺序?连续尝试 3 次。然后是 4,然后是 5,以此类推。

【讨论】:

我不太明白你在说什么……你能给我一些代码示例吗?

以上是关于OpenGL 的低性能水平的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:四边形似乎没有正确剔除

OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?

为啥没有实现 OpenGL 灰度纹理性能增益?

OpenGL 调试上下文性能警告

糟糕的 OpenCL ImageSampling 性能与 OpenGL TextureSampling

OpenGL:Quads似乎没有被正确淘汰