Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2016, 16:59   #31
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если у вас нет хитрой физики вы даже в одном потоке успеете просчитать тысячу мобов в тик.
вам не надо привязываться ко времени, есть UPS, есть их частота в секунду(положенная), и все.
привяжетесь к обычному времени, и все у вас плывет чуть что.
Всё! Кажется я понял, что вы хотели сказать.
То есть поставить таймер, который будет тикать, скажем со скоростью около 60 раз в секунду. И непосредственно в обработчике таймера производить все необходимые действия над всеми участниками локации (думать, двигать, бить и т.д.). Оставшееся время (если оно будет) между тиками проц будет простаивать.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
наиболее быстро это пул объектов, пытается сочетать преимущества массивов и связанных списков(отсутсвие перераспределения объектов)
Тут моих знаний не достаточно. Можете вкратце ( можно и не вкратце) пояснить что это и с чем его едят.

Цитата:
Сообщение от New man Посмотреть сообщение
На практике LinkedList медленнее ArrayList (в C# List) почти во всём. Не рекомендую.
А вот это для меня новость. Вот уж не думал...
max_prorok вне форума Ответить с цитированием
Старый 12.10.2016, 17:14   #32
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
На практике LinkedList медленнее ArrayList (в C# List) почти во всём. Не рекомендую.
он быстрее на частой мутации коллекции, если мутация не хвостовая.
но его надо правильно готовить

Цитата:
Объектный пул (англ. object pool) — порождающий шаблон проектирования, набор инициализированных и готовых к использованию объектов. Когда системе требуется объект, он не создаётся, а берётся из пула. Когда объект больше не нужен, он не уничтожается, а возвращается в пул.Объектный пул применяется для повышения производительности, когда создание объекта в начале работы и уничтожение его в конце приводит к большим затратам. Особенно заметно повышение производительности, когда объекты часто создаются-уничтожаются, но одновременно существует лишь небольшое их число.
то есть опять же, он подходит не для того что добавляется раз в минуту.
например для пуль(привет миниганам) сгодится.

хорошая игра довольно комплексная система.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2016, 18:17   #33
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
он быстрее на частой мутации коллекции, если мутация не хвостовая.
но его надо правильно готовить
Да даже в середине. По моим замерам, он быстрее, если мутации на первой четверти списка. А для такого лучше юзать что-то вроде ArrayDeque из Java. Он состоит из нескольких подмассивов, работа с которыми довольно быстра.

Кстати, автору рекомендую пока не делать пул потоков, а сделать интерфейс
Код:
IGameObjectFactory<T>{
   IGameObjectFactory<T>();
   T getNew();
}
И инициализировать переменные типа IGameObjectFactory<T> классом:
Код:
class SimpleFactory:IGameObjectFactory<Mob>{
   Mob getNew(){
      return new Mob();
   }
}
Потом, если реально тормозить будет, просто меняем на
Код:
class PoolFactory:IGameObjectFactory<Mob>{
   private int capacity;
   
   private Set<Mob> inactives;

   private Set<Mob> actives;

   private Set<Mob> InitMobs(){
      Set<Mob>res = new Set<Mob>();
      for(i =0;i <capacity; i++){
         m = new Mob();
         m.active = false;
         res.add(m);
      }
      return res;
   }

   public PoolFactory(int capacity){
      this.capacity = (capacity>10)?capacity:10;
      inactives = InitMobs();
      actives = new Set<>()
   }

   public void MoveInactives(){
      foreach(Mob m in actives){
         if(!m.active){
            inactives.add(m);
         }
      }
      foreach(Mob m in inactives){
         actives.delete(m);
      }
   }

   Mob getNew(){
      if(inactives.size()>0){
         Mob m = inactives.get();
         m.active = true;
         inactives.delete(m);
         actives.add(m)
         return m;
      }
      else MoveInactives();
      if(inactives.size() = 0) inactives = InitMobs();
      Mob m = inactives.get();
      m.active = true;
      inactives.delete(m);
      actives.add(m)
      return m;
   }
}
Какой-то у меня косячный пул вышел

А стандартные пулы такие:
На Java
Только у них есть метода return(T object), это мне не нравится.
a.k.a. Angelicos Phosphoros
Мой сайт

Последний раз редактировалось New man; 12.10.2016 в 18:26.
New man вне форума Ответить с цитированием
Старый 12.10.2016, 18:33   #34
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да даже в середине. По моим замерам, он быстрее, если мутации на первой четверти списка.
для эффективной работы надо сохранять ноды, тогда будет работать максимально быстро, иначе это преимущество съедается поиском ноды.

позволю себе поправить код на C# стиль все же(может что-то на мое усмотрение)
а то у вас полу Java, полу шарп вышел
Код:
interface IGameObjectFactory<T>
{
   T Create();
}
фабрику сделаем совсем уж общую
Код:
class SimpleFactory<T>:IGameObjectFactory<T> where T:new()
{
   T Create()
   {
      return new T();
   }
}
Код:
class PoolFactory:IGameObjectFactory<Mob>
{
   private int capacity;
   
   private List<Mob> inactives = InitMobs();

   private List<Mob> actives = new List<Mob>();

   private List<Mob> InitMobs(){
      List<Mob>res = new List<Mob>(capacity);//ускорит инициализацию.
      for(i =0;i <capacity; i++){
         m = new Mob();
         m.active = false;
         res.Add(m);
      }
      return res;
   }

   public PoolFactory(int capacity){
      this.capacity = (capacity>10)?capacity:10;
   }

   public void MoveInactives(){
      foreach(Mob m in actives){
         if(!m.active){
            inactives.add(m);
         }
      }
      foreach(Mob m in inactives){
         actives.Remove(m);
      }
   }

   Mob Create(){
      if(inactives.size()>0){
         Mob m = inactives[0];
         m.active = true;
         inactives.RemoveAt(0);
         actives.Add(m)
         return m;
      }
      else MoveInactives();
      if(inactives.size() = 0) inactives = InitMobs();
      return Create();//убрал дублирование код
   }
}
как-то так
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2016, 18:45   #35
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Да я на C# давно не писал просто. А паттерны и прочее изучал уже на Java, а на C# весь мой код legacy :\ Никак руки не доберутся первый курсач отрефакторить.

Если вот это поправить, то будет вообще идеально.
Код:
Mob Create(){
      if(inactives.size()>0){
         Mob m = inactives[inactives.size()-1]; // откусывать с конца List быстрее
         m.active = true;
         inactives.RemoveAt(inactives.size()-1);
         actives.Add(m)
         return m;
      }
      else MoveInactives();
      if(inactives.size() = 0) inactives = InitMobs();
      return Create();//убрал дублирование код
   }
Код:
   public void MoveInactives(){
           // убираем, начиная с хвоста, поэтому копировать будет более короткие подпоследовательности
      for(int i = actives.size()-1; i>=0; i--){
         Mob m = actives[i];
         if(!m.active){
           inactives.add(m);
           // Ну и поиск в списке не будет постоянно работать.
            actives.RemoveAt(i);
         }
      }
   }

UPD: Для ТС: кстати, пул объектов - типичный случай, когда мы платим памятью за быстроту, поэтому с ним надо быть осторожным
a.k.a. Angelicos Phosphoros
Мой сайт

Последний раз редактировалось New man; 12.10.2016 в 18:53.
New man вне форума Ответить с цитированием
Старый 12.10.2016, 20:12   #36
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

по хорошему такого рода пул не должен иметь копирований/перемещений
чтоб не было откусываний, а то мы к проблеме пула добавили проблема динамического массива
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Снова я и снова геморрой, только уже с многопоточностью FleXik Общие вопросы Delphi 26 07.07.2013 16:48
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
нужно разобраться с многопоточностью с ThRead Object Толян1 C++ Builder 1 16.07.2012 09:52
Проблема с многопоточностью Kapitan4ik Работа с сетью в Delphi 3 29.02.2012 21:46