Вход

Просмотр полной версии : [Вопрос] Как упаковать координаты, быстро и легально?



LowRider
07.06.2017, 20:37
Хочу упаковать координаты например такого вида:


SetPlayerPos(playerid, 1461.6449, -1717.6471, 14.0469)

Можно наверное вставлять их в массив и там упаковывать а потом использовать где надо, но можно еще как то лучше это сделать?

DeimoS
08.06.2017, 09:52
А зачем?

vovandolg
08.06.2017, 10:16
#define MAX_COUNT_COORD (100) // максимальное кол-во ячеек с координатами
#define COUNT_PACK_COORD (3) // кол-во значений в одной ячейке (x, y, z) = 3

new coord_save[MAX_COUNT_COORD][COUNT_PACK_COORD] =
{
{ 0.0, 0.0, 5.0 },
{ 2.0, 2.0, 5.0 }
};

// ну и примеры вывода/ввода информации ячеек
// юзаем первую строку координат для спавна
SetPlayerPos(playerid, coord_save[0][0], coord_save[0][1], coord_save[0][2]);

// записываем в первую(нулевую) ячейку координаты
coord_save[0][0] = x;
coord_save[0][1] = y;
coord_save[0][2] = z;

VVWVV
08.06.2017, 11:49
Упаковать их более лучше не получится, поскольку все вещественные числа занимают полностью 4 байта, следовательно, упаковать их можно только в массив. Однако помните, что скорость к двумерному массиву меньше, чем скорость к одномерному. Таким образом, вы можете упаковать их в один массив.



const COUNT_PACK=3;
new array[MAX_ITEMS] = {0.0, 0.0, 5.0, 2.0, 2.0, 5.0};

new index;
SetPlayerPos(playerid, array[index], array[index+1], array[index+2]);

// Для перехода к другому элементу.
index += COUNT_PACK;

array[index] = x;
array[index+1] = y;
array[index+2] = z;


К тому же, можно сделать макросы, которые помогут вам.


#define GetPackedArrayX(%1,%2) (%1[(%2)])
#define GetPackedArrayY(%1,%2) (%1[(%2)+1])
#define GetPackedArrayZ(%1,%2) (%1[(%2)+2])
#define SetPackedArrayX(%1,%2,%3) (%1[(%2)] = (%3))
#define SetPackedArrayY(%1,%2,%3) (%1[(%2)+1] = (%3))
#define SetPackedArrayZ(%1,%2,%3) (%1[(%2)+2] = (%3))
#define GetNextPackedItem(%1) ((%1) + COUNT_PACK)

DeimoS
08.06.2017, 14:40
Сейчас бы убивать читаемость и усложнять код ради сохранения десятка байт -_-

vovandolg
08.06.2017, 19:15
Однако помните, что скорость к двумерному массиву меньше, чем скорость к одномерному. Таким образом, вы можете упаковать их в один массив.

А там разве не одинаково будет если работать на прямую по указанной ячейке?
И откуда такие данные что одномерный быстрее двумерного, с плюсов или откуда?

VVWVV
08.06.2017, 20:51
А там разве не одинаково будет если работать на прямую по указанной ячейке?
И откуда такие данные что одномерный быстрее двумерного, с плюсов или откуда?

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

vovandolg
10.06.2017, 19:15
Тогда ещё для понятности писать так =)


new array[MAX_ITEMS] =
{
0.0, 0.0, 5.0,
2.0, 2.0, 5.0
};