2015-05-31 13 views
-4

Я делаю игру Unity (C# 2.0), и это первый раз, когда я делаю все, что требует наилучшей производительности. Когда миссия заканчивается, игроку дается определенное количество ресурсов в зависимости от фактора времени, который удерживается объектом миссии. Всего всего 4 ресурса, поэтому я использовал 4 16-длинных переключателя-на-int (время * 1000), по одному коммутатору на ресурс.Switch vs dictionary with double keys

static int resource1reward(double time) 
{ 
    int time2 = time*1000; 
    switch (time2) 
    { 

    } 
} 

Глядя на некоторые должности, я решил попробовать использовать 4 словаря.

Dictionary<double, int> resource1dic = new Dictionary<double, int>(16); 
static int resource1dicreward(double time) 
{ 
    return resource1[time]; 
} 

Используя секундомер, я увидел огромную разницу между вызовом (1) 4 метода; и (2) один метод, который искал 4 словаря.

  1. 10 до 15 мс
  2. от 0 до 2 мс

Проблема заключается в том, что я до сих пор очень длинный статический метод, который инициализирует 4 словарей. Все они имеют одинаковые ключи (таймер), но разные значения. Есть ли лучший/более чистый способ сделать это?

+0

Создайте структуру, которая отображает ваш прецедент, и используйте * that * в качестве значения в словаре. –

+0

@PrestonGuillot - Я уже использую это –

+0

Вы уже используете что? В вашем примере значение в вашем словаре является «int», и вы заявляете, что у вас есть 4 словаря. То, что вы хотите * хотеть *, - это «Словарь <строка, SomeCustomType>», где 'SomeCustomType' имеет четыре поля' int'. –

ответ

0

Ваша бизнес-логика немного неясна, но в отношении проблемы инициализации/производительности словаря слова решение ниже может служить допустимой альтернативой. Документы, касающиеся вашего потребительной случае, вы можете объявить Dictionary<double, int>, как показано в следующем примере C# фрагмента кода:

public static Dictionary<double, int> SampleDictionary =new Dictionary<double, int> 
{ 
    { 3.1, 3}, 
    { 3.14, 3}, 
    { 3.1415, 3}, 
    { 2.72, 2}, 
    { 2.728, 2} 
}; 

Это будет очень быстро и довольно просто. Надеюсь, это поможет.

+0

Вот что я использую прямо сейчас. Дело в том, что в итоге я получил 4 объявления, например, частный статический словарь Sample1 = новый словарь {{1.1, 1}, {1.2, 2} // continue to 16} Действительно ли это самый простой? –

+0

Я бы сказал, что да, и он также должен быть очень быстрым (обращаясь к вашей основной проблеме производительности). Если вы удовлетворены ответом, пожалуйста, отметьте его принятым.Спасибо и приветствую, –

0

Как насчет установки как это:

Dictionary<Resource, Dictionary<double, int>> rewards = new Dictionary<Resource, Dictionary<double, int>>(); 

public class Mission 
{ 
    public Resource ResourceToAward { get; set; } 
    public double Time { get; set; } 
} 

public enum Resource 
{ 
    ResourceOne, 
    ResourceTwo, 
    ResourceThree, 
    ResourceFour 
} 

Из некоторых простых тестов, я вижу реальную int значения последовательно обращался примерно 0,9 миллисекунд.

Mission theMission = new Mission() 
{ 
    ResourceToAward = Resource.ResourceFour, 
    Time = 15 
}; 

Resource resource = theMission.ResourceToAward; 
double time = theMission.Time; 

int resourceAmountAwarded = rewards[resource][time]; 

Просто предложение, я бы создать Dictionary<Resource, Dictionary<double, int>> объект ПЕРЕД начала миссии, так что нет ненужного время добавляется к времени миссии.

+0

Я не могу понять, как после этого подхода мне удастся удалить повторение кода, то, что я использую сейчас, является 'internal static int [] giveRewards() {int [] returner = {resource1dic [time] , resource2dic [time], resource3dic [time], resource4dic [time]} 'и создать словари в статическом конструкторе класса –

+0

@ user3932049 Какой код повторяется в вашей программе? Вы должны инициализировать словари где-то, и, если они все разные без шаблона, вы действительно не можете упорядочить его гораздо больше, не найдя 4 отдельных уравнения, которые приближают значения. – Kaz

+0

ОК, это то, о чем я беспокоился. Думал, что может быть другой подход, который, возможно, не включал словари/переключатели. Я мог бы закончить сериализацию объектов словаря и извлечение их из моей базы данных. Спасибо –