|
|
|
Железный канал: «C, С++» |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 1(2) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
AnrDaemon : |
C какой целью ты рассчитываешь "точный размер отправляемого пакета"?
|
очевидно чтобы не засирать сеть мелкими пакетами
есть writev() которое умеет из кусочков памяти собирать стрим
З.Ы. хотел ещё отметиться по предыдущей задаче, есть клёвый tool, называется ct-ng, в частности эпики юзают этот crosstoolchain в "канадском" варианте, когда на линухе собирается таргет для mingw который в свою очередь должен собирать таргет на линухе
_________________ This is what you get ...
(c) Radiohead
Последний раз редактировалось: Sh.Tac. (02:56 24-08-2014), всего редактировалось 1 раз |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Sh.Tac. : |
есть клёвый tool, называется ct-ng
|
лучше make все равно ничего не придумали
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
ТехноМаг : |
Content-Length уже дааавно не обязателен
|
Content-Length НИКОГДА не был обязателен. И сейчас он не обязателен, как и всегда.
Я тебе больше скажу - сейчас даже "Content-Transfer-Encoding: chunked" можно не указывать, так как подавляющим большинством браузеров она принимается по умолчанию.
ТехноМаг : |
с картинкой-то понятно. Там размер сразу известен.
А вот с остальным текстовым уно черт поймет
|
Не поминай чёрта всуе.
Берёшь стандарт, читаешь. А там английским по серому написано, что от тебя требуется три вещи:
1. Посылать строки заголовка целыми пакетами.
2. Отправить правильную строку статуса.
3. Послать после заголовка пустую строку.
Дальше можешь делать что угодно. То есть вообще.
_________________ Люблю свободный полёт... :)
Последний раз редактировалось: AnrDaemon (03:11 24-08-2014), всего редактировалось 1 раз |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
AnrDaemon : |
делать что угодно. То есть вообще.
|
ты это уже говорил, и я собсно уже таким магаром переписываю.
Пошел пингвинов размножать
AnrDaemon : |
Не поминай чёрта всуе.
|
бытует мнение, что все зло вот в этих 3х строк:
#define MC_START 0x0A
#define MC_STOP 0x2C
#define MC_STAT 0x2A
а вообще 42 всем.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (03:32 24-08-2014), всего редактировалось 2 раз(а) |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Замечательный инструмент Wireshark. Показывает всё самое интересное про общение в сети.
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
В общем все получилось, всем спасибо. Осталось только нормально POST научить обрабатывать (с Escape, я имею ввиду, но это не сложно)
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Советую найти подходящую стандартную библиотеку и не морочиться.
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
AnrDaemon : |
Советую найти подходящую стандартную библиотеку
|
ну под Си их кот наплакал, и как правило они тянут за собой туеву кучу зависимостей. Тут одно из условий заказа - скопировал, запустил, профит...
Да и поздно уже. Написал уже все что нужно...
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Статическую линковку ещё никто не отменял
Как в итоге краши вылечил?
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
NOSIGNAL и в инициализатор еще хендл на SIGTERM поставил.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Endeavour 1015 EGP
Рейтинг канала: 6(322) Репутация: 105 Сообщения: 7041 Откуда: guess Зарегистрирован: 26.05.2005 |
|
ТехноМаг : |
ну под Си их кот наплакал
|
curl? Пользовался немного, оно работает™
edit: я так и думал, что где-то ступил %)
Последний раз редактировалось: Endeavour (19:16 26-08-2014), всего редактировалось 1 раз |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
cURL это клиентская библиотека. Человек же сервер пишет.
Может, каких-то функций из неё можно надёргать, но общее предназначение библиотеки не в этом.
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
И снова я, и с глупым вопросом.
кратко:
Дано 8 кубов со стороной GalaxyClusterSize в массиве
0 - центр - 1 +-x 2 +-y 3+-z 4+-xy 5+-xz 6+-yz 7+-xyz
Надо - динамически проверять где находится игрок, и в случае его перехода из одного куба в другой менять их в массиве местами. Делаю так:
Cкрытый текст (кликните здесь для просмотра)
Код: |
void ALGalaxy::UpdateClustersInLocation(FVector Location)
{
FGalaxyCluster _c;
float x, y, z;
x = (Location.X - _Clusters[0].CoordX) / GalaxyClusterSize;
y = (Location.Y - _Clusters[0].CoordY) / GalaxyClusterSize;
z = (Location.Z - _Clusters[0].CoordZ) / GalaxyClusterSize;
if (abs(x) > 0.25f) {
if (_Clusters[1].IdX != _Clusters[0].IdX + (abs(x) / x))
_Clusters[1] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY, _Clusters[0].IdZ);
}
else {
//Free Stars in Cluster
FreeStars(&_Clusters[1]);
}
if (abs(y) > 0.25f) {
if (_Clusters[2].IdY != _Clusters[0].IdY + (abs(y) / y))
_Clusters[2] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ);
}
else {
FreeStars(&_Clusters[2]);
}
if (abs(z) > 0.25f) {
if (_Clusters[3].IdZ != _Clusters[0].IdZ + (abs(z) / z))
_Clusters[3] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY, _Clusters[0].IdZ + (abs(z) / z));
}
else {
FreeStars(&_Clusters[3]);
}
//additions
if (abs(x) > 0.25f && abs(y) > 0.25f) {
if (_Clusters[4].IdX != _Clusters[0].IdX + (abs(x) / x) &&
_Clusters[4].IdY != _Clusters[0].IdY + (abs(y) / y))
_Clusters[4] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ);
}
else {
FreeStars(&_Clusters[4]);
}
if (abs(x) > 0.25f && abs(z) > 0.25f) {
if (_Clusters[5].IdX != _Clusters[0].IdX + (abs(x) / x) &&
_Clusters[5].IdZ != _Clusters[0].IdZ + (abs(z) / z))
_Clusters[5] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY, _Clusters[0].IdZ + (abs(z) / z));
}
else {
FreeStars(&_Clusters[5]);
}
if (abs(y) > 0.25f && abs(z) > 0.25f) {
if (_Clusters[6].IdZ != _Clusters[0].IdX + (abs(z) / z) &&
_Clusters[6].IdY != _Clusters[0].IdY + (abs(y) / y))
_Clusters[6] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ + (abs(z) / z));
}
else {
FreeStars(&_Clusters[6]);
}
if (abs(x) > 0.25f && abs(y) > 0.25f && abs(z) > 0.25f) {
if (_Clusters[7].IdX != _Clusters[0].IdX + (abs(x) / x) &&
_Clusters[7].IdY != _Clusters[0].IdY + (abs(y) / y) &&
_Clusters[7].IdZ != _Clusters[0].IdZ + (abs(z) / z))
_Clusters[7] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ + (abs(z) / z));
}
else {
FreeStars(&_Clusters[7]);
}
//swap clusters
if (abs(x) >= 1.0f && abs(y) > 1.0f && abs(z) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[7];
_Clusters[7] = _c;
}
else if (abs(y) > 1.0f && abs(z) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[6];
_Clusters[6] = _c;
}
else if (abs(x) > 1.0f && abs(z) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[5];
_Clusters[5] = _c;
}
else if (abs(x) > 1.0f && abs(y) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[4];
_Clusters[4] = _c;
}
else if (abs(z) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[3];
_Clusters[3] = _c;
}
else if (abs(y) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[2];
_Clusters[2] = _c;
}
else if (abs(x) > 1.0f) {
_c = _Clusters[0];
_Clusters[0] = _Clusters[1];
_Clusters[1] = _c;
}
X = _Clusters[0].IdX;
Y = _Clusters[0].IdY;
Z = _Clusters[0].IdZ;
}
void ALGalaxy::ReceiveBeginPlay()
{
_Clusters[0] = GetCluster(0, 0, 0);
tick = true;
}
void ALGalaxy::Tick(float DeltaSeconds)
{
if (!tick) return;
FVector plPos = GetWorld()->GetFirstPlayerController()->GetPawn()->GetTransform().GetLocation();
FVector stPos;
float dist;
UpdateClustersInLocation(plPos);
for (int32 i = 0; i < 8; i++) {
for (int32 s = 0; s < _Clusters[i].Star.Num(); s++) {
stPos = FVector(_Clusters[i].CoordX + _Clusters[i].Star[s].CoordX,
_Clusters[i].CoordY + _Clusters[i].Star[s].CoordY,
_Clusters[i].CoordZ + _Clusters[i].Star[s].CoordZ);
dist = stPos.Dist(plPos, stPos);
if (dist <= GalaxyStarVisibleRange) {
if (!_Clusters[i].Star[s].spawned) {
_Clusters[i].Star[s].self = static_cast<ALGalaxyStar*>( GetWorld()->SpawnActor(_Clusters[i].Star[s].Class, &stPos) );
_Clusters[i].Star[s].spawned = true;
}
}
else {
if (_Clusters[i].Star[s].spawned) {
_Clusters[i].Star[s].self->Destroy();
_Clusters[i].Star[s].spawned = false;
}
}
}
}
} |
|
и вроде бы все работает, но если игрок движется по диагонали (в левый верхий угол например) срабатывает вместо if (abs(x) >= 1.0f && abs(y) > 1.0f && abs(z) > 1.0f) - else if (abs(z) > 1.0f), ибо в x и y приходит 0.7f... И фиг его знает почему.
В итоге получается, что центральным становится не тот куб, что надо и весь алгоритм ломается.
А стоп. Вопрос снят. Там не 1.0f а 0.5 f должно быть Ибо от центра считается...
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (15:18 09-10-2014), всего редактировалось 2 раз(а) |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
А зачем менять местами?
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Делаю Процедурный генератор Вселенной.
Геню по текстуре кластеры (те самые кубы), которые имеют определенные координаты.
Т.к. звезд очень много, то есть необходимость выводить кластеры по кускам, в зависимости от положения игрока (Pawn). Массив _Clusters по сути кэш, который позволяет эти кластеры выводить. Меняю индексы затем, чтобы знать, какие кластеры мне нужно выводить/перегенерить, а какие удалить.
PS: Код пока тестовый, если найду более красивое решение, разумеется перепишу, но пока так (собсно было интересно, как UE4 с такой задачей справится )
Собственно это выглядит так:
0 - кластер, где находится игрок
1 - смежный кластер по оси X (
2- смежный по Y
3 - смежный по Z
4-7 - дополнительные (угловые п всем осям)
А далее проходим по списку звезд в загенеренных кластерах и выводим те, которые попадают в установленную зону видимости.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (19:06 09-10-2014), всего редактировалось 4 раз(а) |
|
|
Dimaxx 980 EGP
Рейтинг канала: 8(868) Репутация: 204 Сообщения: 5728 Откуда: Северодвинск Зарегистрирован: 26.06.2002 |
|
А не проще нагенерить кластеры, которые будут содержать массивы видимых в нем индексов-ссылок на общий массив звезд? Не надо менять местами, не надо отсеивать. А просто грузить из данных нужный кластер.
_________________ "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Dimaxx : |
А просто грузить из данных нужный кластер.
|
Теоретически можно, но накладно для ресурсов. Кластеров у меня 1024/1024 из текстуры + генерация Z по алгоритму для объемности. Звезд в кластере до 2048
Полностью загенерированные кластеры занимают овер 5 Гб, поэтому не комельфо такое кол-во инфы в памяти держать.
Поэтому я таки склоняюсь к реалтайм генерации. В принципе сейчас родилась одна идейка, как код упростить. Завтра, когда с работы вернусь проверю мыслю.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (22:56 09-10-2014), всего редактировалось 2 раз(а) |
|
|
Dimaxx 980 EGP
Рейтинг канала: 8(868) Репутация: 204 Сообщения: 5728 Откуда: Северодвинск Зарегистрирован: 26.06.2002 |
|
ТехноМаг : |
не комельфо такое кол-во инфы в памяти держать
|
А кто сказал - в памяти. Они лежат массивом на диске. Генерятся в момент, допустим, создания новой игры. 1 кластер содержит 2048 звезд. Ссылка (индекс) на главный массив звезд для устрашения примем 64-битной (8 байт) - звезд ведь миллиарды. Итого каждый кластер 2048*8=16384 байта максимум. 16КБайт на массив звезд. К тому же можно генерировать кластеры в момент первого появления там игрока. Значит изначально база кластеров на диске будет состоять из 1 кластера. Ну и постепенно разрастаться по мере продвижения игрока по космосу.
ТехноМаг : |
+ генерация Z по алгоритму для объемности
|
В этом месте не понял. Объект имеет 3 координаты в пространстве. У каждой звезды их также 3. Главный массив звезд содержит 3 координаты. Так что объемность уже есть. Плюс нужно обязательно пересчитывать яркость ВСЕХ звезд в зависимости от положения игрока. Если звезда имела звездную величину 4m при расстоянии до нее, к примеру, 12 св. лет, то при расстоянии от игрока в 0,5 св. лет ее яркость будет гораздо выше.
И еще. Не обязательно хранить все кластеры и задавать кластеры. Достаточно определить оптимальную дальность отрисовки кластера. Человеческий глаз различает звезды до 6 зв. величины включительно. Есть плавающий кластер-куб определенного размера. Вот и сделать отбор из базы всех объектов, видимая (с учетом положения игрока) звездная величина которых не превышает 6. Число таких звезд невелико (можно принять до 1 млн.). Значит текущий массив будет не более 8МБайт. Далее рассчитать яркости видимых звезд в этом массиве с учетом положения игрока (он всегда жестко "закреплен" в центре кластера). Кластер перемещается за игроком. В итоге получим отбор видимых объектов и работу по пересчету их параметров локальным массивом относительно главной базы весьма небольшого размера.
_________________ "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс
Последний раз редактировалось: Dimaxx (23:22 09-10-2014), всего редактировалось 5 раз(а) |
|
|
AnrDaemon 856 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
ТехноМаг : |
Делаю Процедурный генератор Вселенной.
Геню по текстуре кластеры (те самые кубы), которые имеют определенные координаты.
Т.к. звезд очень много, то есть необходимость выводить кластеры по кускам, в зависимости от положения игрока (Pawn). Массив _Clusters по сути кэш, который позволяет эти кластеры выводить. Меняю индексы затем, чтобы знать, какие кластеры мне нужно выводить/перегенерить, а какие удалить.
PS: Код пока тестовый, если найду более красивое решение, разумеется перепишу, но пока так (собсно было интересно, как UE4 с такой задачей справится )
Собственно это выглядит так:
0 - кластер, где находится игрок
1 - смежный кластер по оси X (
2- смежный по Y
3 - смежный по Z
4-7 - дополнительные (угловые п всем осям)
А далее проходим по списку звезд в загенеренных кластерах и выводим те, которые попадают в установленную зону видимости.
|
Ты черезчур усложняешь себе жизнь.
1. Зачем загонять в массив? Используй коллекцию.
2. Почему 8? Генери 27. Хазерон вспомни.
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2507 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
а вот тут приходит привет от UE4. 27 за раз он не может загенить. Если использовать цикл for для этого, то он упорно считает, что цикл бесконечен и зависает (либо я чего-то не понимаю в его логике). Етодом проб и ошибок нашел максимально допустимое кол-во прогонов - 10. Отсюда и 8 кластеров, собсно.
добавлено спустя 5 минут:
Как я ранее писал есть мысль как упростить код без массивов и прочей лабуды, используя только индексные индфикаторы кластера (idX, idY и idZ). Через 5 часов буду дома - проверю идею.
добавлено спустя 6 минут:
А пока это выглядит вот так:
нормально загенеренный кластер:
Cкрытый текст (кликните здесь для просмотра)
|
кластер, загенереный с "поломанным" алгороитмом
Cкрытый текст (кликните здесь для просмотра)
|
добавлено спустя 58 минут:
Dimaxx : |
В этом месте не понял
|
Поясню. Кластер кубически кубичный. И в "центре" галлактике получается натуральный куб, причем с ярко выраженными гранями, ибо звезд дофига (на "поломанном" скрине это очень хорошо видно). Поэтому сверху и снизу я генерю дополнительные кластеры, в которых кол-во звезд уменьшается по експоненте и в итоге получается некое подобие овала (красивее смотрится, да и более реалистично).
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (07:25 10-10-2014), всего редактировалось 6 раз(а) |
|
|
|
|
|
Железный канал: «C, С++» |
|