Просмотр полной версии : [Вопрос] Стэк
vovandolg
02.04.2016, 09:50
Допустим берём глобальный мод, там будет использоваться много переменных и различных функций,
даже при большом раскладе можно ли добиться от кодонаписания чтобы стэк не переполнялся?
p.s. искал по гуглу всё про стек, в основном одни тролль ответы или по теме.
http://rghost.ru/7tCn22c7b/image.png
Допустим берём глобальный мод, там будет использоваться много переменных и различных функций,
даже при большом раскладе можно ли добиться от кодонаписания чтобы стэк не переполнялся?
Можно
$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 увеличит память под стек. Поэтому на производительности это никак не скажется, просто памяти больше потребует.
C помощью нее можно и уменьшать)
vovandolg
03.04.2016, 10:19
C помощью нее можно и уменьшать)
А сколько памяти без pragm'ы по умолчанию стоит?
А сколько памяти без pragm'ы по умолчанию стоит?
16384 байт
16384/4 ячеек
vovandolg
03.04.2016, 11:16
Ну тогда эти слова я не допонял:
C помощью нее можно и уменьшать)
Потому как это если не ошибаюсь это надбавку к памяти даёт,
у меня только увеличилась строка со стеком, это когда я стал постепенно прибавлял цифры в прагме ...
Ну тогда эти слова я не допонял:
Потому как это если не ошибаюсь это надбавку к памяти даёт,
у меня только увеличилась строка со стеком, это когда я стал постепенно прибавлял цифры в прагме ...
В 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:
Я как-то задавал вопрос об этом. Если память не изменяет,то выводится информация о затраченной памяти не всего мода,а определенного блока,в котором размер затраченного места в стеке самый большой.
Я как-то задавал вопрос об этом. Если память не изменяет,то выводится информация о затраченной памяти не всего мода,а определенного блока,в котором размер затраченного места в стеке самый большой.
Именно. Размер стэка подсчитывается так же, как рассчитывают размер массива для хранения строки (ну если это делать правильно). То есть, вот тут:
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:
Прям в душу ударило, этот ответ ждал, не знал как подойти к вопросу:victory:
Ответ получен?
vovandolg
03.04.2016, 19:51
Кстате как можно подсчитать какой калбек жрёт так много, ибо старые дедовские способы вручную искать долго уйдут
Можно попробовать по такому принципу
public OnGameModeInit()
{
new heap = heapspace();
printf("OnGameModeInit() STK %d", heap);
// тут остальной код
printf("OnGameModeInit() STK %d (%d LOSS)", heapspace(), (heap - heapspace()));
return 1;
}
Крик души:Почему бы не увеличить стек и не париться?
vovandolg
04.04.2016, 17:43
Дак это же влияет на озу клиента?
Если да вот я и ищю как можно более оптимизации даже для слабых пк,
так же интересно когда всем игрокам существует доступ к серверу ...:hi:
Prolific
04.04.2016, 17:46
Дак это же влияет на озу клиента?
Если да вот я и ищю как можно более оптимизации даже для слабых пк,
так же интересно когда всем игрокам существует доступ к серверу ...:hi:
Это влияет на озу машины, на которой твой сервер работает. А клиентской части пофигу.
Покажите мне комп,который не потянет 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
Я на таком в компьютерном клубе играл в ГТА, так что лесом.
Я на таком в компьютерном клубе играл в ГТА, так что лесом.
Ну зайди на таком где много людей(игроков),машин и т.п.
//------------------
ну а так,у брата есть ноут(неплохой в принципе),ну у него в общем на серверах лагает,в сингле норм,на LAN сервере тоже норм,мде конечно..
vovandolg
04.04.2016, 21:37
Это влияет на озу машины, на которой твой сервер работает. А клиентской части пофигу.
Ну вот сервер нагружает же, значит сервер "чучуть" забивается и тянет всех клиентов за собой "чучуть" хуже...
______________________________
Покажите мне комп,который не потянет SA:MP на минималках?
вы гта с сампом не путайте, в гта боты ходят, а в сампе другие клиенты которые толкают других игроков на взаимодействие и от каждого взаимодействия нагрузка, так что даже новые трухляти которые по дешёвке продаются в магазине будут с трудом на топовых серверах с лагами пробегать кое как.
Prolific
05.04.2016, 00:05
Ну вот сервер нагружает же, значит сервер "чучуть" забивается и тянет всех клиентов за собой "чучуть" хуже...
Повторюсь. Причем тут клиентская часть? Сервер ничего не тянет, он лишь отправляет пакеты, клиент их принимает и на оборот.
Повторюсь. Причем тут клиентская часть? Сервер ничего не тянет, он лишь отправляет пакеты, клиент их принимает и на оборот.
Изначально я вообще кстати имел ввиду-то,что если народу много,то у клиента будут лаги месте скопления игроков,ну и в частности авто.
Daniel_Cortez
05.04.2016, 07:15
Дак это же влияет на озу клиента?
Если да вот я и ищю как можно более оптимизации даже для слабых пк
Тот код, который вы пишете для сервера, выполняется на сервере, очевидно же.
На кол-во свободной памяти у клиента влияние весьма и весьма посредственное. Например, если сервер создаст текстдрав и отошлёт клиенту команду на показ текстдрава, то клиент зарезервирует блок памяти под этот текстдрав, проинициализирует его и покажет текстдрав. Если же на сервере уничтожить текстдрав, сервер пошлёт команду на уничтожение клиенту, который, в свою очередь, уберёт текстдрав с экрана, если он показан, и освободит зарезервированный под него блок памяти.
vovandolg
05.04.2016, 09:18
Нет ну тут же сервер тоже может лагули выдавать, взять изи железо(типо овер9000 интераций=3) и на нём запускать по одному игроков, он же как на сервере начнёт беспокоиться о памяти и нагрузке на проц так и у игроков которые будут рядом спавнится и что то делать в одном стриме, опять же возьмём мод который нагружен разными таймерами с разными античитами проверками, тогда серверу ещё тяжелее обрабатывать, так же и клиенту он чуть больше читает с сервера и тоже начинается малость нагрузки, а ещё не забываем о том что в стриме много игроков от которых тоже взаимодействие на других игроков, забыл про игроков написать, в перемешку всех провайдеров пустить и у самых вафельных из за этого пингует и из за этого тоже нагрузка пакеты с замедлением передаются, ну как тут без нагрузки скажите мне?
Я ж наиграл уже нащупал как говориться и вижу от чего и каких действий нагрузка прёт.
Нет ну тут же сервер тоже может лагули выдавать, взять изи железо(типо овер9000 интераций=3) и на нём запускать по одному игроков, он же как на сервере начнёт беспокоиться о памяти и нагрузке на проц так и у игроков которые будут рядом спавнится и что то делать в одном стриме, опять же возьмём мод который нагружен разными таймерами с разными античитами проверками, тогда серверу ещё тяжелее обрабатывать, так же и клиенту он чуть больше читает с сервера и тоже начинается малость нагрузки, а ещё не забываем о том что в стриме много игроков от которых тоже взаимодействие на других игроков, забыл про игроков написать, в перемешку всех провайдеров пустить и у самых вафельных из за этого пингует и из за этого тоже нагрузка пакеты с замедлением передаются, ну как тут без нагрузки скажите мне?
Я ж наиграл уже нащупал как говориться и вижу от чего и каких действий нагрузка прёт.
Читал-читал, но так и не смог до конца вникнуть в суть :(
В SA-MP и так урезано по максимуму ради того, чтоб даже калькуляторы тянули GTA. Глупо пытаться урезать эту нагрузку ещё больше, ибо тогда можно вообще игру перенести на форум и устроить форумный RP. Тогда точно ни у кого лагать не будет, хотя тоже придётся загружать сообщения других пользователей, что тоже создаст какую-никакую, но нагрузку на игрока... Выход есть - выдернуть шнур питания ПК из розетки. Тогда ты добьёшься максимальной оптимизации, при которой нагрузка будет минимальная.
И, как уже сказали ранее, нагрузка на стэк никак не влияет на нагрузку в сторону игрока. Если игра лагает при большом скоплении людей - она и в сингле будет лагать, ибо это уже проблемы железа и сервер тут ни причём. Можешь каждого игрока помещать в свой виртуальный мир и сделать взаимодействие лишь через чат. Тогда некоторые слабые ПК смогут тянуть GTA без лагов. Но вот это никак не решит проблему с теми, у кого железо настолько слабое, что сама GTA просто не запускается. Предлагаю начать таким людям просто покупать новое железо и проблема будет решена :3 Только вот найти таких людей будет трудновато, ибо обычно они живут где-то в глухих деревнях, где интернет считают каким-то зарубежным певцом, который всем так нравится в этих ваших городах
vovandolg
07.04.2016, 09:01
Я всего лишь попытался узнать, можно закрывать если что.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot