Перейти к содержимому


Фотография

Способы для облегчения карт от ненужных объектов.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 70

#1 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 731 сообщений

Отправлено 19 July 2015 - 02:22

Арма3 имеет не лучшую производительность и это сказано мягко. Это очень раздражает когда делаешь миссию со многим количеством единиц. Карты переполнены всевозможным "мусором", который совершенно не нужен игроку. Это всевозможные обломки автомобилей, кучи мусора, кирпичи, трубы, столики со стульями и т.д. 

Ко всему прочему, весь этот набор "мусора" усугубляется наличием стай кроликов, змей вокруг игрока.

 

Карты просто захламлены, не интересными для геймплея объектами!

Может быть есть способы "чистить" карты с помощью каких-либо хитростей?

Может быть доступна чистка по классам с помощью скриптинга? Например как сделать, чтобы в карте обломков автомобилей не было? Или чтобы других объектов, например строительного мусора, кирпичей, животных и т.д.

Любые способы чистки карты, будут приняты с благодарностью...


  • 0

#2 OFFLINE   Maxyzzz940

Maxyzzz940

    Рядовой

  • Пользователи
  • 20 сообщений

Отправлено 19 July 2015 - 13:56

У каждого подобного объекта есть ID. По ID их можно скрыть, самому было необходимо, но появилась проблема с тем, что при включении в редакторе отображения ID — не все числа можно прочитать, т.к. они могут накладываться друг на друга... Купол я убрать в одном месте хотел...
 
Сейчас поищу как это делается...
 
 
UPD
 
Вот init для Game Logic-Logic... (можно и для триггера и для другого объекта применить)

this enableSimulation false; this allowDamage false; delh = [0,0,0] nearestObject ######; delh hideObject true;

Где ###### — ID объекта. Режим отображения ID на карте включается сочетанием клавиш ctrl+I. Сделал скриншоты для примера, удаляем три объекта сразу: купол и два исследовательских штаба под ним...

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

this enableSimulation false; this allowDamage false; delh = [0,0,0] nearestObject 499662; delh hideObject true; delh = [0,0,0] nearestObject 499677; delh hideObject true; delh = [0,0,0] nearestObject 499674; delh hideObject true;

Также, вот две проблемы для которых у меня нет решения:

  • Невозможность узнать ID объекта Решение: пост #4
  • Объект все равно будет отображаться на карте в игре.

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Для мультиплеера нужно заменить "enableSimulation" на "enableSimulationGlobal", и также заменить "hideObject" на "hideObjectGlobal".

this enableSimulationGlobal false; this allowDamage false; delh = [0,0,0] nearestObject ######; delh hideObjectGlobal true;

P.S. И главное — насколько это облегчит — неизвестно. Разве что рендеринг будет проще.


Сообщение отредактировал Maxyzzz940: 19 July 2015 - 23:11

  • 0

#3 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 July 2015 - 17:54

 

Невозможность узнать ID объекта

Можно уничтожать объекты (например, стрелять по ним из танковой пушки), а потом узнавать ID из RPT-файла.

 

 

Для мультиплеера нужно заменить "enableSimulation" на "enableSimulationGlobal", и также заменить "hideObject" на "hideObjectGlobal".

Ничего менять не нужно, если enableSimulation или hideObject вставляются в Init объектов, поскольку при запуске миссии сервер их исполнит, и при подключении клиентов они тоже исполнятся.

 

 

И главное — насколько это облегчит — неизвестно. Разве что рендеринг будет проще.

Будет проще не только рендеринг - это снизит нагрузку на ЦП и сеть, поскольку enableSimulation false отключает обработку объектов и их синхронизацию. Где-то читал, что улучшение производительности может достигать до 20 %.


  • 1

#4 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 19 July 2015 - 18:08

Schatten,Maxyzzz940,
1 Способ - запускаете редактор -> просмотр -> ESC -> Камера -> Наводите прицел на нужный объект (Выделиться в квадрат) -> В нижнем левом углу будет:
BIS_fnc_camera_target: "Набор из букв и цифр"# ID Объекта: моделька объекта
2 Способ - запускаете редактор -> просмотр -> наводите центр вашего экрана на объект -> ESC -> в консоль отладки пишем:
copyToClipboard str cursorTarget
На выходе в буфере обмена получаем например вот это:
53591600# 64308: tenthangar_v1_f.p3d //Цифры после # и есть наш ID

  • 3

#5 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 731 сообщений

Отправлено 19 July 2015 - 18:22

К сожалению, если наводится на каждый объект, для узнавания его ID, тогда задача облегчения карты превращается в адскую задачу, особенно на Алтисе!

Хотелось бы знать, есть возможность лишать всю карту, объектов по классам, а не по ID? 

Например есть же классы "обломок" или классы "мебель", "груз", "мусор" и т.д. 

Может быть можно сразу запретить конкретному классу быть в карте?


  • 0

#6 OFFLINE   Maxyzzz940

Maxyzzz940

    Рядовой

  • Пользователи
  • 20 сообщений

Отправлено 19 July 2015 - 21:30


Ничего менять не нужно, если enableSimulation или hideObject вставляются в Init объектов, поскольку при запуске миссии сервер их исполнит, и при подключении клиентов они тоже исполнятся.

This command only works locally and must be run on all machines to have global affect. —

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.

Все-таки странно это... Тогда зачем Global'ы нужны!?


Будет проще не только рендеринг - это снизит нагрузку на ЦП и сеть, поскольку enableSimulation false отключает обработку объектов и их синхронизацию. Где-то читал, что улучшение производительности может достигать до 20 %.

Для статических объектов это вряд ли имеет большое значение.

 

 

vlad333000, огромное спасибо, сохранил в закладки.  :)

 

 


К сожалению, если наводится на каждый объект, для узнавания его ID, тогда задача облегчения карты превращается в адскую задачу, особенно на Алтисе! Хотелось бы знать, есть возможность лишать всю карту, объектов по классам, а не по ID?  Например есть же классы "обломок" или классы "мебель", "груз", "мусор" и т.д.  Может быть можно сразу запретить конкретному классу быть в карте?

Если найти названия классов, то может быть. Вероятно, что найти эти классы можно в Cfg файлах... А может быть можно попробовать через Bulldozer посмотреть...

И скорее всего исполняемая команда изменится.


Сообщение отредактировал Maxyzzz940: 19 July 2015 - 22:22

  • 0

#7 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 July 2015 - 21:48

 

Тогда зачем Global'ы нужны!?

Для тех случаев, когда нужно, например, со стороны клиента спрятать какой-нибудь объект для всех.

 

 

Для статических объектов это вряд ли имеет большое значение.

Не думаю. Не надо будет обрабатывать разрушения, синхронизировать их...


2 Способ - запускаете редактор -> просмотр -> наводите центр вашего экрана на объект -> ESC -> в консоль отладки пишем:
copyToClipboard str cursorTarget
На выходе в буфере обмена получаем например вот это:
53591600# 64308: tenthangar_v1_f.p3d //Цифры после # и есть наш ID

Действительно. Сам много раз так делал, а про то, что ID можно узнать, забыл. )


Сообщение отредактировал Schatten: 19 July 2015 - 21:50

  • 0

#8 OFFLINE   Maxyzzz940

Maxyzzz940

    Рядовой

  • Пользователи
  • 20 сообщений

Отправлено 19 July 2015 - 22:06


Для тех случаев, когда нужно, например, со стороны клиента спрятать какой-нибудь объект для всех.

Ясное дело, что init исполняется при загрузке (если применять к объекту)... А если по триггеру? Или в sqs/sqf? Если им не задано исполнение сходу? В таком случае необходим Global? Я просто хочу понять, где заканчивается применение обычных и начинаются Global'ы для MP...

 

 


Не думаю. Не надо будет обрабатывать разрушения, синхронизировать их...

При AllowDamage false? При HideObject true? Логику не улавливаю... Даже если допустить, что при HideObject, объект становится только невидимым (что неверно, т.к. в последних патчах, для всех объектов также отключаются физ. границы и коллизия, т.е. ты не врежешься на 100 км/ч в невидимый объект), возможная нагрузка на GPU и CPU были исключены командой AllowDamage false...

Опять же, я не знаю точно, просто пытаюсь найти логическое объяснение. Интересно ведь...

 

P.S. Потому что при AllowDamage false, воздействие на объект исключается, что приводит к невозможности воспроизведения эффектов разрушения и т.д.

P.P.S. Опять же, если учитывать, что разрушение объекта и последующие эффекты и есть основная нагрузка на железо. Но и возможно, что "удаление" множества объектов из постоянного буфера приведет к снижению постоянной нагрузки. Да... Тут надо разграничить постоянные расчеты движка и динамическое воздействие на них...

 

UPD @mickeymen

На тему удаления по классам, нашел тред на

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

. Люди как раз обсуждают данный вопрос.


Сообщение отредактировал Maxyzzz940: 19 July 2015 - 22:22

  • 0

#9 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 July 2015 - 22:26

 

Я просто хочу понять, где заканчивается применение обычных и начинаются Global'ы для MP...

Приведу такой пример. Он для другой команды, но суть та же.

Нужно было мне в Arma 2 поменять текстуру созданного объекта. Однако команды setObjectTextureGlobal нет. Чтобы решить эту проблему, пришлось у каждого клиента создавать локальный объект и менять его текстуру командой setObjectTexture.

В Arma 3 ввели команду setObjectTextureGlobal. Поэтому в ней я такую задачу решаю по-другому: на сервере создаю глобальные объекты и на сервере же меняю их текстуры командой setObjectTextureGlobal.

Т. е. для создания "глобального" эффекта мне в Arma 2 пришлось на всех клиентах запустить команду setObjectTexture, а в Arma 3 мне было достаточно запустить команду setObjectTextureGlobal только на сервере.

 

 

При AllowDamage false? При HideObject true?

При "allowDamage false" повреждения обрабатываются, просто урон не наносится. Можно проверить, постреляв по AI, - эффекты попаданий будут, но урон наноситься не будет.

"hideObject true" не знаю. По идее, будет просто скрыт объект. Повреждения обрабатываться будут, синхронизация по сети будет...


  • 0

#10 OFFLINE   Maxyzzz940

Maxyzzz940

    Рядовой

  • Пользователи
  • 20 сообщений

Отправлено 19 July 2015 - 22:42


При "allowDamage false" повреждения обрабатываются, просто урон не наносится. Можно проверить, постреляв по AI, - эффекты попаданий будут, но урон наноситься не будет. "hideObject true" не знаю. По идее, будет просто скрыт объект. Повреждения обрабатываться будут, синхронизация по сети будет...

Что же у нас блокирует эффекты? Была ведь какая-то команда...

Повреждения от взрыва может? Потому что повреждения от столкновения невозможны, при отсутствии коллизии.

 

А по поводу глобалов все-равно не понял. :) Все-таки что подразумевается под сервером в данном контексте? Та машина, на которой запускается dedicated (пускай даже in-game hosting) с определенным сценарием, при запуске которого init.sqf или init объекта запускает Global?


Сообщение отредактировал Maxyzzz940: 19 July 2015 - 22:43

  • 0

#11 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 July 2015 - 22:55

 

Все-таки что подразумевается под сервером в данном контексте?

Компьютер, на котором запускается сценарий.

При in-game hosting пространство имён с владельцем компа общее. Т. е., например, при объявлении переменной на "сервере" она станет доступной и на клиенте - не надо её транслировать с помощью publicVariable.


  • 1

#12 OFFLINE   Maxyzzz940

Maxyzzz940

    Рядовой

  • Пользователи
  • 20 сообщений

Отправлено 19 July 2015 - 23:05


Компьютер, на котором запускается сценарий. При in-game hosting пространство имён с владельцем компа общее. Т. е., например, при объявлении переменной на "сервере" она станет доступной и на клиенте - не надо её транслировать с помощью publicVariable

Исчерпывающая дискуссия получилась. Главное ай-ай-яй от модеров не словить за флуд.  :lol:

Спасибо, Schatten! Пойду я отсель, разморило уже. Завтра опять буду пробовать решить свою задачку...

 

P.S.


2 Способ - запускаете редактор -> просмотр -> наводите центр вашего экрана на объект -> ESC -> в консоль отладки пишем:

Может центр курсора все-таки?! :)


Сообщение отредактировал Maxyzzz940: 19 July 2015 - 23:10

  • 0

#13 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 19 July 2015 - 23:25

При in-game hosting пространство имён с владельцем компа общее. Т. е., например, при объявлении переменной на "сервере" она станет доступной и на клиенте - не надо её транслировать с помощью publicVariable.

Папка Армы 3 -> server.exe (Запускаетя отдельно выделенный сервер, тем самым можно имитировать клиент-сервер)
Maxyzzz940, в "обычном" (Пешем) виде, курсор всегда центр экрана
Maxyzzz940, локально - там где была запущена команда, там и есть эффект
глобально - при запуске у одного, запускается у всех:
итин юнитов - запускается у всех при старте
init-скрипты - запускаются соответственно своему назначению (init - у всех, initPlayerLoca - у игроков (Вкл сервер, если хост игрок), initServer - на сервере
  • 0

#14 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 July 2015 - 00:07

Подарок от Killzone Kid

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

// Return all trees in 100m radius around player
// Тобишь, код ниже возвращает массив объектов "деревья"
// в радиусе 100 метров вокруг игрока

trees = []; 
{
    if (str _x find ": t_" > -1) then {
        trees pushBack _x;
    };
} forEach nearestObjects [player, [], 100];

Суть затей вот в чём, полученный массив объектов этой командой

nearestObjects [player, [], 100]

перебирается на предмет соответствия неким параметрам которым должен отвечать объект что бы попасть в результат.

 

В этом проверочном условии

if (str _x find ": t_" > -1) then {
   trees pushBack _x;
};

каждый проверяемый элемент массива преобразуется в строку

str _x

и далее проверяется содержит ли полученная в результате преобразования строка этот набор символов

": t_"

каждая модель дерева имеет в своём имени приставку

t_

Далее мудрейшие поймут сами что нужно сделать, что бы получить девственно лысую карту?


Сообщение отредактировал SteelRat: 20 July 2015 - 00:09

  • 0

#15 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 731 сообщений

Отправлено 20 July 2015 - 00:31

Я создал петицию на форуме БИСОВ обратной связи. 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Прошу дать игроку настройки для количества амбиент объектов в карте, для увеличения производительности..

Предлагаю четыре сеттинга:

 

1. No ambient objects -- нет амбиент объектов
2. Low quantity of ambient objects -- мало амбиент объектов
3. Medium quantity of ambient objects -- среднее количество амбиент объектов
4. Hight quantity ambient objects -- много амбиент объектов

 

Поддержите если интересно.


Сообщение отредактировал mickeymen: 20 July 2015 - 00:32

  • 0

#16 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 July 2015 - 00:53

Какова дальность прорисовки той же травы в арме, да и не только в ней?

За что прятаться бедным солдатикам, если снести с карты весь этот мусор?)


  • 0

#17 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 20 July 2015 - 00:56

Какова дальность прорисовки той же травы в арме, да и не только в ней?

Довольно небольшая.

 

За что прятаться бедным солдатикам, если снести с карты весь этот мусор?)

Ну, в Такистане ведь как-то играют, хотя там растительности довольно мало.


  • 0

#18 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 731 сообщений

Отправлено 20 July 2015 - 01:29


За что прятаться бедным солдатикам, если снести с карты весь этот мусор?)

 

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

За этим вы коллега собираетесь прятаться?) Эти объекты бессмысленны для геймплея, они лишь для красоты.


Сообщение отредактировал mickeymen: 20 July 2015 - 01:30

  • 0

#19 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 July 2015 - 01:55

 


За что прятаться бедным солдатикам, если снести с карты весь этот мусор?)

 

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

За этим вы коллега собираетесь прятаться?) Эти объекты бессмысленны для геймплея, они лишь для красоты.

 

Для себя можно сделать всё что угодно, чем собственно мы и занимаемся.

А разработчики делают игру для многих, и не всем импонирует пустыня, лично меня с души от них воротит), а так же не всех греет карта без обыкновенной житейской бытовухи, очень синтетически смотрятся такие пейзажи.


 

За этим вы коллега собираетесь прятаться?)

Я не то что прятаться не буду, я даже в это не играю)

 

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


Сообщение отредактировал SteelRat: 20 July 2015 - 01:57

  • 0

#20 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 July 2015 - 02:01

ЗЫ

Самая идеальная карта, это VR.

Ни чего лишнего!!!)


  • 0




Яндекс.Метрика