Оптимизация
#1

Всем привет, во время использования данной функции
PHP код:
stock SellHouse()
{
    new 
banknotice[8], text[3],playerid;
    for(new 
1<= TOTALHOUSEi++)
    {
        
HouseInfo[i][hRobhouse] = false;
        if (
HouseInfo[i][hOwned] == 0) continue;
        if (
HouseInfo[i][hTakings] < HouseInfo[i][hPaycash])
        {
            
playerid INVALID_PLAYER_ID;
            
sscanf(HouseInfo[i][hOwner], "u"playerid);
            if (
IsPlayerConnected(playerid))
            {
                
PlayerInfo[playerid][pBank] += HouseInfo[i][hValue]+HouseInfo[i][hTakings]-HouseInfo[i][hPaycash]*2;
                
PlayerInfo[playerid][pIDHouse] = 0;
                
SetPVarInt(playerid"GetHome"1);
            }
            else
            {
                
format(query,sizeof(query), "SELECT Bank, Notice FROM "TABLE_ACCOUNT" WHERE Name = '%s'"HouseInfo[i][hOwner]);
                
mysql_query(query);
                
mysql_store_result();
                if (
mysql_fetch_row_format(query))
                {
                    
sscanf(query"p<|>is[8]"banknotice);
                }
                
mysql_free_result();
                
sscanf(notice"p<,>a<i>[3]"text);
                
text[0] = 1;
                
format(noticesizeof(notice),"%d,%d,%d"text[0], text[1], text[2]);
                
bank += HouseInfo[i][hValue];
                
SetPlayerInt(HouseInfo[i][hOwner],"Bank",bank);
                
SetPlayerStr(HouseInfo[i][hOwner],"Notice",notice);
            }
            
HouseInfo[i][hOwned] = 0;
            
HouseInfo[i][hHealme] = 0;
            
HouseInfo[i][hTakings] = 0;
            
strmid(HouseInfo[i][hOwner], "The State"0strlen("The State"), 255);
            
SetHouseStr(i,"Owner",HouseInfo[i][hOwner]);
            
SetHouseInt(i,"Owned",HouseInfo[i][hOwned]);
            
SetHouseInt(i,"Takings",HouseInfo[i][hTakings]);
            
SetHouseInt(i,"Healme",HouseInfo[i][hHealme]);
            
UpdateHouseInfo(i);
        }
        else
        {
            
HouseInfo[i][hTakings] -= HouseInfo[i][hPaycash];
            
SetHouseInt(i,"Takings",HouseInfo[i][hTakings]);
        }
    }
    return 
1;

Игровой сервер зависает секунд на 3-7-10, как можно это поправить? Оптимизировать запросы или хз что там, помогите пожалуйста)
Reply
#2

pawn Код:
stock SellHouse()
{
    for (new i = 1, bank, notice[8], text[3], playerid; i <= TOTALHOUSE; i++) {
        HouseInfo[i][hRobhouse] = false;
        if (HouseInfo[i][hOwned]) {
            if (HouseInfo[i][hTakings] < HouseInfo[i][hPaycash]) {
                playerid = INVALID_PLAYER_ID;
                sscanf(HouseInfo[i][hOwner], "u", playerid);
                if (IsPlayerConnected(playerid)) {
                    PlayerInfo[playerid][pBank] += (HouseInfo[i][hValue] + HouseInfo[i][hTakings] - HouseInfo[i][hPaycash] * 2);
                    PlayerInfo[playerid][pIDHouse] = 0;
                    SetPVarInt(playerid, "GetHome", 1);
                } else {
                    format(query, sizeof(query), "SELECT Bank, Notice FROM "TABLE_ACCOUNT" WHERE Name='%s'", HouseInfo[i][hOwner]);
                    mysql_query(query);
                    mysql_store_result();
                    if (mysql_fetch_row_format(query)) {
                        sscanf(query, "p<|>is[8]", bank, notice);
                        mysql_free_result();
                        sscanf(notice, "p<,>a<i>[3]", text);
                        text[0] = 1;
                        format(notice, sizeof(notice),"%d,%d,%d", text[0], text[1], text[2]);
                        bank += HouseInfo[i][hValue];
                        SetPlayerInt(HouseInfo[i][hOwner], "Bank", bank);
                        SetPlayerStr(HouseInfo[i][hOwner], "Notice", notice);
                    }// я пологаю что если строки вдруг нет или произошла ошибка в БД надо что-то предпринять
                }
                HouseInfo[i][hOwned] = 0;
                HouseInfo[i][hHealme] = 0;
                HouseInfo[i][hTakings] = 0;
                strmid(HouseInfo[i][hOwner], "The State", 0, strlen("The State"), 255);
                SetHouseStr(i,"Owner",HouseInfo[i][hOwner]);
                SetHouseInt(i,"Owned",HouseInfo[i][hOwned]);
                SetHouseInt(i,"Takings",HouseInfo[i][hTakings]);
                SetHouseInt(i,"Healme",HouseInfo[i][hHealme]);
                UpdateHouseInfo(i);
            } else {
                HouseInfo[i][hTakings] -= HouseInfo[i][hPaycash];
                SetHouseInt(i, "Takings", HouseInfo[i][hTakings]);
            }
        }
    }
    return 1;
}
коммент прочти, и покажи вызываемые функции.
Reply
#3

PHP код:
stock LoadHouse()
{
    new 
time GetTickCount();
    
mysql_query("SELECT * FROM "TABLE_HOUSE" ORDER BY  "TABLE_HOUSE".`ID` ASC ");
    
mysql_store_result();
    for(new 
1TOTALHOUSEi++)
    {
        
strmid(BizzInfo[i][bOwner],"The_State",0,strlen("The_State"),24);
    }
    if (
mysql_num_rows() > 0)
    {
        for(new 
idx 1idx <= mysql_num_rows(); idx++)
        {
            
mysql_fetch_row(query);
            
sscanf(query"p<|>iffffffs[24]iiiiis[5]iiiiffffiii",
            
HouseInfo[idx][hID],
            
HouseInfo[idx][hEnterX],
            
HouseInfo[idx][hEnterY],
            
HouseInfo[idx][hEnterZ],
            
HouseInfo[idx][hExitX],
            
HouseInfo[idx][hExitY],
            
HouseInfo[idx][hExitZ],
            
HouseInfo[idx][hOwner],
            
HouseInfo[idx][hValue],
            
HouseInfo[idx][hInt],
            
HouseInfo[idx][hLock],
            
HouseInfo[idx][hOwned],
            
HouseInfo[idx][hTakings],
            
HouseInfo[idx][hClass],
            
HouseInfo[idx][hPaycash],
            
HouseInfo[idx][hMIcon],
            
HouseInfo[idx][hVirtWorld],
            
HouseInfo[idx][hHealme],
            
HouseInfo[idx][hCarX],
            
HouseInfo[idx][hCarY],
            
HouseInfo[idx][hCarZ],
            
HouseInfo[idx][hCarA],
            
HouseInfo[idx][hSafe],
            
HouseInfo[idx][hDrugs],
            
HouseInfo[idx][hMoney]);
            
TOTALHOUSE++;
            
HouseInfo[idx][hRobhouse] = false;
            if (
HouseInfo[idx][hOwned] == 0)
            {
                
HouseInfo[idx][hPickup] = CreatePickup(127323HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ]);
                
HouseInfo[idx][hMIcon] = CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 310, -1, -1, -1100.0);
            }
            if (
HouseInfo[idx][hOwned] == 1)
            {
                
HouseInfo[idx][hPickup] = CreatePickup(127223HouseInfo[idx][hEnterX ], HouseInfo[idx][hEnterY ], HouseInfo[idx][hEnterZ]);
                
HouseInfo[idx][hMIcon] = CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 320, -1, -1, -1100.0);
            }
        }
    }
    
mysql_free_result();
    
printf("---------------------------------------------------------");
    
printf(" [Загрузка домов]: Было загружено - %d потрачено %d (ms)"TOTALHOUSE,GetTickCount() - time);
    return 
1;

Reply
#4

Данная функция тут вообще не вызывается. Я говорил про эти: SetPlayerInt, SetPlayerStr, SetHouseStr, SetHouseInt, UpdateHouseInfo.
Reply
#5

PHP код:
stock SetPlayerInt(username[], stolb[], znach)
{
    new 
Query[128];
    
format(Querysizeof(Query), "UPDATE "TABLE_ACCOUNT" SET  %s = '%i' WHERE ID = '%s' LIMIT 1"stolbznachusername);
    return 
mysql_query(Query);

PHP код:
stock SetPlayerStr(username[], stolb[], znach[])
{
    new 
Query[128];
    
format(Querysizeof(Query), "UPDATE "TABLE_ACCOUNT" SET  %s = '%s' WHERE Name = '%s' LIMIT 1"stolbznachusername);
    return 
mysql_query(Query);

PHP код:
stock SetHouseStr(idxstolb[], znach[])
{
    new 
Query[128];
    
format(Querysizeof(Query), "UPDATE "TABLE_HOUSE" SET  %s = '%s' WHERE `ID` = '%i' LIMIT 1"stolbznachidx);
    return 
mysql_query(Query);

PHP код:
stock SetHouseInt(idxstolb[], znach)
{
    new 
Query[128];
    
format(Querysizeof(Query), "UPDATE "TABLE_HOUSE" SET  %s = '%i' WHERE `ID` = '%i' LIMIT 1"stolbznachidx);
    return 
mysql_query(Query);

PHP код:
UpdateHouseInfo(h)
{
    
DestroyDynamicMapIcon(HouseInfo[h][hMIcon]);
    
DestroyPickup(HouseInfo[h][hPickup]);
    if (
HouseInfo[h][hOwned] == 0)
    {
        
HouseInfo[h][hMIcon] = CreateDynamicMapIcon(HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ], 310, -1, -1, -1150.0);
        
HouseInfo[h][hPickup] = CreatePickup(127323HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ]);
        return 
1;
    }
    else if (
HouseInfo[h][hOwned] == 1)
    {
        
HouseInfo[h][hMIcon] = CreateDynamicMapIcon(HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ], 320, -1, -1, -1150.0);
        
HouseInfo[h][hPickup] = CreatePickup(127223HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ]);
        return 
1;
    }
    return 
1;

Reply
#6


Какая на фиг оптимизация, у тебя на каждую итерацию вызывается от 4 до 6 подзапросов!!!
Reply
#7

Quote:
Originally Posted by Stepashka
Посмотреть сообщение

Какая на фиг оптимизация, у тебя на каждую итерацию вызывается от 4 до 6 подзапросов!!!
То есть все можно использовать в 1 запрос когда они одинаковые?
Например
PHP код:
stock SetHouseInt(idxstolb[], znach

    new 
Query[128]; 
    
format(Querysizeof(Query), "UPDATE "TABLE_HOUSE" SET  %s = '%i' WHERE `ID` = '%i' LIMIT 1"stolbznachidx); 
    return 
mysql_query(Query); 

Reply
#8

Quote:
Originally Posted by Size
Посмотреть сообщение
То есть все можно использовать в 1 запрос когда они одинаковые?
Например
PHP код:
stock SetHouseInt(idxstolb[], znach

    new 
Query[128]; 
    
format(Querysizeof(Query), "UPDATE "TABLE_HOUSE" SET  %s = '%i' WHERE `ID` = '%i' LIMIT 1"stolbznachidx); 
    return 
mysql_query(Query); 

Чего? Кто одинаковые?
Reply
#9

Просто у тебя, когда, например, вызывается SetPlayerInt, то уже 1 запрос идет на MySQL, а у тебя таких много, делай один небольшой запрос..
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)