Вопросы

#define ShowPlayerInventory(%0)         ShowPlayerDialog(%0, 5300, DIALOG_STYLE_LIST, "тут типа текст", "Выбрать", "Отмена")

или

stock ShowPlayerHouseMenu(playerid)
{
    #define ShowPlayerInventory(%0)         ShowPlayerDialog(%0, 5300, DIALOG_STYLE_LIST, "тут типа текст", "Выбрать", "Отмена")
    return 1;
}

Оно используется одинаково, хотелось бы знать какой вариант будет лучше по оптимизации.

Поделиться сообщением


Ссылка на сообщение

4 ответа на этот вопрос

  • 0

По оптимизации примерно без разницы, если дело именно выиграть спор, то вариант с #define отработает за N ед. времени, вариант с stock отработает за M ед. времени.

В результате M должен быть больше чем N (при прочих равных), т.е. номинально вариант со stock медленнее, на практике без разницы. 

Поделиться сообщением


Ссылка на сообщение
  • 0

@f0295655, может быть Вы имели в виду это?
 

stock ShowPlayerInventory(playerid)
{
    ShowPlayerDialog(playerid, 5300, DIALOG_STYLE_LIST, "тут типа текст", "Выбрать", "Отмена")
    return 1;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@Jawn Ой, да, перепутал когда писал тему ._.

Поделиться сообщением


Ссылка на сообщение
  • 0

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

  1. Не будет никаких проблем, связанных с тем, что вы используете макрос до того, как объявили его.
  2. При использовании макроса строка "тут типа текст" каждый раз будет подставляться препроцессором в нужные участки кода, а затем помещаться в память (то есть в памяти обнаружится большое количество одинаковых строк). При использовании функции строка лишь единожды попадет в память.
  3. Вызов функции действительно отнимает некоторые доли секунды, но эти доли настолько малы и ничтожны... Вы можете измерить время самостоятельно и убедиться, что время вызова даже миллиона таких функций ничтожно мало.
  4. В функции вы получаете возможность управлять передаваемыми данными (добавлять при необходимости проверки) и результирующими данными (возвращать нужные вам значения, которыми затем оперировать).

Есть диалоговый процессор mdialog. В нем реализована как раз эта идея. Присмотритесь, возможно, Вам это понравится.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Денис0403
      От Денис0403
      При вводе команды /fly спавнит в непонятном месте.
      Скрин: https://imgur.com/a/jOkD7sl
      cmd:fly(playerid) return SetPlayerFlyStatus(playerid, 2); #if defined _included_fly     #endinput #endif #define _included_fly static     Float:fly_x[MAX_PLAYERS],     Float:fly_y[MAX_PLAYERS],     Float:fly_z[MAX_PLAYERS],     Float:fly_a[MAX_PLAYERS],     fly_world[MAX_PLAYERS],     fly_int[MAX_PLAYERS],     bool:fly_spawn[MAX_PLAYERS],     fly_state[MAX_PLAYERS],     fly_object[MAX_PLAYERS],     fly_last_move[MAX_PLAYERS],     fly_mode[MAX_PLAYERS],     fly_last_ud[MAX_PLAYERS],     fly_last_lr[MAX_PLAYERS],     Float:fly_accelmul[MAX_PLAYERS]; enum {     CAMERA_MODE_NONE    = 0,     CAMERA_MODE_FLY     = 1,     CAMERA_MODE_REVERSE = 2 }; enum {     MOVE_FORWARD = 1,     MOVE_BACK,     MOVE_LEFT,     MOVE_RIGHT,     MOVE_FORWARD_LEFT,     MOVE_FORWARD_RIGHT,     MOVE_BACK_LEFT,     MOVE_BACK_RIGHT }; const     Float:MOVE_SPEED = 100.0,     Float:ACCEL_RATE = 0.03; public OnPlayerConnect(playerid) {     fly_x[playerid] = 0.0;     fly_y[playerid] = 0.0;     fly_z[playerid] = 0.0;     fly_a[playerid] = 0.0;     fly_world[playerid] = 0;     fly_int[playerid] = 0;     fly_state[playerid] = CAMERA_MODE_NONE;     fly_object[playerid] = -1,     bool:fly_spawn[playerid] = false;     fly_last_move[playerid] = 0;     fly_mode[playerid] = 0;     fly_last_ud[playerid] = 0;     fly_last_lr[playerid] = 0;     fly_accelmul[playerid] = 0.0;     #if defined _included_fly_OnPlayerConnect         return _included_fly_OnPlayerConnect(playerid);     #else         return 1;     #endif } #if defined _ALS_OnPlayerConnect     #undef OnPlayerConnect #else     #define _ALS_OnPlayerConnect #endif #define OnPlayerConnect _included_fly_OnPlayerConnect #if defined _included_fly_OnPlayerConnect     forward _included_fly_OnPlayerConnect(playerid); #endif stock SetPlayerFlyStatus(playerid, status = 2) {     if(status == CAMERA_MODE_FLY && fly_state[playerid] == CAMERA_MODE_FLY)         return true;     else if(status == CAMERA_MODE_NONE && fly_state[playerid] == CAMERA_MODE_NONE)         return true;     switch(status)     {         case CAMERA_MODE_NONE:         {             CancelEdit(playerid);             GetPlayerCameraPos(playerid, fly_x[playerid], fly_y[playerid], fly_z[playerid]);             TogglePlayerSpectating(playerid, false);             fly_state[playerid] = CAMERA_MODE_NONE;             fly_spawn[playerid] = true;                  }         case CAMERA_MODE_FLY:         {             GetPlayerPos(playerid, fly_x[playerid], fly_y[playerid], fly_z[playerid]);             fly_world[playerid] = GetPlayerVirtualWorld(playerid);             fly_int[playerid] = GetPlayerInterior(playerid);             GetPlayerFacingAngle(playerid, fly_a[playerid]);             fly_object[playerid] = CreatePlayerObject(playerid, 19300, fly_x[playerid], fly_y[playerid], fly_z[playerid], 0.0, 0.0, 0.0);             TogglePlayerSpectating(playerid, true);             AttachCameraToPlayerObject(playerid, fly_object[playerid]);             fly_state[playerid] = CAMERA_MODE_FLY;         }         case CAMERA_MODE_REVERSE:         {             if(fly_state[playerid] == CAMERA_MODE_NONE)                 return SetPlayerFlyStatus(playerid, CAMERA_MODE_FLY);             else                 return SetPlayerFlyStatus(playerid, CAMERA_MODE_NONE);         }         default:             return SendClientMessage(playerid, -1, "Your argument is not valid.") & 0;     }     return 1; } stock IsPlayerFlying(playerid)     return fly_state[playerid];      public OnPlayerDeath(playerid, killerid, reason) {     if(IsPlayerFlying(playerid))         SetPlayerFlyStatus(playerid, false);     #if defined _included_fly_OnPlayerDeath         return _included_fly_OnPlayerDeath(playerid, killerid, reason);     #else         return 1;     #endif } #if defined _ALS_OnPlayerDeath     #undef OnPlayerDeath #else     #define _ALS_OnPlayerDeath #endif #define OnPlayerDeath _included_fly_OnPlayerDeath #if defined _included_fly_OnPlayerDeath     forward _included_fly_OnPlayerDeath(playerid, killerid, reason); #endif public OnPlayerSpawn(playerid) {     if(fly_spawn[playerid] == true)         SetTimerEx("@OnPlayerSpawnEx", 100, false, "i", playerid);          #if defined _included_fly_OnPlayerSpawn         return _included_fly_OnPlayerSpawn(playerid);     #else         return 1;     #endif } #if defined _ALS_OnPlayerSpawn     #undef OnPlayerSpawn #else     #define _ALS_OnPlayerSpawn #endif #define OnPlayerSpawn _included_fly_OnPlayerSpawn #if defined _included_fly_OnPlayerSpawn     forward _included_fly_OnPlayerSpawn(playerid); #endif @OnPlayerSpawnEx(playerid); @OnPlayerSpawnEx(playerid) {     SetPlayerPos(playerid, fly_x[playerid], fly_y[playerid], fly_z[playerid]);     SetPlayerFacingAngle(playerid, fly_a[playerid]);     SetPlayerVirtualWorld(playerid, fly_world[playerid]);     SetPlayerInterior(playerid, fly_int[playerid]);     fly_spawn[playerid] = false;     return 1; } public OnPlayerUpdate(playerid) {     if(fly_state[playerid] == CAMERA_MODE_FLY)     {         new keys, ud, lr;         GetPlayerKeys(playerid, keys, ud, lr);                  if(fly_mode[playerid] && (GetTickCount() - fly_last_move[playerid] > 100))             MoveCamera(playerid);         if(fly_last_ud[playerid] != ud || fly_last_lr[playerid] != lr)         {             if((fly_last_ud[playerid] != 0 || fly_last_lr[playerid] != 0) && ud == 0 && lr == 0)             {                 StopPlayerObject(playerid, fly_object[playerid]);                 fly_mode[playerid] = 0;                 fly_accelmul[playerid] = 0.0;             }             else             {                 fly_mode[playerid] = GetMoveDirectionFromKeys(ud, lr);                 MoveCamera(playerid);             }         }         fly_last_ud[playerid] = ud;         fly_last_lr[playerid] = lr;         return 0;     }     #if defined _included_fly_OnPlayerUpdate         return _included_fly_OnPlayerUpdate(playerid);     #else         return 1;     #endif } #if defined _ALS_OnPlayerUpdate     #undef OnPlayerUpdate #else     #define _ALS_OnPlayerUpdate #endif #define OnPlayerUpdate _included_fly_OnPlayerUpdate #if defined _included_fly_OnPlayerUpdate     forward _included_fly_OnPlayerUpdate(playerid); #endif stock MoveCamera(playerid) {     new         Float:cam_pos_x, Float:cam_pos_y, Float:cam_pos_z,         Float:cam_front_x, Float:cam_front_y, Float:cam_front_z;              GetPlayerCameraPos(playerid, cam_pos_x, cam_pos_y, cam_pos_z);     GetPlayerCameraFrontVector(playerid, cam_front_x, cam_front_y, cam_front_z);     if(fly_accelmul[playerid] <= 1)         fly_accelmul[playerid] += ACCEL_RATE;     new         Float:speed = MOVE_SPEED * fly_accelmul[playerid],         Float:x, Float:y, Float:z;              GetNextCameraPosition(fly_mode[playerid], cam_pos_x, cam_pos_y, cam_pos_z, cam_front_x, cam_front_y, cam_front_z, x, y, z);     MovePlayerObject(playerid, fly_object[playerid], x, y, z, speed);     fly_last_move[playerid] = GetTickCount();     return 1; } stock GetNextCameraPosition     (         move_mode,         Float:cam_pos_x, Float:cam_pos_y, Float:cam_pos_z,         Float:cam_front_x, Float:cam_front_y, Float:cam_front_z,         &Float:x, &Float:y, &Float:z     ) {     new const         Float:change = 6000.0,         Float:pos_x = cam_front_x * change,         Float:pos_y = cam_front_y * change,         Float:pos_z = cam_front_z * change;     switch(move_mode)     {         case MOVE_FORWARD:         {             x = cam_pos_x + pos_x;             y = cam_pos_y + pos_y;             z = cam_pos_z + pos_z;         }         case MOVE_BACK:         {             x = cam_pos_x - pos_x;             y = cam_pos_y - pos_y;             z = cam_pos_z - pos_z;         }         case MOVE_LEFT:         {             x = cam_pos_x - pos_y;             y = cam_pos_y + pos_x;             z = cam_pos_z;         }         case MOVE_RIGHT:         {             x = cam_pos_x + pos_y;             y = cam_pos_y - pos_x;             z = cam_pos_z;         }         case MOVE_BACK_LEFT:         {             x = cam_pos_x + (-pos_x - pos_y);             y = cam_pos_y + (-pos_y + pos_x);             z = cam_pos_z - pos_z;         }         case MOVE_BACK_RIGHT:         {             x = cam_pos_x + (-pos_x + pos_y);             y = cam_pos_y + (-pos_y - pos_x);             z = cam_pos_z - pos_z;         }         case MOVE_FORWARD_LEFT:         {             x = cam_pos_x + (pos_x  - pos_y);             y = cam_pos_y + (pos_y  + pos_x);             z = cam_pos_z + pos_z;         }         case MOVE_FORWARD_RIGHT:         {             x = cam_pos_x + (pos_x  + pos_y);             y = cam_pos_y + (pos_y  - pos_x);             z = cam_pos_z + pos_z;         }     } } stock GetMoveDirectionFromKeys(ud, lr) {     new         direction = 0;     if(lr < 0)     {         if(ud < 0)             direction = MOVE_FORWARD_LEFT;         else if(ud > 0)             direction = MOVE_BACK_LEFT;         else             direction = MOVE_LEFT;     }     else if(lr > 0)     {         if(ud < 0)             direction = MOVE_FORWARD_RIGHT;         else if(ud > 0)             direction = MOVE_BACK_RIGHT;         else             direction = MOVE_RIGHT;     }     else if(ud < 0)         direction = MOVE_FORWARD;     else if(ud > 0)         direction = MOVE_BACK;     return direction; }