![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSxEwCLvC8OBibGb-LaR1L76e6HlPAkc05x3KIHoKQhPAlf6WFLrVzywvviaqADNm8iY9mDMotFI1X6bvqrWCZ13kDsROEHY1iGtsuhENjNCismacpL1BT1FgngCdrucrohozvPlx9uYjm/s200/CrashTestDummy.jpg)
Многие игроки знают о существовании тестового сервера. Сегодня утром там было "людно" от монстров. Я загрузил в локацию в одну клеточку 215 монстров и ударил по ним масс-магией... Это был краш-тест клиента, целью которого было выяснить, какая именно процедура кода заставляет клиент "подвисать при стенках".
Результаты "загрузки" процессора явно не радостные:
- Клиент версии 1.1.6.6. оригинальный = 99%
- Клиент версии 1.1.6.7. Beta = 99%
- Клиент с полностью отключенной обработкой чата и боевых сообщений в чат = не более 15%
- ... с отключенной раскраской строк (строки выводятся, но не красятся)+отключенные смайлы = 69-85%
- ... с отключенным выводом строк, но с включенными смайлами+раскраской(строки в памяти красятся, добавляются смайлы, но не печатаются в чате) = не более 20%
Подведем итоги: практически вся нагрузка клиента - это именно отображение строк(их вывод) пользователю, но это проблема компонента чата, предоставленного Microsoft и измененного еще одной компанией под Unicode. Ковыряние этого компонента в потугах сделать вывод быстрее грозит затянутся на долгие месяцы... может к выходу ДС2 и успею. Пытаться что-то изменить не затрагивая процедуру вывода и поможет немного оптимизировать работу, но это будет просто капля в море, которая не изменит ситуации.
Что можно предпринять? На данный момент я вижу несколько путей развития клиента в плане оптимизации работы:
1) Отказ от использования этого компонента чата. Есть еще один компонент, разработанный достаточно крупной фирмой, который тоже выполняет те же функции и поддерживает юникод, однако, я сомневаюсь, что он также сможет справится с количеством добавляемых в секунду строк. Проблема также в том, что этот компонент имеет совершенно другой, достаточно неудобный синтаксис и работать с ним достаточно сложно.
2) Использование потоков. Выделить чат в отдельный поток, то есть сделать его независимым от работы основного клиента. Казалось бы все достаточно просто, но тут очень много подводных камней, обусловленных как сложностью кода обработки строк, так и опять же большим количеством сообщений (я молчу про рассинхронизацию чата и других отображаемых данных). И все-таки это направление кажется мне достаточно перспективным
3) Использование совершенно другого типа чата. Первое, что пришло в голову и показалось достаточно перспективным - чат на Flash. Т.е. флэш-компонент встраивается в клиент на месте чата. Клиент обрабатывает и передает компоненту строки в специальном формате. Флеш-ролик чата отображает чат (с анимированными смайлами) и при необходимости - возвращает нужные данные, как то клик на нике в чате. Не знаю только, как флэш справится с подобной нагрузкой.
4) Добавлять сообщения "кучкой", раз в секунду. В этом случае сначала в памяти формируется кусок чата, куда скидываются все сообщения, а раз в секунду все эти сообщения одной командой добавляются в чат. Мне кажется, в нашей игре это не приемлемо (
Вот четыре основные ветки, которые я вижу на данный момент. Завтра (16 июля) дам нашим флэшерам задание сделать шаблончик чата, а сам в это время попробую переписать код под многопоточность (п.2). Посмотрим, что из этого выйдет :)