Я пытаюсь использовать CImg для визуализации своей программы. Я не хочу использовать OpenGL, потому что пытаюсь написать небольшой движок рендеринга (исключительно для собственного интереса, а не для задания!!!).
Я хочу создать цикл анимации в CImg.
Это моя петля.
while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
img.fill(0); // Set pixel values to 0 (color : black)
img.draw_text(t%WIDTH,30,"Hello World",purple); // Draw a purple "Hello world" at coordinates (100,100).
img.draw_text(10,10, ( "Time used for rendering :: " + std::to_string( 1.0 / ( duration.count()/cnt/1000000.0 ) ) ).c_str(), purple);
disp.render(img);
disp.paint();
if (t % (int)cnt == 0) {
tmp = std::chrono::high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>(tmp - start);
start = std::chrono::high_resolution_clock::now();
}
t++;
}
Он работает нормально, но частота кадров очень нестабильна (от 100 до 380 кадров в секунду). Это нормально? Или это правильный способ создания цикла анимации в CImg?
Я прочитал документацию CImg и сказал
Не следует использовать для общего использования CImgDisplay, так как display() более полезен.
Но когда я так выразился,
while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
img.fill(0); // Set pixel values to 0 (color : black)
img.draw_text(t%WIDTH,30,"Hello World",purple); // Draw a purple "Hello world" at coordinates (100,100).
img.draw_text(10,10, ( "Time used for rendering :: " + std::to_string( 1.0 / ( duration.count()/cnt/1000000.0 ) ) ).c_str(), purple);
disp.display(img);
if (t % (int)cnt == 0) {
tmp = std::chrono::high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>(tmp - start);
start = std::chrono::high_resolution_clock::now();
}
t++;
}
Этот FPS падает до 11. Итак, что пошло не так?
Заранее спасибо.
~~~~~~~~~~~~~~~~~~~~~~ Я линия ~~~~~~~~~~~~~~~~~~~~~~~~
Редактировать 1:
//
// main.cpp
// Render Engine
//
// Created by Ip Daniel on 6/4/18.
// Copyright © 2018 Ip Daniel. All rights reserved.
//
#include "CImg.h"
#include <chrono>
#include <string>
#include <iostream>
using namespace cimg_library;
#define WIDTH 640
#define HEIGHT 480
time_t start_time;
time_t tmp;
double time_passed = 0;
int main() {
CImg<unsigned char> img(WIDTH,HEIGHT,1,3); // Define a 640x400 color image with 8 bits per color component.
CImgDisplay disp(img,"My Hello World Loop");
unsigned int t = 0;
double cnt = 30;
auto start = std::chrono::high_resolution_clock::now();
auto tmp = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(tmp - start);
unsigned char purple[] = { 255,0,255 }; // Define a purple color
while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
img.fill(0); // Set pixel values to 0 (color : black)
img.draw_text(t%WIDTH,30,"Hello World",purple); // Draw a purple "Hello world" at coordinates (100,100).
img.draw_text(10,10, ( "Time used for rendering :: " + std::to_string( 1.0 / ( duration.count()/cnt/1000000.0 ) ) ).c_str(), purple);
// disp.display(img);
disp.render(img);
disp.paint();
if (t % (int)cnt == 0) {
tmp = std::chrono::high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>(tmp - start);
start = std::chrono::high_resolution_clock::now();
}
t++;
}
return 0;
}
Команда для компиляции
g++ -o main main.cpp -O2 -lm -lpthread -I/usr/X11R6/include -L/usr/X11R6/lib -lm -lpthread -lX11