Как сделать генерацию текстур более эффективным SFMLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как сделать генерацию текстур более эффективным SFML

Сообщение Anonymous »

Я пишу 3 моделирование частиц, используя C ++ и библиотеку SFML для графики.
Цель симуляции состоит в том, чтобы показать частицы, так и генерация визуальной тепловой карты величины их распределения силы. /p>
Проблема заключалась в том, что каждый подход, который я использовал для привлечения фоновой тепловой карты, был невероятно неэффективен до такой степени, что код по существу не может работать, он компилируется, но моделирование имеет Безумный каркас. Раздел окна соответственно. низкий, что означает, что просто действие изменения окраски пикселей было слишком интенсивным вычислительным. Отечественная карта, думая, что это было бы более эффективной, но я также подбежал к той же проблеме с низким уровнем кадров. при ~ 60+ fps, но когда я добавляю в код, который должен изменить яркость фона, это снижается до ~ 3 кадров в секунду, я хотел бы, чтобы он работал, по крайней мере, при 30 кадре. < /p>
Это код, который я сейчас использую для создания фоновой текстуры и изменения цветов пикселей, с кодом настройки здесь: < /p>

Код: Выделить всё

    int xsize = 1600;
int ysize = 1000;

sf::RenderWindow window(sf::VideoMode(xsize, ysize), "Particles");

sf::Image backgroundImage;
backgroundImage.create(xsize, ysize, sf::Color::Black);

for (unsigned int x = 0; x < xsize; x++) {
for (unsigned int y = 0; y < ysize; y++) {
sf::Uint8 r = 0;
sf::Uint8 g = 0;
sf::Uint8 b = 0;
backgroundImage.setPixel(x, y, sf::Color(r, g, b));
}
}

sf::Texture backgroundTexture;
backgroundTexture.loadFromImage(backgroundImage);
sf::Sprite backgroundSprite(backgroundTexture);
< /code>
, чтобы избежать путаницы, я должен предисловать, что величина переменной - это величина силы, а переменная сила должна быть некоторой функцией на величину, так что ее значения всегда находятся между 0 и 1.
и фактический рисунок здесь с переменной силы, установленной на постоянную для всех пикселей временно: < /p>
        for (unsigned int x = 0; x < xsize; x++) {
for (unsigned int y = 0; y < ysize; y++) {
//sim.setForce(x,y,0,0,0);
//double magnitude = sqrt((sim.getforce(1)*sim.getforce(1))+(sim.getforce(2)*sim.getforce(2)));
//double force = (1-(1/(magnitude+1)));
double force = 0.25;
sf::Color pixelColor = backgroundImage.getPixel(x, y);

// Calculate the new brightness values by scaling them with the force
float r = pixelColor.r * brightnessFactor;
float g = pixelColor.g * brightnessFactor;
float b = pixelColor.b * brightnessFactor;

// Ensure that the colors stay within the valid range [0, 255]
r = manualClamp(r);
g = manualClamp(g);
b = manualClamp(b);

// Update the pixel in the image
backgroundImage.setPixel(x, y, sf::Color(static_cast(r), static_cast(g), static_cast(b)));
}
}

backgroundTexture.update(backgroundImage);
< /code>
и метод ManualClamp: < /p>
sf::Uint8 manualClamp(float value) {
return static_cast(std::min(std::max(value, 0.0f), 255.0f));
}
Чтобы повторить, я пытаюсь найти способ изменить яркость фона, чтобы он показал величину силы в этой точке, как тепловая карта.
Сила рассчитывается с помощью распределения квадрата 1 над радиусом. < /p>
Мой компилятор - Mingw, но фактические команды компиляции, которые запускаются, я не уверен, так как компиляция обрабатывается расширением, предоставленным нам моей школой, это для компьютера Science 1 Class.
Я относительно неопытный в графике и C ++, я был бы признателен за некоторое руководство по правильному подходу к этой проблеме.

Подробнее здесь: https://stackoverflow.com/questions/792 ... cient-sfml
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»