Другие языки программирования и технологии

Delphi record to string

Я делаю мини онлайн игру, в которой через Socket передаются координаты игроков. Координаты хранятся в переменной типа TCoord=record X,Y,Z:Real; end; Сейчас у меня каждая координата записывается в строку таким образом: text:=FloatToStr(Coord.X)+'|'+FloatToStr(Coord.Y)+'|'+FloatToStr(Coord.Z); где text потом отправляется на игровой сервер. Такой способ вынуждает отправлять длинные сообщения на сервер, например '105,34861|369,28774|10,87367' занимает 28 байт. Сам же тип в оперативной памяти занимает 18 байт. Как конвертировать этот тип в строку (и потом обратно) , чтобы сэкономить на передаче? Может как-то через указатель?
Сл
Слава
1 739
Можно преобразовать число не в десятичную, а в шестнадцатиричную систему. А еще лучше - в систему с как можно большим основанием, которая допустима для сокета.
АД
Алексей Дружинин
75 061
Лучший ответ
Слава Так вот я и хочу передавать байтами (256). Хотелось бы узнать как прочитать эти байты из оперативной памяти, чтобы занести в string
а как будете числа до 32 передавать?
1) данные не хранятся в прямом виде.
2) указатель получить можете через & и поэтому тут целесообразно применить вставку из asm, а потом будете тратить время на обратное преобразрвание на сервере. .
3) можно же передавать RAW данные помимо строк
Передавайте, как бинарные данные, без всяких преобразований.
Алексей Санкин
Алексей Санкин
90 210
Слава Вы сами поняли что написали? Произойдет ошибка несоответствия типов.
Не стоит париться с оптимизацией сейчас.
На этапе разработки нужно использовать тот протокол обмена, который проще отладить.

Разумеется, в исходном коде должна быть заложена возможность корректировки протокола:
1. Выделение протокола передачи, кодирования и декодирования в один модуль.
2. Этих модулей должно быть несколько и нужно подменять динамически, например каждый модуль - своя dll.
3. Должен быть реализован запрос к серверу с версией желаемого протокола.

Оптимизировать небоевую версию протокола - тупо расход времени.
Оптимизация всегда основывается на статистике, и не всегда удастся улучшить ВСЕ аспекты.

Задам вам вопрос:
Если путём кодирования координат "сжать" их длину с 28 до 22 байт, то на сколько % сократиться объём передаваемой информации в целом и на сколько % увеличится нагрузка на сервер для декодирования этого "сжатия"?
И как это повлияет на память, выделяемую на сервере в целом и на каждый из клиентов в отдельности?
JF
John***джон** Fraser
11 112
Слава Отвечаю: как раз мой способ и использует декодирование целых три раза (FloatToStr). А мне нужно всего то занести участок памяти для той переменной в строку, а это мне кажется потребует меньше операций.