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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±

    Оптимизация

    Например, количество домов: 3140 штук. Когда встаёшь на пикап, идёт перебор в 3140 итераций на какой именно ты встал. Можно ли как-то сократить количество итераций? Создавать для каждого итератор и добавлять/удалять дома при входе/выходе зоны стрима мне кажется не очень идея.

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

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

    Хотя тут проще завязать всё на стандартных пикапах. То бишь, игрок встал на пикап => произошёл вызов OnPlayerPickUpPickup => вызвали нужную ячейку массива, высчитав её из ID пикапа. Если пикапы домов создавать только при старте сервера, то для поиска нужной ячейки не потребуется никаких циклов. Достаточно при создании первого пикапа дома записать ID пикапа в какую-то переменную, а дальше значение этой переменной отнимать от ID пикапа. Если полученное значение не меньше 0 и не больше максимального индекса массива домов - вызван пикап дома.
    Последний раз редактировалось DeimoS; 15.06.2019 в 06:23.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  3. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Или можно создавать пикапы с помощью стримера, после чего в каждый из них с помощью функции Streamer_SetIntData записать в поле E_STREAMER_EXTRA_ID (либо, если это поле уже под что-то занято - в любое другое поле, не используемое для пикапов; например в E_STREAMER_COLOR или E_STREAMER_HEALTH) ID соответствующего дома. Так из каждого пикапа можно будет с помощью Streamer_GetIntData узнавать ID нужного дома и, как бонус, отодвинуть ограничение по количеству пикапов.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. Пользователь сказал cпасибо:
    DeimoS (15.06.2019)
  5. #4
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Использовать динамические зоны стримера. А стример, в свою очередь, делит всю карту на квадраты и проверяет только те динамические зоны, которые находятся в том же квадрате, в котором находится игрок, либо в ближайших (ну ещё сортирует координатыи т.п., но это уже не суть).
    Так же можно заюзать w_points, если по какой-то неизвестной причине ты решил не использовать стример.

    Хотя тут проще завязать всё на стандартных пикапах. То бишь, игрок встал на пикап => произошёл вызов OnPlayerPickUpPickup => вызвали нужную ячейку массива, высчитав её из ID пикапа. Если пикапы домов создавать только при старте сервера, то для поиска нужной ячейки не потребуется никаких циклов. Достаточно при создании первого пикапа дома записать ID пикапа в какую-то переменную, а дальше значение этой переменной отнимать от ID пикапа. Если полученное значение не меньше 0 и не больше максимального индекса массива домов - вызван пикап дома.
    Создавать 3140 динамических зон не слишком затратно ли будет? Да, использую динамические пикапы, к сожалению пикапы меняют свой тип при покупки/продажи и не получится использовать последний способ. Спасибо за совет
    Последний раз редактировалось execution; 15.06.2019 в 11:00.

  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Да, использую динамические пикапы, к сожалению пикапы меняют свой тип при покупки/продажи и не получится использовать последний способ.
    Так а в чём проблема при пересоздании пикапа заново записать в него ID дома?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Или можно создавать пикапы с помощью стримера, после чего в каждый из них с помощью функции Streamer_SetIntData записать в поле E_STREAMER_EXTRA_ID (либо, если это поле уже под что-то занято - в любое другое поле, не используемое для пикапов; например в E_STREAMER_COLOR или E_STREAMER_HEALTH) ID соответствующего дома. Так из каждого пикапа можно будет с помощью Streamer_GetIntData узнавать ID нужного дома и, как бонус, отодвинуть ограничение по количеству пикапов.
    Спасибо за совет, очень помогли.

    Ещё вопросик: При удалении данного пикапа, нужно в ручную удалять значение через Streamer_RemoveArrayData или они автоматически удалятся?

    - - - Добавлено - - -

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Так а в чём проблема при пересоздании пикапа заново записать в него ID дома?
    Поздно увидел ваш ответ.

    Не знал об данной функции.
    Последний раз редактировалось execution; 15.06.2019 в 11:04.

  8. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Создавать 3140 динамических зон не слишком затратно ли будет?
    Нет. Хотя лучше воспользоваться любым другим из вариантов, связанным с пикапами. Если не планируется создавать/удалять дома во время работы сервера, то я бы лучше воспользовался вариантом, который предложил я (записывать ID первого пикапа домов при создании и потом отнимать от ID пикапа, который будет выводить OnPlayerPickUpDynamicPickup). Кода будет меньше (соответственно, проще будет его поддерживать) и отнять значение одной переменной от другой - всяко быстрее, чем вызывать функцию плагина. А если понадобиться создать/удалить дома, достаточно просто будет сделать рестарт сервера.
     Хотя можно и без рестарта
    Для этого достаточно просто сделать функцию, в которую помещать вызов всего кода, который так или иначе создаёт пикапы (загрузку домов и т.п.). Далее просто вызвать сначала
    1. DestroyAllDynamicPickups();

    а потом ту функцию, по новой загрузив все данные и пересоздав все пикапы.

    Либо же написать отдельно функцию, которая не будет трогать никакую информацию из систем, кроме информации о пикапах. То бишь, функция будет выгружать из базы только координаты пикапов и сразу же их создавать, просто обновляя информацию о пикапах. И это, опять же, только если бы требовалось часто удалять/создавать дома. Но я не думаю, что тебе оно потребуется. Гораздо проще просто в таких ситуациях делать рестарт.


    Но и вариант, предложенный Daniel_Cortez, тоже имеет место быть. Всё зависит от того, что тебе потребуется.

    Цитата Сообщение от execution Посмотреть сообщение
    При удалении данного пикапа, нужно в ручную удалять значение через Streamer_RemoveArrayData или они автоматически удалятся?
    Нет, не нужно. Даже если бы информация не удалялась автоматически, хуже от этого не станет: информация либо не будет использоваться, либо просто перезапишется.
    Последний раз редактировалось DeimoS; 15.06.2019 в 11:20.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если не планируется создавать/удалять дома во время работы сервера, то я бы лучше воспользовался вариантом, который предложил я (записывать ID первого пикапа домов при создании и потом отнимать от ID пикапа, который будет выводить OnPlayerPickUpDynamicPickup). Кода будет меньше (соответственно, проще будет его поддерживать) и отнять значение одной переменной от другой - всяко быстрее, чем вызывать функцию плагина. А если понадобиться создать/удалить дома, достаточно просто будет сделать рестарт сервера.
    Наверное не так поняли меня. Я не могу воспользоваться вашим вариантом не потому, что я создаю дома или их удаляю из игры. А, например, при загрузке я создаю пикап для входа и для выхода в дом. Когда игрок покупает - необходимо изменить модель пикапа для входа. Поэтому придётся удалить пикап и заново его создать с нужной моделью. Если игрок меняет интерьер своего дома, соответственно координаты пикапа выхода меняются и тут так-же само необходимо удалить пикап и создать на нужных координатах.

    Поэтому в таких случая, я думаю, не подойдёт вариант с удалением всех пикапов дома и загрузки обратно, и вариант с "записывать ID первого пикапа домов при создании и потом отнимать от ID пикапа, который будет выводить OnPlayerPickUpDynamicPickup".

  10. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Когда игрок покупает - необходимо изменить модель пикапа для входа. Поэтому придётся удалить пикап и заново его создать с нужной моделью.
    Модель пикапа заменяется через всё ту же функцию Streamer_SetIntData. Вот так:
    1. Streamer_SetIntData(STREAMER_TYPE_PICKUP, pickupid, E_STREAMER_MODEL_ID, /*Тут ID модели пикапа*/);



    Цитата Сообщение от execution Посмотреть сообщение
    Если игрок меняет интерьер своего дома, соответственно координаты пикапа выхода меняются и тут так-же само необходимо удалить пикап и создать на нужных координатах.
    Вообще гораздо логичнее создать один пикап для интерьера на все виртуальные миры (указать "-1" в качестве вирт.мира или же указать конкретные виртуальные миры, создав пикап через CreateDynamicPickupEx), а не плодить 3140 пикапов для разных виртуальных миров.
    Но даже в этом случае можно всё так же воспользоваться функциями изменения данных о пикапе. В данном случае - Streamer_SetFloatData.
    Менять уже вот эти параметры:
    1. E_STREAMER_X,
    2. E_STREAMER_Y,
    3. E_STREAMER_Z,
    4. E_STREAMER_R_X,
    5. E_STREAMER_R_Y,
    6. E_STREAMER_R_Z,


    Может быть такое, что игрок не увидит изменений, пока не подвигается. Это исправляется вызовом функции
    1. Streamer_Update(playerid, STREAMER_TYPE_PICKUP);



    Вообще советую получше изучить функционал стримера :) Это далеко не только "волшебный плагин, который как-то позволяет создавать много объектов/пикапов/etc...". Можно начать вот с этой статьи. А потом перейти на официальный форум, найдя там тему, в которой опубликован стример + почитать описание функций на GitHub.
    Умелая работа с функционалом стримера может сильно упростить жизнь и помочь оптимизировать код.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  11. #10
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Вообще гораздо логичнее создать один пикап для интерьера на все виртуальные миры (указать "-1" в качестве вирт.мира или же указать конкретные виртуальные миры, создав пикап через CreateDynamicPickupEx), а не плодить 3140 пикапов для разных виртуальных миров.
    Тогда я не совсем понимаю как мне нужно будет отследить на какой пикап я встал, дабы получить ид дома. Ведь в этом случае не сработает вариант с отниманием от ид пикапа на который встал - ид 0 созданного для дома, и не сработает вариант от ДК

 

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

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

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

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

Ваши права

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