Оптимизация

Тема в разделе "LANGS.C", создана пользователем Zlyden, 14 сен 2011.

  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Работа в OpenGL (но вопрос больше связан с С++). Дело в том, что мне понадобился (да и интересно) алгоритм прорисовки сглаженной линии со всеми наворотами типа закруглённых концов и любой ширины (в том числе и дробной). Для этого я модифицировал алгоритм Ву. С этой-то задачей я справился, линии рисуются. Но проблема в другом - когда я решил сделать с этими самыми линиями заставку, то обнаружил, что работает функция ну очень долго. За то время, пока на экране рисуется тысяча линий встроенными средствами OpenGL, моя функция с трудом выплёвывает десяток. Сначала думал, что проблема в некрасивом методе прорисовки пикселей, и отключил их, оставив лишь математические расчёты - скорости не прибавилось. При этом, до жути медленно работает даже классический алгоритм Ву, который не очень-то и замудрён.
    В чём может быть проблема? Я делаю в коде что-то преступное? Или же ответ только один - переписывать всё в виде асм-вставки? Подскажите, пожалуйста, как добиться высокой скорости.
    Исходный код функции: http://codepaste.ru/7645/. Полный исходник заставки (на всякий случай) в прикреплении
     
  2. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    думаю ток это вам и поможет))
    *и с чего решиле что так быстрее будет то....
     
  3. Maratyszcza

    Maratyszcza New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    32
    1. Скомпилить с /fp:fast /Ox /arch:SSE
    2.
    Код (Text):
    1. 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):
    1.                             if(distance <= 0.0f){
    2.                                 bgColor.alpha=1.0f;
    3.                                 Pixel(xs, (int)ys, bgColor);
    4.                             }
    5.                             else if(distance < 1.0f){
    6.                                 bgColor.alpha=1.0f-distance;
    7.                                 Pixel(xs, (int)ys, bgColor);
    8.                             }
    можно переписать как
    Код (Text):
    1.                             if(distance < 1.0f){
    2.                                 bgColor.alpha=1.0f-max(distance, 0.0f);
    3.                                 Pixel(xs, (int)ys, bgColor);
    4.                             }
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Zlyden

    Ты вообще в курсе что на дворе 21 век, и что современная видеокарта, которая отрисовывает линии, когда ты это делаешь средствами OpenGL, на порядки мощнее твоего CPU?
     
  5. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Zlyden
    Я думаю, стоит пока оставить как есть, и заняться изучением OpenGL, а затем и шейдеров. Может быть если все эти красивые алгоритмы загрузить в видеокарту и заставить её рисовать линии, то тогда и получиться что-нибудь побыстрее. Оптимизировать же код для CPU не то чтобы бесполезно, но в 100 раз быстрее не будет точно.
     
  6. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Maratyszcza
    Спасибо, скорости заметно прибавилось. Правда, всё равно fps не хватает.
    r90
    Спасибо. Хоть я и не хотел особо вникать в природу OpenGL, похоже, иного выбора у меня нет.