使用OpenGL的性能水平较低

Low preformance levels with OpenGL

本文关键字:水平 性能 OpenGL 使用      更新时间:2023-10-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等。

有什么办法能让它更快吗?谢谢!

有了这些代码,你可以使用glBegin(GL_TRIANGLE_STRIP)并摆脱大约一半的gl调用。

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

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

这样想。你有18个数字。你有多少种排列方法?什么时候可以从这两个顺序之间的位置开始,还记得你们见过的这个吗,然后开始相同的顺序?试试连续3次。然后是4,然后是5,等等