Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> быстрый, самодельный "std::map" 
V
    Опции темы
semibug
Дата 4.9.2012, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Стоит задача отрисовать строку текста (UTF-8) с помощью PNG текстуры с глифами. Есть массив с описанием положения каждого глифа на текстуре. Пока работал с символами со значением до 128 проблем небыло - на этапе инициализации создавался массив с информацией по глифам, и при выводе символа его код играл роль индекса.
С переходом на Unicode вариант с индексом отпадает из-за слишком больших возможных значений кода символа.
Пока попробовал два варианта - в первом просто перебираю по очереди данные о глифах пока не наткнусь на нужный (брутально и некрасиво), во втором составляю std::map, и выбираю данные уже через него (и здесь видимо есть какая-то закулисная работа, требующая процессорного времени).
В итоге хочу попробовать набросать простой генератор кода, который напишет большой switch () со всеми используемыми кодами unicode. Надеюсь на сообразительность компилятора. Как считаете, будет ли это самый оптимальный по производительности вариант?


PM   Вверх
Amp
Дата 4.9.2012, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



У тебя unicode и при этом ты еще на этапе компиляции знаешь какой набор символов использует программа и с каким шрифтом? То есть текстура генерируется заранее, а не динамически заполняется в процессе работы программы?
PM MAIL   Вверх
bsa
Дата 4.9.2012, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Обычно рисуют один раз, а показывают много. Поэтому, сначала подготовь строку к выводу (например, в OpenGL можно использовать для этого display list), а уже затем выводи каждый раз. В итоге у тебя ресурсы на мэп будут тратиться только перед показом первого кадра, а все остальные будет значительно быстрее проскакивать.

Это сообщение отредактировал(а) bsa - 4.9.2012, 21:36
PM   Вверх
Amp
Дата 4.9.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



switch-case в случае, если будет оптимизация через jump/lookup-таблицы, даст константное время поиска адреса перехода. Всевозможные hashmap-ы тоже. Кстати одна из возможных оптимизаций - кэшировать текст не отдельными глифами, а прямо кусками слов. Это если текстура генерируется по ходу работы приложения.
PM MAIL   Вверх
bsa
Дата 4.9.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Amp @  4.9.2012,  22:47 Найти цитируемый пост)
 даст константное время поиска адреса перехода

не всегда. иногда может быть логарифмическое.
PM   Вверх
semibug
Дата 4.9.2012, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Ок, спасибо за ответы!
Ковыряюсь в ассемблерном коде switch, пока видно, что компилятор (vs2010) довольно умело строит набор lookup-ов на последовательности и отдельные сравнения для единичных величин стоящих далеко от других.

Цитата(bsa @  4.9.2012,  22:17 Найти цитируемый пост)
не всегда. иногда может быть логарифмическое. 

В каких ситуациях, подскажите пожалуйста. Чтобы навсегда отбросить бредовые идеи с генератором свичей )).

Цитата
Обычно рисуют один раз, а показывают много.

Движок в моем случае черный ящик, умеет только рисовать заданые куски заданой текстуры по заданой координате ).


Это сообщение отредактировал(а) semibug - 4.9.2012, 23:05
PM   Вверх
Amp
Дата 4.9.2012, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



Цитата(bsa @  4.9.2012,  22:17 Найти цитируемый пост)
не всегда. иногда может быть логарифмическое. 

Да, наверное постоянный O(1) для целых чисел возможен, когда не требуется генерация здорового массива с "пустышками" вместо переходов на неиспользуемых индексах. Хотя задача вроде и подходит под такой частный случай, но кто его знает, как компилятор себя поведет. 
PM MAIL   Вверх
bsa
Дата 4.9.2012, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(semibug @  5.9.2012,  00:02 Найти цитируемый пост)
В каких ситуациях, подскажите пожалуйста.

Когда набор ключей очень разрозненный. Т.е. очень сильно друг от друга отличаются.

Я тебе уже сказал, что строка формируется один раз, а отображается множество. Поэтому тебе нужно с мэпом работать только один раз при формировании строки (массива текстур), а при отображении уже использовать готовый массив текстур.
PM   Вверх
Amp
Дата 4.9.2012, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



Цитата(semibug @  4.9.2012,  23:02 Найти цитируемый пост)
В каких ситуациях, подскажите пожалуйста. Чтобы навсегда отбросить бредовые идеи с генератором свичей )).

Учти такую вещь, что смена версии компилятора компилятора, выпущенный SP к студии может все взять и поменять. Поэтому все же лучше не стоит полагаться на оптимизации. А массив-таблицу с переходами можешь сгенерировать сам.
PM MAIL   Вверх
math64
Дата 5.9.2012, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно создать массив структур:
Код

struct {
wchar_t unicode;
Gliph* gliph;
}

отсортировать его с помощь qsort
а затем искать в нем с помощью bsearch.

или использовать их аналоги из stl.
PM   Вверх
semibug
Дата 5.9.2012, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Спасибо всем.
Как предлагал bsa, кэширование видимо даст наиболее высокую производительность. Но что бы не требовать дополнительной памяти на кэш, оставил выбор за пользователем и сделал так: одна функция перекодирует строку Unicode во внутреннюю кодировку, которая соответствует индексам массива информации о глифах ( поиск по совету math64 ), а другая рисует уже перекодированую строку.




Это сообщение отредактировал(а) semibug - 5.9.2012, 21:40
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.