Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 20
  1. #1
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±

    Мысли по оптимизации кода

    Доброго времени суток.
    Написал систему одну, ну и вижу, что код получился, мягко говоря "не очень"
    Может будут у кого-то мысли по его оптимизации?

    Запрос в БД
    PHP код:
    mysql_function_query(MysqlConnect"SELECT `p_leader`,`online_status`,`nickname` FROM `"TABLE_ACC"`"true"OnCheckLEADCallBack",""); 
    PHP код:
    forward OnCheckLEADCallBack();
    public 
    OnCheckLEADCallBack()
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields,MysqlConnect);
        
    cache_get_row_count(rows);
        if(
    rows == 0) return 1;
        new 
    count[2];
        new 
    online_pl = -1;
        new 
    names_one[MAX_PLAYER_NAME+1];
        new 
    names_two[MAX_PLAYER_NAME+1];
        new 
    pl_leader;
        for(new  
    0rowsi++)
        {
            
    pl_leader cache_get_field_content_int(i,"p_leader",MysqlConnect);
            if(
    pl_leader == 0) continue;
            if(
    count[0] != && count[1] != 0) break;
            if(
    pl_leader == 6)
            {
                
    online_pl cache_get_field_content_int(i,"online_status",MysqlConnect);
                if(
    online_pl == -1cache_get_field_content(i,"nickname",names_one,MysqlConnect,MAX_PLAYER_NAME);
                else 
    GetPlayerName(online_pl,names_one,MAX_PLAYER_NAME);
                
    count[0] ++;
                continue;
            }
            else if(
    pl_leader != 6)
            {
                if(
    count[0] == 0)
                {
                    
    strmid(names_one"Нет"0strlen("Нет"), 4);
                    continue;
                }
            }
            if(
    pl_leader == 8)
            {
                
    online_pl cache_get_field_content_int(i,"online_status",MysqlConnect);
                if(
    online_pl == -1cache_get_field_content(i,"nickname",names_two,MysqlConnect,MAX_PLAYER_NAME);
                else 
    GetPlayerName(online_pl,names_two,MAX_PLAYER_NAME);
                
    count[1] ++;
                continue;
            }
            else if(
    pl_leader != 8)
            {
                if(
    count[1] == 0)
                {
                    
    strmid(names_two"Нет"0strlen("Нет"), 4);
                    continue;
                }
            }
        }
        
    printf("На выходе получаем: Names1: %s | Names2: %s",names_one,names_two);
        return 
    1;


  2. #2
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Что первое в голову пришло

    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rowsfields,
            
    online_pl = -1,
            
    name[2][MAX_PLAYER_NAME+1],
            
    pl_leader;

        
    cache_get_data(rowsfields,MysqlConnect); 
        
    cache_get_row_count(rows); 

        if(
    rows == 0)
            return 
    1

        for(new  
    00rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i,"p_leader",MysqlConnect); 

            if(
    pl_leader == 0)
                continue; 

            if(
    pl_leader == || pl_leader == 8
            { 
                
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

                if (
    online_pl == -1)
                    
    cache_get_field_content(i,"nickname"name[j], MysqlConnectMAX_PLAYER_NAME); 
                else
                    
    GetPlayerName(online_plname[j], MAX_PLAYER_NAME); 

                if (
    strlen(name[j]) == 0)
                    
    strcat(name[j], "Нет");

                
    j++;
            } 
        } 

        
    printf("На выходе получаем: Names1: %s | Names2: %s"name[0], name[1]); 

        return 
    1


  3. Пользователь сказал cпасибо:
    Сергей (09.02.2019)
  4. #3
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Что первое в голову пришло

    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rowsfields,
            
    online_pl = -1,
            
    name[2][MAX_PLAYER_NAME+1],
            
    pl_leader;

        
    cache_get_data(rowsfields,MysqlConnect); 
        
    cache_get_row_count(rows); 

        if(
    rows == 0)
            return 
    1

        for(new  
    00rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i,"p_leader",MysqlConnect); 

            if(
    pl_leader == 0)
                continue; 

            if(
    pl_leader == || pl_leader == 8
            { 
                
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

                if (
    online_pl == -1)
                    
    cache_get_field_content(i,"nickname"name[j], MysqlConnectMAX_PLAYER_NAME); 
                else
                    
    GetPlayerName(online_plname[j], MAX_PLAYER_NAME); 

                if (
    strlen(name[j]) == 0)
                    
    strcat(name[j], "Нет");

                
    j++;
            } 
        } 

        
    printf("На выходе получаем: Names1: %s | Names2: %s"name[0], name[1]); 

        return 
    1

    Суть вот в чём:
    Если вообще не найдено игроков с лидерством 6 или 8, значит записываем в name = Нет
    В твоём случае, моя цель достигнута не будет)

    Спасибо большое за Вашу мысль оптимизации)
    Последний раз редактировалось Сергей; 07.02.2019 в 21:29.

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Опиши структуру таблицы (названия столбцов + какие данные хранятся и в каких количествах), а так же то, какой результат ты хочешь получить.

    Если ты просто ищешь двух игроков по определённому условию, то гораздо оптимизированнее будет сделать выборку в запросе, а не выгружать все данные и делать выборку на стороне сервера.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    Сергей (09.02.2019)
  7. #5
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Опиши структуру таблицы (названия столбцов + какие данные хранятся и в каких количествах), а так же то, какой результат ты хочешь получить.

    Если ты просто ищешь двух игроков по определённому условию, то гораздо оптимизированнее будет сделать выборку в запросе, а не выгружать все данные и делать выборку на стороне сервера.
    Я хотел получить двух игроков, просто далее, я намерен использовать диалог, где буду использовать их ники, если же, игроков с данными лидерками найдено не будет, вместо ника в диалоговом окне будет показано "Нет"
    Названия столбцов сами за себя говорят.

  8. #6
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    PHP код:
    "SELECT `p_leader`,`online_status`,`nickname` FROM `"TABLE_ACC"` WHERE `p_leader` != '0'" 
    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rows,
            
    fields,
            
    online_pl,
            
    pl_leader,
            
    name[MAX_PLAYER_NAME+1],
            
    string[MAX_PLAYER_NAME*10];

        
    cache_get_data(rowsfieldsMysqlConnect); 

        if(
    rows == 0)
            return 
    1

        for(new 
    0rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i"p_leader"MysqlConnect); 
            
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

            if (
    online_pl == -1)
                
    cache_get_field_content(i"nickname"nameMysqlConnectMAX_PLAYER_NAME); 
            else
                
    GetPlayerName(online_plnameMAX_PLAYER_NAME);

            if (
    != 0)
                
    strcat(string"\n");
            
    strcat(stringname);

        } 

        
    printf("%s"string); 

        return 
    1

    Последний раз редактировалось m1n1vv; 08.02.2019 в 04:26.

  9. Пользователь сказал cпасибо:
    Сергей (09.02.2019)
  10. #7
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    PHP код:
    "SELECT `p_leader`,`online_status`,`nickname` FROM `"TABLE_ACC"` WHERE `p_leader`!= '0'" 
    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rows,
            
    fields,
            
    online_pl,
            
    pl_leader,
            
    name[MAX_PLAYER_NAME+1],
            
    string[MAX_PLAYER_NAME*10];

        
    cache_get_data(rowsfieldsMysqlConnect); 

        if(
    rows == 0)
            return 
    1

        for(new 
    0rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i"p_leader"MysqlConnect); 
            
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

            if (
    online_pl == -1)
                
    cache_get_field_content(i"nickname"nameMysqlConnectMAX_PLAYER_NAME); 
            else
                
    GetPlayerName(online_plnameMAX_PLAYER_NAME);

            if (
    != 0)
                
    strcat(string"\n");
            
            if (
    strlen(name) != 0)
                
    strcat(stringname);
            else
                
    strcat(string"Нет");
        } 

        
    printf("%s"string); 

        return 
    1

    Последний раз редактировалось m1n1vv; 08.02.2019 в 17:30.

  11. #8
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    PHP код:
    "SELECT `p_leader`,`online_status`,`nickname` FROM `"TABLE_ACC"` WHERE `p_leader`!= '0'" 
    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rows,
            
    fields,
            
    online_pl,
            
    pl_leader,
            
    name[MAX_PLAYER_NAME+1],
            
    string[MAX_PLAYER_NAME*10];

        
    cache_get_data(rowsfieldsMysqlConnect); 

        if(
    rows == 0)
            return 
    1

        for(new 
    0rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i"p_leader"MysqlConnect); 
            
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

            if (
    online_pl == -1)
                
    cache_get_field_content(i"nickname"nameMysqlConnectMAX_PLAYER_NAME); 
            else
                
    GetPlayerName(online_plnameMAX_PLAYER_NAME);

            if (
    != 0)
                
    strcat(string"\n");
            
            if (
    strlen(name) != 0)
                
    strcat(stringname);
            else
                
    strcat(string"Нет");
        } 

        
    printf("%s"string); 

        return 
    1

    Так а если нужны конкретно лидеры 6 и 7 фракции?

  12. #9
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от Сергей Посмотреть сообщение
    Так а если нужны конкретно лидеры 6 и 7 фракции?
    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rows,
            
    fields,
            
    online_pl,
            
    pl_leader,
            
    name[MAX_PLAYER_NAME+1],
            
    string[MAX_PLAYER_NAME*10];

        
    cache_get_data(rowsfieldsMysqlConnect); 

        if(
    rows == 0)
            return 
    1

        for(new 
    0rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i"p_leader"MysqlConnect); 
            
            if (
    pl_leader == || pl_leader == 7)
            {
                
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

                if (
    online_pl == -1)
                    
    cache_get_field_content(i"nickname"nameMysqlConnectMAX_PLAYER_NAME); 
                else
                    
    GetPlayerName(online_plnameMAX_PLAYER_NAME);

                if (
    != 0)
                    
    strcat(string"\n");
                
                if (
    strlen(name) != 0)
                    
    strcat(stringname);
                else
                    
    strcat(string"Нет");
            }
        } 

        
    printf("%s"string); 

        return 
    1


  13. #10
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    PHP код:
    forward OnCheckLEADCallBack(); 
    public 
    OnCheckLEADCallBack() 

        new 
            
    rows,
            
    fields,
            
    online_pl,
            
    pl_leader,
            
    name[MAX_PLAYER_NAME+1],
            
    string[MAX_PLAYER_NAME*10];

        
    cache_get_data(rowsfieldsMysqlConnect); 

        if(
    rows == 0)
            return 
    1

        for(new 
    0rowsi++) 
        { 
            
    pl_leader cache_get_field_content_int(i"p_leader"MysqlConnect); 
            
            if (
    pl_leader == || pl_leader == 7)
            {
                
    online_pl cache_get_field_content_int(i"online_status"MysqlConnect); 

                if (
    online_pl == -1)
                    
    cache_get_field_content(i"nickname"nameMysqlConnectMAX_PLAYER_NAME); 
                else
                    
    GetPlayerName(online_plnameMAX_PLAYER_NAME);

                if (
    != 0)
                    
    strcat(string"\n");
                
                if (
    strlen(name) != 0)
                    
    strcat(stringname);
                else
                    
    strcat(string"Нет");
            }
        } 

        
    printf("%s"string); 

        return 
    1

    Снова не до поняли, вот в моём примере я сделал вот как:
    Ищу лидеров фракций.
    Далее отсеиваю игроков, у которых ячейка p_leader равна 0
    Далее, если нашло лидера Фракции 6 - Я получаю его имя, ровно так-же и с 7 фракцией.
    НО, если игроков с такой лидеркой не нашло, я присваиваю переменной "Нет"

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •