Overhead в базовой функции SendPacket()
Отправка клиенту больше данных чем нужно.
Отправляем - сколько выделили памяти для буфера, а не сколько туда положили. Баг, как вижу старый, на трине присутствует тоже :yes3: ... У меня трафик снизился после исправления. Собственно код для чистого ядра: PHP код:
PHP код:
|
Не путайте capacity() и size(). Первая возвращает число выделенных блоков под элементы вектора, вторая - число элементов.
Следовательно ваш патч ничего не исправляет. |
Цитата:
Посмотри внимательно код ByteBuffer.h, там переопределено. |
size_t size() const { return _storage.size(); }
и там же const static size_t DEFAULT_SIZE = 0x1000; _storage.reserve(DEFAULT_SIZE); Если не указан размер.. |
Я, если честно, не вижу в каких случаях мы можем так жестоко прокалываться... У нас _storage.size() обязан быть равен _wpos. Вы пробовали ставить ассерты дабы проверить ваши догадки?
|
zhenya, _storage.reserve() != _storage.resize(). первое изменяет значение, возвращаемое функцией capacity(), а второе еще и size().
P.S. xex, поставьте такой ассерт MANGOS_ASSERT(pct.size() == pct.wpos()); в функции WorldSocket::SendPacket() и отпишитесь, если он сработает. Надо быть уверенными в том, что трабла действительно имеет место т.к. по коду на первый взгляд проблем не видно |
Да вы чего? внимательно в код посмотрите-то.
size_t size() const { return _storage.size(); } размер ХРАНИЛИЩА (сколько мозгов выделили) size_t wpos() const { return _wpos; } размер сколько данных влили. Вообще неправильно класс в этом отношении написан. Ядерщики - исправляйте =) |
Не морочьте голову, поставьте ассерт как я сказал в предыдущем посте и если он сработает, отпишитесь каким образом у вас это вышло: номер пакета, настройки компрессии трафика и т.д.
|
wpos() - позиция записи в буфер, ее можно передвинуть чтобы перезаписать какие-то данные. Если использовать ее для определения размера пакета можно напороться на неприятные баги.
_storage.size() - возвращает число байт, которые положили в буффер. Т.е. то что нужно, бага нет. |
Цитата:
|
Цитата:
WorldPacket data(опкод, 1киллобайт). data << гайд; data << uint8(0); Киллобайт и передаётся, хотя там например гайд и 0ль - итого максимум 9 байт, ну плюс опкод 2 байта =). Сам класс немного криво сделан... |
Давайте вы не будете зря сотрясать воздух, а поставите ассерты и посмотрите, возможна ли в принципе та ситуация, о которой вы говорите. А она может быть возможна только в случае если неправильно используются функции size_t wpos(size_t wpos_) и void resize(size_t newsize)
|
xex, изучайте std::vector...
|
Цитата:
Цитата:
У меня всё работает больше недели. трафик снизился на серверах... Не хотите в ядро внедрить, ну ладно :resent: Я например и такие вещи использую в буффере, перенёс с Delphi: Код:
// boxa |
эм, кагбэ http://www.devx.com/tips/Tip/5328
Особенно замечаем " In addition, reserve() does not change the size of a vector; it only changes the vector's capacity." ВЫВОД: size() вернет столько, сколько туда записали... (либо ресайзнули вручную через resize(), но этот факт ничего не меняет) |
Ещё добавлю для ядерщиков:
int WorldSocket::SendPacket (const WorldPacket& pct) пакет готов для отправки клиенту? - да. мы здесь меняем данные? - нет. pct.size() - размер выделенной памяти. pct.wpos() - сколько записали И НУЖНО ПЕРЕДАТЬ. |
if (pct.size() != pct.wpos()) throw "FAIL!";
может на плюсах понятнее. |
Цитата:
|
Цитата:
|
Закрою я эту тему от греха подальше. Пусть наш Delphi-программист почитает про разницу между зарезервированной и использованной памятью в STL-контейнерах. А также поймет, что существование багов надо доказывать, а не тыкать пальцем в небо и кричать "там где-то есть бага, я знаю!".
|
Текущее время: 12:40. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS