簡體   English   中英

怪異表現像素三維圖形程序[通過拖動窗口更快繪圖]

[英]Weirdly behaving pixel by pixel 3d graphing program [Faster drawing by dragging the window]

所以我使用Allegro 4庫在C ++中編寫了一個簡單的3d圖形程序。 我通過逐像素繪制以最簡單的方式制作它。 通常,在屏幕上放置單個像素非常慢,因為Allegro的工作方式和繪制分辨率為640x480的圖形時我必須等待一兩分鍾。

所以我正在為我的好友渲染一個圖像,所以我拖着窗戶看到一個很好的截圖,我發現通過拖動窗口和渲染圖片,只要我按住窗口,它就會大大加快。 從2分鍾開始,它將在10秒內完成所有操作。

這種眩暈行為的原因是什么? 它是與Windows的窗口相關的還是由Allegro本身引起的? 這有什么解釋嗎?

截圖

還有我的代碼

#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, 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, 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),但我猜想每次放置一個像素時窗口會重繪屏幕表面,並且通過拖動窗口,可以防止重繪實際發生。

如果您希望程序的性能大幅提升,則應始終繪制到屏幕外表面,並在繪圖結束后將整個表面blit到屏幕表面(這是一種基本的雙緩沖技術)。

就像我說的那樣,我從未使用過Allegro,但是從我能收集的內容中,你可以做到這樣的事情:

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);

  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,x,y,get_z_color(get_z(valued_x,valued_y)));
        //cout << "Drawing (" << valued_x << "," << valued_y << ")" << endl;
    }
  }

  blit(temporaryBitmap, screen, 0, 0, 0, 0, temporaryBitmap->w, temporaryBitmap->h);

  cout << "Graph drawn." << endl;

  cin >> new char;

  cout << "Closing...";

  destroy_bitmap(temporaryBitmap);

  deinit();
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM