Работа в OpenGL (но вопрос больше связан с С++). Дело в том, что мне понадобился (да и интересно) алгоритм прорисовки сглаженной линии со всеми наворотами типа закруглённых концов и любой ширины (в том числе и дробной). Для этого я модифицировал алгоритм Ву. С этой-то задачей я справился, линии рисуются. Но проблема в другом - когда я решил сделать с этими самыми линиями заставку, то обнаружил, что работает функция ну очень долго. За то время, пока на экране рисуется тысяча линий встроенными средствами OpenGL, моя функция с трудом выплёвывает десяток. Сначала думал, что проблема в некрасивом методе прорисовки пикселей, и отключил их, оставив лишь математические расчёты - скорости не прибавилось. При этом, до жути медленно работает даже классический алгоритм Ву, который не очень-то и замудрён. В чём может быть проблема? Я делаю в коде что-то преступное? Или же ответ только один - переписывать всё в виде асм-вставки? Подскажите, пожалуйста, как добиться высокой скорости. Исходный код функции: http://codepaste.ru/7645/. Полный исходник заставки (на всякий случай) в прикреплении
1. Скомпилить с /fp:fast /Ox /arch:SSE 2. Код (Text): distance = (float)(yt - (int)(yt)); переписать с помощью _mm_round_ss (SSE4.1, для более старых процессоров использовать _mm_add_ss, _mm_and_ps, _mm_sub_ss) 3. sqrt заменить на _mm_rsqrt_ss и умножение 4. Деление заменить на _mm_rcp_ss и умножение 5. Другие полезные SSE-инструкции: _mm_max_ss и _mm_min_ss Например, Код (Text): if(distance <= 0.0f){ bgColor.alpha=1.0f; Pixel(xs, (int)ys, bgColor); } else if(distance < 1.0f){ bgColor.alpha=1.0f-distance; Pixel(xs, (int)ys, bgColor); } можно переписать как Код (Text): if(distance < 1.0f){ bgColor.alpha=1.0f-max(distance, 0.0f); Pixel(xs, (int)ys, bgColor); }
Zlyden Ты вообще в курсе что на дворе 21 век, и что современная видеокарта, которая отрисовывает линии, когда ты это делаешь средствами OpenGL, на порядки мощнее твоего CPU?
Zlyden Я думаю, стоит пока оставить как есть, и заняться изучением OpenGL, а затем и шейдеров. Может быть если все эти красивые алгоритмы загрузить в видеокарту и заставить её рисовать линии, то тогда и получиться что-нибудь побыстрее. Оптимизировать же код для CPU не то чтобы бесполезно, но в 100 раз быстрее не будет точно.
Maratyszcza Спасибо, скорости заметно прибавилось. Правда, всё равно fps не хватает. r90 Спасибо. Хоть я и не хотел особо вникать в природу OpenGL, похоже, иного выбора у меня нет.