Сообщений: 220
Тем: 20
Зарегистрирован: Nov 2012
Репутация:
808
Клиент ХФ. Сделали тут бафера, бафнули набор, офигели. Клиент зависает сильно. Делаем тред слип 80, лучше не стало. Делаем тред слип 140 - сами понимаете. Собственно клиент подвисает при каждом баффе, даже не на наборах.
Вопрос таков: это у нас такой плохой клиент или проблема общая? Есть ли патчи на эту тему? Платные тоже интересуют
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Какой протокол? Нужны пакеты сервера, снифай с помощью пакетхака.
Сообщений: 832
Тем: 125
Зарегистрирован: Jan 2009
Репутация:
404
каким методом накладывается бафф? Зависания проявляются только при накладывании набора или даже при единичном баффе тоже?
Сообщений: 183
Тем: 3
Зарегистрирован: Apr 2015
Репутация:
906
Посмотри пакеткой что происходит. Почти уверен, что какой-то флуд
Сообщений: 220
Тем: 20
Зарегистрирован: Nov 2012
Репутация:
808
Ну вот восстановление набора например
else if (command.startsWith("_bbsbuffer;restore"))
345 {
346 String name = (command.split(" ").length >= 2) ? command.split(" ")[1] : "";
347 String WHO = (command.split(" ").length >= 3) ? command.split(" ")[2] : "Player";
348 if (name.length() < 1)
349 {
350 MsgPacket msg = new MsgPacket("У Вас нет сохранённых бафов.", false);
351 activeChar.sendPacket(msg);
352 }
353 else
354 {
355 try (Connection conn = ConnectionFactory.getInstance().getConnection();
356 PreparedStatement statement = conn.prepareStatement("SELECT * FROM cb_buffer WHERE charId=? AND buff_name=?"))
357 {
358 statement.setInt(1, activeChar.getObjectId());
359 statement.setString(2, name);
360 try (ResultSet rcln = statement.executeQuery())
361 {
362 while (rcln.next())
363 {
364 String[] buffs = rcln.getString("buff_save").split(";");
365 for (String bu : buffs)
366 {
367 Integer[] buffData = BufferData.getInstance().getBuffById(Integer.parseInt(bu));
368
369 if (buffData != null)
370 {
371 if (buffData[2] != 0)
372 {
373 if (activeChar.destroyItemByItemId("BufferService", buffData[2], buffData[3], null, true))
374 {
375 Thread.sleep(80);
376 Skill bf = SkillData.getInstance().getSkill(buffData[0], buffData[1]);
377 if (WHO.equals("Player"))
378 {
379 bf.applyEffects(activeChar, activeChar);
380 }
381 else
382 {
383 bf.applyEffects(activeChar, activeChar.getSummon());
384 }
385 }
386 }
387 else
388 {
389 Thread.sleep(80);
390 Skill bf = SkillData.getInstance().getSkill(buffData[0], buffData[1]);
391 if (WHO.equals("Player"))
392 {
393 bf.applyEffects(activeChar, activeChar);
394 }
395 else
396 {
397 bf.applyEffects(activeChar, activeChar.getSummon());
398 }
399 }
400 }
401 }
402 }
403 rcln.close();
404 }
405 statement.close();
406 conn.close();
407 }
408 catch (Exception e)
409 {
410 _log.log(Level.WARNING, "Could not restore buff info: " + e.getMessage(), e);
411 }
412 }
Сообщений: 125
Тем: 30
Зарегистрирован: Sep 2010
Репутация:
194
Давненько было такое на опен тим сборке но решил Ден данную проблему.
Напиши ему вдруг что подскажет
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Что за жесть.
Вы чуть что слипаете весь основной поток своим sleep() + чтение каждый раз и базы.
В любом случае: запускаете сервер с профайлером, бафаетесь и смотрите в профайлере что в этот момент сьело больше всего CPU.