Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Утечка памяти ?
GreenBytes Дата: Воскресенье, 05.07.2020, 10:56:46 | Сообщение # 1
Сообщений: 19
Репутация: 0 [ +/- ]
Добрый день, хотелось бы чтоб взглянули на код профессионалы, возможно я что-то делаю не так и происходит утечка памяти.
Сервер работает, но бывают лаги такие что не спасает даже перезагрузка карты. Только ребут сервера.
Код
//-------------------------------------------------------------------------------------------------------
//  function: LoadPlayer
//   Description: Загрузка данных с сервера о игроке
//-------------------------------------------------------------------------------------------------------
public void LoadPlayer(int client) {
    char szError[256], szQuery[256], szAuth[32], szName[64];
    GetClientAuthString(client, szAuth, sizeof(szAuth));
    GetClientName(client, szName, sizeof(szName));
    Database hDatabase = SQL_Connect("source", false, szError, sizeof(szError));
    if (hDatabase == INVALID_HANDLE) {
  SQL_GetError(hDatabase, szError, sizeof(szError));
  PrintToServer("Error LoadPlayer [0] (%s)", szError);
  KickClient(client, "Невозможно подключиться к БД, попробуйте снова.");
  return;
    }
    FormatEx(szQuery, sizeof(szQuery), "SELECT * FROM db_fishing WHERE steam = '%s';", szAuth);
    DBResultSet hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery));
    if (hQuery == null) {
  SQL_GetError(hDatabase, szError, sizeof(szError));
  PrintToServer("Error LoadPlayer [1] (%s)", szError);
  KickClient(client, "Невозможно выполнить команду БД, попробуйте снова.");
    }else{
  if (hQuery.RowCount != 0) {
   hQuery.FetchRow(); // hQuery.FetchInt(2);
   HookPlayerLoad(client, hQuery);
   delete hQuery;
   delete hDatabase;
   return;
  }
  delete hQuery;
    }
    FormatEx(szQuery, sizeof(szQuery), "INSERT INTO db_fishing SET steam = '%s' , name = '%s' , bonus = '300' , catch = '0', fishing = '0';", szAuth, szName);
    hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery));
    if (hQuery == null) {
  SQL_GetError(hDatabase, szError, sizeof(szError));
  PrintToServer("Error LoadPlayer [2] (%s)", szError);
  KickClient(client, "Невозможно создать табличку в БД, попробуйте снова.");
    }else{
  delete hQuery;
    }
    FormatEx(szQuery, sizeof(szQuery), "SELECT * FROM db_fishing WHERE steam = '%s';", szAuth);
    hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery));
    if (hQuery == null) {
  SQL_GetError(hDatabase, szError, sizeof(szError));
  PrintToServer("Error LoadPlayer [3] (%s)", szError);
  KickClient(client, "Невозможно выполнить команду БД, попробуйте снова.");
    }else{
  delete hQuery;
        delete hDatabase;
        LoadPlayer(client);
    }
    delete hDatabase;
}

//-------------------------------------------------------------------------------------------------------
//  function: UpdatePlayer
//   Description: Сохранение бонусов
//-------------------------------------------------------------------------------------------------------
public UpdatePlayer(int client) {
    if ( PlayerStructure[client][PlayerUserID] <= 0 ) return;
    char szError[256], szQuery[512], szAuth[32], szName[64];
    GetClientAuthString(client, szAuth, sizeof(szAuth));
    GetClientName(client, szName, sizeof(szName));
    Database hDatabase = SQL_Connect("source", false, szError, sizeof(szError));
    if (hDatabase == INVALID_HANDLE) {
  SQL_GetError(hDatabase, szError, sizeof(szError));
  PrintToServer("Error UpdatePlayer [0] (%s)", szError);
  return;
    }
    FormatEx(szQuery, sizeof(szQuery), "UPDATE db_fishing SET name = '%s' , bonus = '%d' , money = '%d' , catch = '%d' , fishing = '%d' , prison = '%d' , skin = '%d' , score = '%d', deatch = '%d', vip = '%d' WHERE steam = '%s';", szName, PlayerStructure[client][PlayerBonus], PlayerStructure[client][PlayerMoney], PlayerStructure[client][PlayerCatch], PlayerStructure[client][PlayerFishing], PlayerStructure[client][PlayerPrison], PlayerStructure[client][PlayerSkin], PlayerStructure[client][PlayerScore], PlayerStructure[client][PlayerDeath], PlayerStructure[client][PlayerVIP], szAuth);
    DBResultSet hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery));
    if (hQuery == null) {
  SQL_GetError(hDatabase, szError, sizeof(szError));
  PrintToServer("Error UpdatePlayer [1] (%s)", szError);
    }else delete hQuery;
    delete hDatabase;
}

Добавлено (05.07.2020, 10:58:07)
---------------------------------------------
Пока что предполагаю что лаги из -за этого участка кода, да, когда игрок выходит и входит на сервер происходит микро глюк, но вроде это нормальная реакция, а когда на сервере только я и постоянные глюки это уже ненормально :(

 
_wS_ Дата: Воскресенье, 05.07.2020, 14:21:31 | Сообщение # 2
1. Не хочешь лагов/зависаний, используй SQL_T.. функции.

2. Вряд ли хорошая идея делать connect к базе после каждого входа игрока, сделай 1 раз в OnPluginStart, а потом просто запросы + можешь ловить текст ошибок и по ним определять стоит ли делать reconnect. Обычно reconnect полезен при ошибках Lost connection to MySQL server during query и Access denied for user. Или хотя бы можно reconnect в OnMapEnd.

3. В самом низу ты делаешь 2 раза delete hDatabase;
4. Имя игрока избавь от опасных символов
5. Пока хватит
 
GreenBytes Дата: Воскресенье, 05.07.2020, 14:40:26 | Сообщение # 3
Сообщений: 19
Репутация: 0 [ +/- ]
_wS_, а как сделать дисконект от базы ?
delete hDatabase;
верная конструкция ?
 
_wS_ Дата: Воскресенье, 05.07.2020, 16:03:09 | Сообщение # 4
Да
 
  • Страница 1 из 1
  • 1
Поиск: