Проблема заключается просто в большом количестве данных, которые вы должны обработать.
Размер вашего плавающего буфера составляет 9 мегабайт, и вы касаетесь данных более одного раза. Скорее всего, ваш цикл рендеринга выглядит примерно так:
- Очистить буфер
- Сделать что-то на нем (использует чтение и запись)
- Преобразовать в неподписанные байты
- Загрузить в OpenGL
Это много данных, которые вы перемещаете, и кеш не может вам сильно помочь, потому что изображение намного больше, чем ваш кеш. Давайте предположим, что вы касаетесь каждого пикселя пять раз. Если это так, вы перемещаете 45 МБ данных в медленную основную память и из нее. 45 МБ не похоже на большой объем данных, но учтите, что почти каждый доступ к памяти будет пропуском кеша. Процессор будет проводить большую часть времени в ожидании поступления данных.
Если вы хотите остаться на процессоре для выполнения рендеринга, вы не можете ничего сделать. Некоторые идеи:
Использование SSE для невременных загрузок и хранилищ может помочь, но они значительно усложнят вашу задачу (вы должны выровнять чтения и записи).
Попробуйте разбить ваш рендеринг на плитки. Например. делать все на меньших прямоугольниках (256 * 256 или около того). Идея заключается в том, что вы на самом деле получаете выгоду от кеша. Например, после того, как вы очистили свой прямоугольник, все растровое изображение будет в кеше. Теперь рендеринг и преобразование в байты будут намного быстрее, потому что больше нет необходимости получать данные из относительно медленной основной памяти.
Последнее средство: уменьшите разрешение эффекта частиц. Это даст вам хороший удар по цене за счет визуального качества.
Лучшее решение - перенести рендеринг на графическую карту. Рендеринг в текстуру функциональности является стандартным в наши дни. Немного сложно заставить его работать с OpenGL, потому что вы должны решить, какое расширение использовать, но как только оно заработает, производительность больше не будет проблемой.
Кстати - вам действительно нужны цели с плавающей точкой рендеринга? Если вам не хватает 3 байтов на пиксель, вы увидите хорошее улучшение производительности.