ASI FPSUP: OptimizeSampLoops

WestSide

Новичок
11
4
Проверка на индекс не корректная. Первый созданный для игрока имеет индекс 0 и поэтому он игнорируется в OptimizeSampPools__get_vehicle_id
1730297961224.png

В остальных сущностях так-же.

Еще вопрос. Не нужно ли удалять удалять с вектора адресс при удалении сущности игрой? Он же просто растёт как грибы и при продолжительной игре будет работать в ущерб производительности
1730298312876.png

Залил в шапку плагин с фиксом от @Ignat56
 

SR_team

like pancake
Автор темы
BH Team
4,814
6,511
Проверка на индекс не корректная. Первый созданный для игрока имеет индекс 0 и поэтому он игнорируется в OptimizeSampPools__get_vehicle_id
Спасибо, не заметил, когда правил такое же условие в reset_id.
Еще вопрос. Не нужно ли удалять удалять с вектора адресс при удалении сущности игрой? Он же просто растёт как грибы и при продолжительной игре будет работать в ущерб производительности
Не нужно и не растет. Тут вектор в максимальной своей размерности совпадает с размером игрового пула. На производительность это не влияет.

О том как это работает
В игре есть пул:
C++:
struct CVehiclePool {
    CHeli *objects; // CHeli самый большой класс машин, по этому пул его использует
    flag_t *flags;
    uint32_t size;
};
В этом пуле objects создается примерно так: objects = new CHeli[size]. Т.е. Это динамически аллоцированыей массив, к объектам которого можно обращаться по индексам, как если бы это был статичный пул CHeli objects[size];.

Мои вектора по типу vehicle_ids это аналогичные пулы, где size часть структуры вектора, а вместо CHeli хранится самповский id.
Я хукаю создание объекта сампом, и из указателя CHeli* вычисляю его индекс в пуле. Это очень простая арифметическая операция без перебора: const auto index = vehicle_ptr - pool->objects (по факту в коде еще есть деление, но это потому что я не завез настоящих игровых структур. С ними деление добавил бы компилятор).
После получения индекса я проверяю, что он не выходит за пределы пула, что бы не ресайзить свой пул (vehicle_ids) больше игрового пула.

Ну и оптимизация самповских циклов работает по такому же принципу. По дефолту сам вызывает функцию поиска id, где перебирает все элементы своего пула и сравнивает указатель на игровой объект. Плагин вместо цикла использует вычитание для получения индекса в игровом пуле (const auto index = vehicle_ptr - pool->objects) и далее просто достает id по этому индексу: const auto samp_id = vehicle_ids[index];.




Edit: залил поправленную версию
TODO: пухукать initgame с id локального игрока
 
Последнее редактирование:

WestSide

Новичок
11
4
серверная функция GetPlayerTargetActor срабатывает так-же и на обычных игроков. Клиент посылает взаимодействие. Мне кажется эти баги связаны с тем, что у игроков и актёров общий пул
 

kyrtion

Известный
1,131
408
Зашел на самп или евольв, там объекты которые ставят прозрачным, не пропадают - это не должно быть
Обычно без оптимизации плагина, после установки объектов от сервера и убирает для 3д текст - объекты становится прозрачным

Без плагина:
1736587784726.png
С плагином:
1736587871626.png

Справки:
SAMPFUNCS v5.5.0 rel.22 (SA-MP 0.3.7 R3-1)
Compiled: Jan 10 2022 04:13:37
 

Hamsi

Новичок
1
0
Eklenti, gereksiz döngüleri kaldırarak örnek havuzlarıyla çalışmayı optimize eder. Eklenti, id'leri bulmak için döngüler kullanmak yerine oyun yapılarını genişletiyor ve id'leri bunların içine yazıyor.

Eğer bir geliştiriciyseniz, SAMP fonksiyonları aracılığıyla varlık kimliği aramasını kullanarak kodunuzu optimize edebilirsiniz:
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall PlayerPool::findByGTAPed(struct PlayerPool *this, struct CPed *gta_ped)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall findByGTAPed(struct CPed *gta_ped)[/KOD]
İşlev adresi R1: 0x10420
İşlev adresi R3: 0x13570
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall ActorPool::findByGTAPed(struct PlayerPool *this, struct CPed *gta_ped)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall findByGTAPed(struct CPed *gta_ped)[/KOD]
R1 ve R3 fonksiyonlarının adresi : 0x18A0
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall ObjectPool::findByGTAObject(struct PlayerPool *this, struct CObject *gta_object)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall findByGTAObject(struct CObject *gta_object)[/KOD]
Fonksiyon adresi R1: 0xF560
İşlev adresi R3: 0x126C0
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall ObjectPool::getVehicleId(struct PlayerPool *this, struct CVehicle *gta_vehicle)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall getVehicleId(struct CVehicle *gta_vehicle)[/KOD]
Fonksiyon adresi R1: 0x1B0A0
İşlev adresi R3: 0x1E440

Eklenti, örnek havuzlarına erişmeden kimlik elde etmek için işlevleri dışa aktarır ( dev.zip arşivine bakın ):
[KOD lang="c" title="C ve lua FFI için"]// Türler
typedef int16_t ped_id_t;
typedef int16_t araç_kimliği_t;
typedef int16_t nesne_kimliği_t;

#DEFINE GEÇERSİZ_PED_KİMLİĞİ ( (ped_kimliği_t) - 1)
#define INVALID_VEHICLE_ID ( (araç_kimliği_t) - 1)
#define GEÇERSİZ_NESNE_KIMLIĞI ( ( nesne_kimliği_t ) - 1 )


// Fonksiyonlar
ped_id_t OptimizeSampPools__get_ped_id( void *ped );
araç_kimliği_t OptimizeSampPools__get_vehicle_id( void *araç );
nesne_kimliği_t OptimizeSampPools__get_object_id( void *nesne );[/KOD]
[KOD=cpp]ad alanıOptimizeSampPools {
// Türler
ped_id_t = int16_t kullanılarak;
vehicle_id_t = int16_t kullanılarak;
object_id_t = int16_t kullanılarak;

statik constexpr ped_id_t GEÇERSİZ_PED_KIMLIĞI = -1;
statik constexpr vehicle_id_t GEÇERSİZ_ARAÇ_KIMLIĞI = -1;
statik constexpr nesne_kimliği_t GEÇERSİZ_NESNE_KIMLIĞI = -1;


// Fonksiyonlar
ped_id_t ped_id'yi_al( void *ped );
araç_kimliği_t araç_kimliğini_al( void *araç );
nesne_kimliği_t nesne_kimliğini_al( void *nesne );
} // ad alanı OptimizeSampPools[/KOD]

Şu anda kimlik aramaları şunlar için optimize edilmiştir:
  • oyuncular
  • aktörler
  • nesneler
  • makineler
Desteklenen örnek sürümleri: R1, R3

Kaynaklar:
LPlease release in 0.3dl R1 🗽