Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
[L2P]L2ObjectArray а оно того стоит?
#11
Вот что получилось...
PHP код:
<?php 
package l2rt
.gameserver.model;

import gnu.trove.map.hash.TIntObjectHashMap;

import l2rt.Config;
import l2rt.gameserver.model.instances.L2MonsterInstance;
import l2rt.gameserver.model.instances.L2NpcInstance;
import l2rt.gameserver.model.instances.L2PetInstance;
import l2rt.gameserver.model.items.L2ItemInstance;
import l2rt.util.GArray;
import l2rt.util.StrTable;

import java.util.logging.Logger;

/**
* Rework ALF
* l2wt.1gb.ua
*/
public class L2ObjectsStorage
{
private static final
Logger _log = Logger.getLogger(L2ObjectsStorage.class.getName());

private static
long offline_refresh = 0;
private static
int offline_count = 0;

private static final
TIntObjectHashMap<L2Player> _allPlayers;
private static final
TIntObjectHashMap<L2ItemInstance> _allItems;
private static final
TIntObjectHashMap<L2NpcInstance> _allNpcs;
private static final
TIntObjectHashMap<L2Playable> _allSummons;
private static final
TIntObjectHashMap<L2Object> _allOthers;

static
{
_allPlayers = new TIntObjectHashMap<L2Player>();
_allItems = new TIntObjectHashMap<L2ItemInstance>();
_allNpcs = new TIntObjectHashMap<L2NpcInstance>();
_allSummons = new TIntObjectHashMap<L2Playable>();
_allOthers = new TIntObjectHashMap<L2Object>();
}

/**
* Функции которые возвращают массивы элементов карты
**/
public static final L2Player[] getAllPlayersArray()
{
return
_allPlayers.values();
}

public static final
L2ItemInstance[] getAllItemsArray()
{
return
_allItems.values();
}

public static final
L2NpcInstance[] getAllNpcArray()
{
return
_allNpcs.values();
}

public static final
L2Playable[] getAllSummonsArray()
{
return
_allSummons.values();
}

public static final
L2Object[] getAllOthersArray()
{
return
_allOthers.values();
}

/**
* Функции которые возвращают элемент по его ObjId
**/
public static final L2Player getPlayer(int objId)
{
return
_allPlayers.get(objId);
}

public static final
L2ItemInstance getItem(int objId)
{
return
_allItems.get(objId);
}

public static final
L2NpcInstance getNpc(int objId)
{
return
_allNpcs.get(objId);
}

public static final
L2Playable getSummon(int objId)
{
return
_allSummons.get(objId);
}

public static final
L2Object getOther(int objId)
{
return
_allOthers.get(objId);
}

public static
L2Player getPlayer(String name)
{
for (
L2Player temp : getAllPlayersArray())
if (
name.equalsIgnoreCase(temp.getName()))
return
temp;
return
null;
}

public static
L2NpcInstance getNpc(String s)
{
GArray<L2NpcInstance> npcs = new GArray<L2NpcInstance>();
for (
L2NpcInstance temp : getAllNpcArray())
{
if (
s.equalsIgnoreCase(temp.getName()))
{
npcs.add(temp);
}
}
if(
npcs.size() == 0)
return
null;
for(
L2NpcInstance temp : npcs)
if(!
temp.isDead())
return
temp;
return
npcs.removeLast();
}

/**
* Функции которые возвращают количество элементов
**/
public static int getAllPlayersCount()
{
return
_allPlayers.size();
}

public static
int getAllObjectsCount()
{
int result = 0;
result += _allPlayers.size();
result += _allItems.size();
result += _allNpcs.size();
result += _allSummons.size();
result += _allOthers.size();
return
result;
}

/**
* Более сложные Функции которые возвращают количество элементов
**/
public static int getAllOfflineCount()
{
if(!
Config.SERVICES_OFFLINE_TRADE_ALLOW)
return
0;

long now = System.currentTimeMillis();
if(
now > offline_refresh)
{
offline_refresh = now + 10000;
offline_count = 0;
for(
L2Player player : getAllPlayersArray())
if(
player.isInOfflineMode())
offline_count++;
}

return
offline_count;
}

/**
* Функции, связаны с поиском НПЦ по его айди (не путать с ОбжектАйди)
**/
public static L2NpcInstance getByNpcId(int npc_id)
{
L2NpcInstance result = null;
for(
L2NpcInstance temp : getAllNpcArray())
if(
npc_id == temp.getNpcId())
{
if(!
temp.isDead())
return
temp;
result = temp;
}
return
result;
}

public static
GArray<L2NpcInstance> getAllByNpcId(int npc_id, boolean justAlive)
{
GArray<L2NpcInstance> result = new GArray<L2NpcInstance>(0);
for(
L2NpcInstance temp : getAllNpcArray())
if(
temp.getTemplate() != null && npc_id == temp.getTemplate().getNpcId() && (!justAlive || !temp.isDead()))
result.add(temp);
return
result;
}

public static
GArray<L2NpcInstance> getAllByNpcId(int[] npc_ids, boolean justAlive)
{
GArray<L2NpcInstance> result = new GArray<L2NpcInstance>(0);
for(
L2NpcInstance temp : getAllNpcArray())
if(!
justAlive || !temp.isDead())
for(
int npc_id : npc_ids)
if(
npc_id == temp.getNpcId())
result.add(temp);
return
result;
}

public static
L2Character getAsCharacter(int storedId)
{
L2Character Result = null;

Result = (L2Character) _allNpcs.get(storedId);

if (
Result == null)
Result = (L2Character) _allPlayers.get(storedId);

return
Result;
}

public static
GArray<Reflection> getAllReflections()
{
GArray<Reflection> result = new GArray<Reflection>();
for(
L2Object obj : getAllOthersArray())
if(
obj instanceof Reflection)
result.add((Reflection) obj);
return
result;
}

/**
* кладет объект в хранилище и возвращает уникальный индентификатор по которому его можно будет найти в хранилище
*/
public static int put(L2Object o)
{
if (
o.isItem())
{
_allItems.put(o.getObjectId(), (L2ItemInstance)o);
return
o.getObjectId();
}
if (
o.isNpc())
{
_allNpcs.put(o.getObjectId(), (L2NpcInstance)o);
return
o.getObjectId();
}
if(
o.isPlayable())
{
if (
o.isPlayer())
{
_allPlayers.put(o.getObjectId(), (L2Player)o);
return
o.getObjectId();
}
else
{
_allSummons.put(o.getObjectId(), (L2Playable)o);
return
o.getObjectId();
}
}
_allOthers.put(o.getObjectId(), (L2Object)o);
return
o.getObjectId();
}

public static
long putDummy(L2Object o)
{
return
o.getObjectId();
}

public static
int getStoredObjectId(int storedId)
{
return
storedId;
}

/**
* Функция котораяе удаляет элемент по его ObjId
**/
public static final void remove(L2Object o)
{
if (
o.isItem())
{
_allItems.remove(o.getObjectId());
return;
}
if (
o.isNpc())
{
_allNpcs.remove(o.getObjectId());
return;
}
if(
o.isPlayable())
{
if (
o.isPlayer())
{
_allPlayers.remove(o.getObjectId());
return;
}
else
{
_allSummons.remove(o.getObjectId());
return;
}
}
_allOthers.remove(o.getObjectId());
return;
}
}

И в L2Objectа нету больше Long _storedId (соответственно и еще в 100500 местах)

Завтра уже доделаю буду тестить)))
Ответ
#12
А смысл-то в чем)? По хорошему счету можно было оставить лишь 2 хранилища - _objects и _players.
Ответ
#13
надо бы попробовать твой скрипт,посмотреть что из этого получится
Ответ
#14
подниму старый топик, задумался о быстродействии.

Map<Integer, StatsSet> _storedInfo; и TIntObjectHashMap<StatsSet> _storedInfo;

Как я понял, gnu.trove (TIntObjectHashMap) работает намного быстрее и соответствено мы сэкономим больше места. Верно?
Ответ
#15
cokol Написал:подниму старый топик, задумался о быстродействии.

Map<Integer, StatsSet> _storedInfo; и TIntObjectHashMap<StatsSet> _storedInfo;

Как я понял, gnu.trove (TIntObjectHashMap) работает намного быстрее и соответствено мы сэкономим больше места. Верно?

TIntObjectHashMap В ключе хранит примитивный тип int, соответственно меньше кушает памяти, и процессора.
Map<Integer, StatsSet> хранит клич в Integer. Кушает больше памяти, и процессора. (конвертация с int в Integer и т д)
Ответ
#16
TIntObjectHashMap - конкурент небезопасна
consulo.io - Consulo - multi-language IDE
Ответ
#17
VISTALL Написал:TIntObjectHashMap - конкурент небезопасна

Пара lock-ов спасет Smile
Ответ
#18
Azagthtot Написал:Пара lock-ов спасет Smile

:redlol:ну их нету и получится такой срач
consulo.io - Consulo - multi-language IDE
Ответ
#19
ALFOS Написал:Во всех l2p l2f l2d сборках, есть хранилище, "L2ObjectsStorage" в котором хранятся все уникальные объекты.
Объекты хранятся в карте типа L2ObjectArray<Long, obj>.
Возникает вопрос
А не будет лучше если всё переделать в
TIntObjectHashMap?
И хранить не по каком то Long-уникальному айди, а по обычному int objId?
оО

Во всех, это потому что все это клоны одного ядра, но с различным дальнейшим развитием.

Почему? потому что таким образом хранят объекты с сейф потоков.

Добавлено через 1 минуту
Ro_0TT Написал:А смысл-то в чем)? По хорошему счету можно было оставить лишь 2 хранилища - _objects и _players.
да, я тоже не вижу смысла размазывать по массивам.

Добавлено через 2 минуты
cokol Написал:подниму старый топик, задумался о быстродействии.

Map<Integer, StatsSet> _storedInfo; и TIntObjectHashMap<StatsSet> _storedInfo;

Как я понял, gnu.trove (TIntObjectHashMap) работает намного быстрее и соответствено мы сэкономим больше места. Верно?
Быстрее - это если оно в одном потоке, а когда идут обращения много и из разных потоков - то тогда будет каша малаша.
Ответ
#20
еще вопросик: что лучше юзать List или ArrayList, в чем разница?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Стоит ли пилить Helios? Alay 26 8,270 02-20-2017, 04:01 PM
Последний пост: FaintSmile
  Стоит ли ставить Windows на гипервизор? Hett 2 1,439 07-21-2016, 12:56 PM
Последний пост: Hett
  IRC подскажите канал для того, чтобы не перегружать нубскими вопросами xcislav 4 1,644 08-31-2013, 04:51 PM
Последний пост: darkevil
  доходит до выбора и стоит Last-Norman 1 1,372 07-31-2013, 11:51 AM
Последний пост: gorodetskiy
  Подскажите стоит брать сборку Open-team hYdR0 19 3,807 07-20-2013, 02:51 PM
Последний пост: Zeratyl
  Стоит ли на данный момент открывать проект High Five? MrFanCold 108 23,424 04-06-2013, 03:20 PM
Последний пост: Krickt105
  Обязательно ли PathNode должен быть от того же разработчика от которого и геодата? MrFanCold 3 1,812 03-23-2013, 12:26 PM
Последний пост: Dеmon
  Ошибка после того как создам итем в инвентарь. Ololowke666 1 1,305 10-29-2012, 02:25 PM
Последний пост: Zubastic
  Что скажите? Стоит того? Сервер под ключ... vtaras 9 2,686 09-19-2011, 11:48 AM
Последний пост: Place
  Ищу того кто поставит серв на Debian Lender 8 2,748 06-08-2010, 09:12 AM
Последний пост: Paranormal

Перейти к форуму:


Пользователи, просматривающие эту тему: 6 Гость(ей)