ASI FPSUP: OptimizeSampLoops

SR_team

like pancake
Автор темы
BH Team
4,803
6,475
Версия SA-MP
  1. 0.3.7-R3
Плагин оптимизирует работу с пулами сампа, убирая не нужные циклы. Вместо использования циклов для поиска id, плагин расширяет игровые структуры и записывает id в них.

Если вы разработчик, то вы можете оптимизировать свой код, используя поиск id сущностей через функции SAMP'а:
Оригинальная сигнатура:
WORD __thiscall PlayerPool::findByGTAPed(struct PlayerPool *this, struct CPed *gta_ped)
Но оптимизированную функцию можно вызвать с упрощенной сигнатурой
Упрощенная сигнатура:
WORD __stdcall findByGTAPed(struct CPed *gta_ped)
Адресс функции R1: 0x10420
Адресс функции R3: 0x13570
Оригинальная сигнатура:
WORD __thiscall ActorPool::findByGTAPed(struct PlayerPool *this, struct CPed *gta_ped)
Но оптимизированную функцию можно вызвать с упрощенной сигнатурой
Упрощенная сигнатура:
WORD __stdcall findByGTAPed(struct CPed *gta_ped)
Адресс функции R1 и R3: 0x18A0
Оригинальная сигнатура:
WORD __thiscall ObjectPool::findByGTAObject(struct PlayerPool *this, struct CObject *gta_object)
Но оптимизированную функцию можно вызвать с упрощенной сигнатурой
Упрощенная сигнатура:
WORD __stdcall findByGTAObject(struct CObject *gta_object)
Адресс функции R1: 0xF560
Адресс функции R3: 0x126C0
Оригинальная сигнатура:
WORD __thiscall ObjectPool::getVehicleId(struct PlayerPool *this, struct CVehicle *gta_vehicle)
Но оптимизированную функцию можно вызвать с упрощенной сигнатурой
Упрощенная сигнатура:
WORD __stdcall getVehicleId(struct CVehicle *gta_vehicle)
Адресс функции R1: 0x1B0A0
Адресс функции R3: 0x1E440

Плагин экспортирует функции для получения id, без обращения к пулам сампа (см архив dev.zip):
Для C и lua FFI:
// Типы
typedef int16_t ped_id_t;
typedef int16_t vehicle_id_t;
typedef int16_t object_id_t;

#define INVALID_PED_ID ( ( ped_id_t ) - 1 )
#define INVALID_VEHICLE_ID ( ( vehicle_id_t ) - 1 )
#define INVALID_OBJECT_ID ( ( object_id_t ) - 1 )


// Функции
ped_id_t OptimizeSampPools__get_ped_id( void *ped );
vehicle_id_t OptimizeSampPools__get_vehicle_id( void *vehicle );
object_id_t OptimizeSampPools__get_object_id( void *object );
C++:
namespace OptimizeSampPools {
    // Типы
    using ped_id_t = int16_t;
    using vehicle_id_t = int16_t;
    using object_id_t = int16_t;
 
    static constexpr ped_id_t INVALID_PED_ID = -1;
    static constexpr vehicle_id_t INVALID_VEHICLE_ID = -1;
    static constexpr object_id_t INVALID_OBJECT_ID = -1;
 
 
    // Функции
    ped_id_t get_ped_id( void *ped );
    vehicle_id_t get_vehicle_id( void *vehicle );
    object_id_t get_object_id( void *object );
} // namespace OptimizeSampPools

На данный момент оптимизированы поиски id для:
  • игроков
  • актеров
  • объектов
  • машин
Поддерживаемые версии сампа: R1, R3

Исходники:
 

Вложения

  • OptimizeSampLoops.asi
    61 KB · Просмотры: 118
  • dev.zip
    826.1 KB · Просмотры: 32
Последнее редактирование:
D

deleted-user-422095

Гость
Обычному человеку это полезно?
 

SR_team

like pancake
Автор темы
BH Team
4,803
6,475

dendy.

Активный
349
65
На монсере дм локация 100 без скрипта: 35-36 иногда 37fps
Со скриптом: 35-41fps при том что открыто 2 гта в одной на цр а в другой на монсере.
Так и не понял что он дает
 

chapo

чопа сребдс // @moujeek
Модератор
8,868
11,572
На монсере дм локация 100 без скрипта: 35-36 иногда 37fps
Со скриптом: 35-41fps при том что открыто 2 гта в одной на цр а в другой на монсере.
Так и не понял что он дает
ты ожидал + 100 фпс что ли? это немного не так работает
 

Rei

Известный
Друг
1,611
1,668
есть замеры сколько оригинальная и патченная функция выполняется? и как часто эти функции вызываются
 
  • Нравится
Реакции: Slivshik

SR_team

like pancake
Автор темы
BH Team
4,803
6,475
есть замеры сколько оригинальная и патченная функция выполняется? и как часто эти функции вызываются
Конкретно функция с игроками, которая сейчас оптимизирована вызывается всегда, когда целишься. Самп берет объект в который ты целишься и пытается из него получить id игрока, даже если это не игрок - плагин оптимизирует это. В будущем будет больше оптимизаций - добавим машины, актеров, объекты и начнем переписывать встроенные циклы, что бы вместо кучи циклов самп использовал игровые пуллы
 
D

deleted-user-422095

Гость
Конкретно функция с игроками, которая сейчас оптимизирована вызывается всегда, когда целишься. Самп берет объект в который ты целишься и пытается из него получить id игрока, даже если это не игрок - плагин оптимизирует это. В будущем будет больше оптимизаций - добавим машины, актеров, объекты и начнем переписывать встроенные циклы, что бы вместо кучи циклов самп использовал игровые пуллы
а health = getCharHealth(Ped ped) таким образом заработает?