Краш-тест клиента. Результаты плачевны.

вторник, 15 июля 2008 г.


Многие игроки знают о существовании тестового сервера. Сегодня утром там было "людно" от монстров. Я загрузил в локацию в одну клеточку 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). Посмотрим, что из этого выйдет :)

9 коммент.:

aad комментирует...

А почему 4ый способ не приемлем. Мне как раз кажется, что он даст наилудший результат. Если его сделать с маленькими модификациями. В памяти формировать кусок чата из сообщений пришедших с сервера и выводить их раз в секунду. Но как только добавляется сообщение от действий самого пользователя (красное - типа включены усилители, отключена физ атака), то все накопившееся сразу отображается в чат.

Анонимный комментирует...

если не особенно мучатся, то 4 способ самый простой и эффективный. сообщения в любом случае выводятся посекундно. а на обновление объекта TMEMO и производных от него, уходит туча ресурсов, в качестве варианта - сделайте тест. (вообще оч хорошо на слабых машинах заметно. когда кто-нить труп к примеру подбирает. Клиент подвисает и отрисовка тормозит. Обновить объект 30 раз или 1 раз в секунду. это разница. к тому же увидеть, прочитать и осознать 250 бегущих сообщений в секунду - тоже анрил,так что не вижу преград перед 4 пунктом.
Не думаю что flash спасет ситуацию.
А рассинхронизация потоков.. а чем тогда это отличается от 4 варианта? помоему лучше гарантировано получить пачку сообщений в секунду(или скажем в полсекунды), чем видеть 250 сообщений растянутых на 20 секунд. бой давно кончился - а они летят и летят.... смысл? это, конечно, мое ИМХО.

Анонимный комментирует...

Кстати - если хочется сохранить последовательный приход сообщений в чат. то можно его легко эмулировать(ведь временная метка на сообщении стоит). скажем мы ждем 1/50 секунды. если за это время приходит меньше 10 сообшений. то выкидываем их как обычно. 1 сообщение - 1 добавление. (можно даже задержку просимулировать). пока эти сообщения выкидываются. мы ждем следующие 1/50 секунды. и тут на нас обрушивается шквал из 300 сообщений. мы их так пачкой за 1 сообщение и выкидываем. вот пожалуйста простор для творчества. можно регулировать аж 3 параметра. в итоге в кризисных ситуациях клиент не висит. а в остальных работает как обычно.

-Aggilus- комментирует...

Мад, по своему опыту скажу, что флеш-фариант часа самый приемлимый. Он будет намного меньше грузить клиен :) Хотя действительно не факт, что справится с такой нагрузкой сам.

Анонимный комментирует...

Как я понял вся проблема с выводом сообщений, в частности именно боевых, то лучше сделать в большом окне чата еще и вкладку боевые сообщения и при закрытом большом чате что бы клиент вообще не получал сообщения эти сообщения и как следствия не выводил

Анонимный комментирует...

а в маленькое окно чата что бы вообще эти сообщения никак не выводились

Анонимный комментирует...

спаун, это почти тоже самое что и не выводить сообщения вообще. (только лучше не задумываться, что будет если у тебя опять же во время боя будет открыта эта злополучная вкладка с логом боя) проблема не в выводе боевых сообщений. проблема просто в выводе сообщений. каждый раз когда в эту область добавляется сообщение, область перерисовывается, обновляется и куча всего нужного для этой области происходит. в итоге мы имеем дикий груз, когда добавляется много сообщений. Мад меня поправит, если я что-то не так предполагаю.

MAD-ADMIN комментирует...

Все верно, sinclair

Анонимный комментирует...

Я не видел кода компонента чата, но исходя из своих наблюдений могу сказать следующее: его касяк в том, что он каждый раз при поступления сообщения ПОЛНОСТЬЮ формирует свою область с самого начала. Отрисовывает в памяти весь холст начиная с первого сообщения. А потом выводит на экран только видимую часть. Это очень не оптимизированный процесс.

Если переделать чат так, чтобы он при поступлении нового сообщения формировал только изображение полоски, занимаемой этим сообщением и сохранял ее в памяти вместе с высотой этой полоски и выводил бы только полоски видимых сообщений (это расчитывается достаточно просто), то вывод на экран стал бы на пять порядков быстрее.

Отправить комментарий

Не забывайте указывать свой игровой ник и сервер(если вы не зарегистрированы)
Например: Mad-Admin[RU]