Есть ли способ создать эффект плазмы в SFML, который не замедляет мою частоту кадров?
Эффект плазменного спрайта SFML?
Ответы (2)
1) Управляйте битами изображения непосредственно в памяти как массив байтов (или int/что угодно, в зависимости от вашей целевой глубины цвета). Не используйте каждый раз ничего, что GetsPixel() из изображения.
2) Минимизируйте свою математику. Для эффектов плазмы вы обычно будете использовать множество триггерных функций, которые довольно медленны, когда вы их выполняете (высоташириначастота кадров) раз в секунду. Либо используйте быструю специализированную математическую библиотеку для своих расчетов, либо, что еще лучше, кэшируйте расчеты в начале и используйте справочную таблицу во время эффекта, чтобы полностью исключить математику из каждого кадра.
3) Одной из вещей, которая заставляла плазменные эффекты старой школы работать так быстро, была смена палитры. Я не знаю какого-либо способа воспроизвести это (или палитры в целом) с помощью SFML напрямую, но вы можете использовать шейдеры GLSL, чтобы получить такой же результат без большого снижения производительности. Что-то вроде этого:
float4 PS_ColorShift(float2 Tex : TEXCOORD0) : COLOR0
{
float4 color = tex2D(colorMap, Tex);
color.r = color.r+sin(colorshift_timer+0.01f);
color.g = color.g+sin(colorshift_timer+0.02f);
color.b = color.b+sin(colorshift_timer+0.03f);
color.a = 1.0f;
saturate(color);
return color;
}
Можете ли вы просто сделать эффект плазмы в оперативной памяти, затем поместить его на текстуру и загрузить? Это не шейдерный эффект, но он даст вам эффект плазмы.