Лучший способ управления ресурсами в игре

Недавно я приступил к разработке игры и сейчас занимаюсь созданием MMORTS-игры (многопользовательская онлайновая стратегия в реальном времени), но я застрял в одном месте и мне нужно предложение, как им управлять. Ниже случай:-

Общая информация об игре

Все данные сохраняются в SQL Server 2008
Эта игра разрабатывается для использования в мобильных телефонах.

введите описание изображения здесь

выше - значок игровых ресурсов с его значением.

Каждый ресурс имеет свое увеличение в час, предположим:

Дерево:- 100/ час
Камень:- 100/ час
Питание:- 100/ час

проблема

Игра, которую я разрабатываю, будет иметь 10 тысяч пользователей, использующих эту игру одновременно, что означает, что я не могу постоянно обновлять значение ресурса. Итак, мой вопрос, как мне управлять ресурсами игры (дерево, камень, еда)?

Зачем обновлять значение ресурса в базе данных?

Это потому, что если человек нападает на город, то сколько ресурсов (дерево, камень, еда) доступно для захвата.

Мой текущий подход

Изменение стоимости в момент нападения на город, но есть ли лучший способ сделать это?

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

1 ответ

Решение

Зачем вам вообще нужно его обновлять, если у вас есть начальное значение и скорость роста, это довольно простой расчет. StartValue + (HoursSinceStart * Rate), это покроет ваши дисплеи. Затем каждый раз, когда вы добавляете / удаляете ресурс по определенному действию, вставляете новую запись с суммой проведенных действий и новую отметку времени.

Например, используя Wood, User1 начинается с 100:

Ресурс

ResourceID  Name    HourlyIncrease
------------------------------------
1           Wood    100
2           Stone   100
3           Food    100

UserResource

UserID  ResourceID  Value   CreatedDateTime
---------------------------------------------
1       1           100     2015-09-04 10:00:00

Чтобы получить значение в @DateTime, вы можете использовать:

DECLARE @DateTime DATETIME2 = SYSDATETIME(),
        @UserID INT = 1,
        @ResourceID INT = 1;

SELECT  TOP 1
        Quantity = Value + (r.HourlyIncrease * DATEDIFF(HOUR, ur.CreatedDateTime, @DateTime))
FROM    UserResource AS ur
        INNER JOIN Resource AS r
            ON r.ResourceID = ur.ResourceID
WHERE   ur.ResourceID = @ResourceID
AND     ur.UserID = @UserID
AND     ur.CreatedDateTime < @DateTime
ORDER BY ur.CreatedDateTime DESC;

Затем, если пользователь делает что-то, что использует количество 50, просто создайте новую запись:

DECLARE @DateTime DATETIME2 = SYSDATETIME(),
        @UserID INT = 1,
        @ResourceID INT = 1,
        QuantityChange INT = -50;

INSERT UserResource (UserID, ResourceID, Value, CreatedDateTime)
SELECT  TOP 1
        ur.UserID,
        ur.ResourceID,
        Value = Value + (r.HourlyIncrease * DATEDIFF(HOUR, ur.CreatedDateTime, @DateTime)) + QuantityChange,
        CreatedDateTime = @DateTime
FROM    UserResource AS ur
        INNER JOIN Resource AS r
            ON r.ResourceID = ur.ResourceID
WHERE   ur.ResourceID = @ResourceID
AND     ur.UserID = @UserID
AND     ur.CreatedDateTime < @DateTime
ORDER BY ur.CreatedDateTime DESC;

Таким образом, вы избегаете ненужных транзакций для вещей, которые предназначены только для отображения.

NB. Я предполагал, что ресурс будет увеличиваться только после полного часа, если это не так, вам может понадобиться что-то вроде:

Quantity = Value + FLOOR((r.HourlyIncrease * DATEDIFF(SECOND, ur.CreatedDateTime, @DateTime) / 3600))

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

Другие вопросы по тегам