奇怪的performance像素3Dgraphics程序

所以我使用Allegro 4库在C ++中编写了一个简单的3dgraphics化程序。 我以最简单的方式,逐个像素地绘制。 通常情况下,将单个像素放在屏幕上的速度非常慢,因为Allegro的工作原理和绘制640×480分辨率的graphics,我必须等待一两分钟。

所以我正在为我的好友渲染一个图像,所以我拖着窗户四周有一个很好的截图,我发现通过拖动窗口的渲染图片,只要我拿着窗户,它大大加快速度。 从2分钟,它在10秒内吸取所有的东西。

什么是这种bizzare行为的原因? 它是与Windows的窗户有关还是由Allegro本身造成的? 这有什么解释吗?

截图

在Allegro中使用Qt Creator

编译器检测到allegro.h,但不是allegro_primitives.h

食人魔和快板direct3d设备9冲突

在C ++中渲染vectorgraphics(.svg)

C / C ++ Allegro程序导致Windows 7切换到Aero Basic

也是我的代码

#include <allegro.h> #include <iostream> #include <math.h> using namespace std; float MAX_Z = 1; float MIN_Z =-1; float SCALE =50; inline void init(unsigned int width,unsigned int height) { allegro_init(); set_color_depth(24); set_gfx_mode(GFX_AUTODETECT_WINDOWED,width,height,0); install_timer(); install_keyboard(); install_mouse(); } inline void deinit() { clear_keybuf(); allegro_exit(); } int get_z_color (float z) { if (z >= 0) { return makecol(255,(z/MAX_Z)*255,(z/MAX_Z)*255); } else { return makecol(255 - (z/MIN_Z)*255,0); } } float get_z (float x,float y) { return sin(sqrt(pow(x,2)+pow(y,2))); } float int_to_float (int a) { return a; } int main() { unsigned int res_width,res_height; cout << "Window size (W,H): "; cin >> res_width >> res_height; cout << endl << "Initiating in " << res_width << "x" << res_height << " resolution..." << endl; init(res_width,res_height); cout << "Success! Drawing graph..." << endl; for (int y=0; y<res_height; y++) { for (int x=0; x<res_width; x++) { float valued_x = (int_to_float(x)-(int_to_float(res_width)/2))/SCALE; float valued_y = (int_to_float(-y)+(int_to_float(res_height)/2))/SCALE; _putpixel24(screen,x,y,get_z_color(get_z(valued_x,valued_y))); //cout << "Drawing (" << valued_x << "," << valued_y << ")" << endl; } } cout << "Graph drawn." << endl; cin >> new char; cout << "Closing..."; deinit(); return 0; } END_OF_MAIN()

在屏幕表面绘制,无论使用什么样的库,总是一个代价高昂的操作。

我从来没有使用Allegro(我正在使用SDL),但是我猜想,每当单个像素被放置在屏幕上时,窗口都会重新绘制屏幕表面,并且通过拖动窗口来避免实际发生的重绘。

如果你希望你的程序在性能上得到显着的提高,你应该总是画出一个离屏的表面,一旦绘图结束(这是一个基本的双缓冲技术),将整个表面喷到屏幕表面。

就像我说的,我从来没有使用过快板,但是从我能收集到的东西,你可以做这样的事情:

int main() { unsigned int res_width,res_height); BITMAP *temporaryBitmap = create_bitmap(res_width,res_height); cout << "Success! Drawing graph..." << endl; for (int y=0; y<res_height; y++) { for (int x=0; x<res_width; x++) { float valued_x = (int_to_float(x)-(int_to_float(res_width)/2))/SCALE; float valued_y = (int_to_float(-y)+(int_to_float(res_height)/2))/SCALE; _putpixel24(temporaryBitmap," << valued_y << ")" << endl; } } blit(temporaryBitmap,screen,temporaryBitmap->w,temporaryBitmap->h); cout << "Graph drawn." << endl; cin >> new char; cout << "Closing..."; destroy_bitmap(temporaryBitmap); deinit(); return 0; }

相关文章

可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持S...
为进一步规范小程序交易生态、提升用户购物体验、满足用户在...
云原生之使用Docker部署Dashdot服务器仪表盘
本文主要描述TensorFlow之回归模型的基本原理
1.漏洞描述Apache Druid 是一个集时间序列数据库、数据仓库和...
内部类(当作类中的一个普通成员变量,只不过此成员变量是cl...