PDA

Просмотр полной версии : [Вопрос] Стэк



vovandolg
02.04.2016, 09:50
Допустим берём глобальный мод, там будет использоваться много переменных и различных функций,
даже при большом раскладе можно ли добиться от кодонаписания чтобы стэк не переполнялся?

p.s. искал по гуглу всё про стек, в основном одни тролль ответы или по теме.

http://rghost.ru/7tCn22c7b/image.png

DeimoS
02.04.2016, 10:26
Допустим берём глобальный мод, там будет использоваться много переменных и различных функций,
даже при большом раскладе можно ли добиться от кодонаписания чтобы стэк не переполнялся?

Можно

$continue$
02.04.2016, 11:21
Кури хабру (https://habrahabr.ru/post/128991/)

vovandolg
02.04.2016, 15:07
Кури хабру (https://habrahabr.ru/post/128991/)

Так это...
После такой оптимизации(если это можно назвать оптимизацией) стэка и производительность в игре может упасть при чтении кода...
Верно?

- - - Добавлено - - -

И ещё вопрос жмёт ли кол-во выделяемой памяти через #pragma dynamic на производительность мода в игре?

Prolific
02.04.2016, 18:04
Так это...
После такой оптимизации(если это можно назвать оптимизацией) стэка и производительность в игре может упасть при чтении кода...
Верно?

- - - Добавлено - - -

И ещё вопрос жмёт ли кол-во выделяемой памяти через #pragma dynamic на производительность мода в игре?

Насколько я знаю #pragma dynamic увеличит память под стек. Поэтому на производительности это никак не скажется, просто памяти больше потребует.

Profyan
03.04.2016, 07:27
C помощью нее можно и уменьшать)

vovandolg
03.04.2016, 10:19
C помощью нее можно и уменьшать)

А сколько памяти без pragm'ы по умолчанию стоит?

DeimoS
03.04.2016, 10:41
А сколько памяти без pragm'ы по умолчанию стоит?

16384 байт
16384/4 ячеек

vovandolg
03.04.2016, 11:16
Ну тогда эти слова я не допонял:

C помощью нее можно и уменьшать)
Потому как это если не ошибаюсь это надбавку к памяти даёт,
у меня только увеличилась строка со стеком, это когда я стал постепенно прибавлял цифры в прагме ...

DeimoS
03.04.2016, 13:19
Ну тогда эти слова я не допонял:

Потому как это если не ошибаюсь это надбавку к памяти даёт,
у меня только увеличилась строка со стеком, это когда я стал постепенно прибавлял цифры в прагме ...

В pragma dynamic (у директивы "pragma" бывают разные опции. Например, "tabsize". Так что называть "pragma dynamic" как "прагма" - не совсем корректно, как по мне) указывается число ячеек, которые нужно выделить под стэк, а не значение в байтах. Стандартно под стэк выделено 4096 ячеек (16384 байт). Чтоб узнать сколько байт ты выделишь, перемножь указанное число ячеек на 4 и получишь ответ

Prolific
03.04.2016, 14:34
В pragma dynamic (у директивы "pragma" бывают разные опции. Например, "tabsize". Так что называть "pragma dynamic" как "прагма" - не совсем корректно, как по мне) указывается число ячеек, которые нужно выделить под стэк, а не значение в байтах. Стандартно под стэк выделено 4096 ячеек (16384 байт). Чтоб узнать сколько байт ты выделишь, перемножь указанное число ячеек на 4 и получишь ответ

Я то думал, откуда берутся эти значения непонятные на выходе потом.

- - - Добавлено - - -


C помощью нее можно и уменьшать)

Можно же увеличить со знаком минус, один хер)

vovandolg
03.04.2016, 15:57
А вот допустим есть в моде переменные или были, что удалял что остались размер стэка не пошевелился,
что есть ещё какие то переменные которые не оптимизируются в стэке или как то так.

- - - Добавлено - - -

Есть же инфа после компиляции при переполненом стэке, вот там как были цифры так и остались на своём месте,
разве что total и data/code size содрогнулись:read:

Profyan
03.04.2016, 18:48
Я как-то задавал вопрос об этом. Если память не изменяет,то выводится информация о затраченной памяти не всего мода,а определенного блока,в котором размер затраченного места в стеке самый большой.

DeimoS
03.04.2016, 19:41
Я как-то задавал вопрос об этом. Если память не изменяет,то выводится информация о затраченной памяти не всего мода,а определенного блока,в котором размер затраченного места в стеке самый большой.

Именно. Размер стэка подсчитывается так же, как рассчитывают размер массива для хранения строки (ну если это делать правильно). То есть, вот тут:

new string[...];
format(string, sizeof(string), "Привет");//6 символов
SendClientMessageToAll(playerid, -1, string);
format(string, sizeof(string), "Ты зашёл ко мне на сервер");//25 символов
SendClientMessageToAll(playerid, -1, string);
format(string, sizeof(string), "Длина этого сообщения - 35 символов");//35 символов
SendClientMessageToAll(playerid, -1, string);
для массива "string" ты должен выделить всего 36 ячеек (35 + 1 на нуль-символ), а не 67. Ведь сообщения форматируются отдельно друг от друга и для хранения всех сообщений достаточно выделить столько ячеек, сколько символов в самой большой строке.
Так же и со стеком. Компилятор ищет коллбэк, который сжирает больше всего стэка, и показывает именно значения для него, а не суммирует затраты каждого коллбэка, ибо, после выполнения одного коллбэка, память в стэке освобождается и заполнение информации о новом коллбэке происходит в совершенно чистый стэк (то бишь, так же, как и в примере с строками).

vovandolg
03.04.2016, 19:47
Так же и со стеком. Компилятор ищет коллбэк, который сжирает больше всего стэка, и показывает именно значения для него, а не суммирует затраты каждого коллбэка, ибо, после выполнения одного коллбэка, память в стэке освобождается и заполнение информации о новом коллбэке происходит в совершенно чистый стэк (то бишь, так же, как и в примере с строками).

Прям в душу ударило, этот ответ ждал, не знал как подойти к вопросу:victory:

DeimoS
03.04.2016, 19:49
Прям в душу ударило, этот ответ ждал, не знал как подойти к вопросу:victory:

Ответ получен?

vovandolg
03.04.2016, 19:51
Кстате как можно подсчитать какой калбек жрёт так много, ибо старые дедовские способы вручную искать долго уйдут

DeimoS
04.04.2016, 15:35
Можно попробовать по такому принципу

public OnGameModeInit()
{
new heap = heapspace();
printf("OnGameModeInit() STK %d", heap);

// тут остальной код

printf("OnGameModeInit() STK %d (%d LOSS)", heapspace(), (heap - heapspace()));
return 1;
}

Profyan
04.04.2016, 16:10
Крик души:Почему бы не увеличить стек и не париться?

vovandolg
04.04.2016, 17:43
Дак это же влияет на озу клиента?
Если да вот я и ищю как можно более оптимизации даже для слабых пк,
так же интересно когда всем игрокам существует доступ к серверу ...:hi:

Prolific
04.04.2016, 17:46
Дак это же влияет на озу клиента?
Если да вот я и ищю как можно более оптимизации даже для слабых пк,
так же интересно когда всем игрокам существует доступ к серверу ...:hi:

Это влияет на озу машины, на которой твой сервер работает. А клиентской части пофигу.

Profyan
04.04.2016, 18:08
Покажите мне комп,который не потянет SA:MP на минималках?

Vasya_Pupkin
04.04.2016, 18:12
Покажите мне комп,который не потянет SA:MP на минималках?

http://ufa.doski.ru/i/36/39/1363919.jpg

Prolific
04.04.2016, 18:30
http://ufa.doski.ru/i/36/39/1363919.jpg

Я на таком в компьютерном клубе играл в ГТА, так что лесом.

[ForD]
04.04.2016, 21:13
Я на таком в компьютерном клубе играл в ГТА, так что лесом.

Ну зайди на таком где много людей(игроков),машин и т.п.

//------------------
ну а так,у брата есть ноут(неплохой в принципе),ну у него в общем на серверах лагает,в сингле норм,на LAN сервере тоже норм,мде конечно..

vovandolg
04.04.2016, 21:37
Это влияет на озу машины, на которой твой сервер работает. А клиентской части пофигу.
Ну вот сервер нагружает же, значит сервер "чучуть" забивается и тянет всех клиентов за собой "чучуть" хуже...
______________________________

Покажите мне комп,который не потянет SA:MP на минималках?
вы гта с сампом не путайте, в гта боты ходят, а в сампе другие клиенты которые толкают других игроков на взаимодействие и от каждого взаимодействия нагрузка, так что даже новые трухляти которые по дешёвке продаются в магазине будут с трудом на топовых серверах с лагами пробегать кое как.

Prolific
05.04.2016, 00:05
Ну вот сервер нагружает же, значит сервер "чучуть" забивается и тянет всех клиентов за собой "чучуть" хуже...

Повторюсь. Причем тут клиентская часть? Сервер ничего не тянет, он лишь отправляет пакеты, клиент их принимает и на оборот.

[ForD]
05.04.2016, 03:08
Повторюсь. Причем тут клиентская часть? Сервер ничего не тянет, он лишь отправляет пакеты, клиент их принимает и на оборот.

Изначально я вообще кстати имел ввиду-то,что если народу много,то у клиента будут лаги месте скопления игроков,ну и в частности авто.

Daniel_Cortez
05.04.2016, 07:15
Дак это же влияет на озу клиента?
Если да вот я и ищю как можно более оптимизации даже для слабых пк
Тот код, который вы пишете для сервера, выполняется на сервере, очевидно же.
На кол-во свободной памяти у клиента влияние весьма и весьма посредственное. Например, если сервер создаст текстдрав и отошлёт клиенту команду на показ текстдрава, то клиент зарезервирует блок памяти под этот текстдрав, проинициализирует его и покажет текстдрав. Если же на сервере уничтожить текстдрав, сервер пошлёт команду на уничтожение клиенту, который, в свою очередь, уберёт текстдрав с экрана, если он показан, и освободит зарезервированный под него блок памяти.

vovandolg
05.04.2016, 09:18
Нет ну тут же сервер тоже может лагули выдавать, взять изи железо(типо овер9000 интераций=3) и на нём запускать по одному игроков, он же как на сервере начнёт беспокоиться о памяти и нагрузке на проц так и у игроков которые будут рядом спавнится и что то делать в одном стриме, опять же возьмём мод который нагружен разными таймерами с разными античитами проверками, тогда серверу ещё тяжелее обрабатывать, так же и клиенту он чуть больше читает с сервера и тоже начинается малость нагрузки, а ещё не забываем о том что в стриме много игроков от которых тоже взаимодействие на других игроков, забыл про игроков написать, в перемешку всех провайдеров пустить и у самых вафельных из за этого пингует и из за этого тоже нагрузка пакеты с замедлением передаются, ну как тут без нагрузки скажите мне?
Я ж наиграл уже нащупал как говориться и вижу от чего и каких действий нагрузка прёт.

DeimoS
06.04.2016, 22:09
Нет ну тут же сервер тоже может лагули выдавать, взять изи железо(типо овер9000 интераций=3) и на нём запускать по одному игроков, он же как на сервере начнёт беспокоиться о памяти и нагрузке на проц так и у игроков которые будут рядом спавнится и что то делать в одном стриме, опять же возьмём мод который нагружен разными таймерами с разными античитами проверками, тогда серверу ещё тяжелее обрабатывать, так же и клиенту он чуть больше читает с сервера и тоже начинается малость нагрузки, а ещё не забываем о том что в стриме много игроков от которых тоже взаимодействие на других игроков, забыл про игроков написать, в перемешку всех провайдеров пустить и у самых вафельных из за этого пингует и из за этого тоже нагрузка пакеты с замедлением передаются, ну как тут без нагрузки скажите мне?
Я ж наиграл уже нащупал как говориться и вижу от чего и каких действий нагрузка прёт.

Читал-читал, но так и не смог до конца вникнуть в суть :(
В SA-MP и так урезано по максимуму ради того, чтоб даже калькуляторы тянули GTA. Глупо пытаться урезать эту нагрузку ещё больше, ибо тогда можно вообще игру перенести на форум и устроить форумный RP. Тогда точно ни у кого лагать не будет, хотя тоже придётся загружать сообщения других пользователей, что тоже создаст какую-никакую, но нагрузку на игрока... Выход есть - выдернуть шнур питания ПК из розетки. Тогда ты добьёшься максимальной оптимизации, при которой нагрузка будет минимальная.

И, как уже сказали ранее, нагрузка на стэк никак не влияет на нагрузку в сторону игрока. Если игра лагает при большом скоплении людей - она и в сингле будет лагать, ибо это уже проблемы железа и сервер тут ни причём. Можешь каждого игрока помещать в свой виртуальный мир и сделать взаимодействие лишь через чат. Тогда некоторые слабые ПК смогут тянуть GTA без лагов. Но вот это никак не решит проблему с теми, у кого железо настолько слабое, что сама GTA просто не запускается. Предлагаю начать таким людям просто покупать новое железо и проблема будет решена :3 Только вот найти таких людей будет трудновато, ибо обычно они живут где-то в глухих деревнях, где интернет считают каким-то зарубежным певцом, который всем так нравится в этих ваших городах

vovandolg
07.04.2016, 09:01
Я всего лишь попытался узнать, можно закрывать если что.