管理游戏资源的最佳方式

时间:2015-09-04 11:59:08

标签: sql sql-server sql-server-2008 game-engine fetching-strategy

最近我开始游戏开发,我正在制作一个 MMORTS游戏(大型多人在线实时战略),但我一度陷入困境建议如何管理它。以下是这种情况: -

一般游戏信息

所有数据都保存在 SQL Server 2008
中 正在开发此游戏以用于移动设备

enter image description here

上面是游戏资源图标及其值。

每个资源都有每小时增加的假设: -

木材: - 100 / hr
石头: - 100 / hr
食物: - 100 / hr

问题

我正在开发的游戏将 10k用户同时使用此游戏,这意味着我无法持续更新资源值。所以我的问题是,我如何管理游戏资源(木材,石材,食品)?

为什么要更新数据库中的资源值?

这是因为如果一个人袭击一个城市,那么可以捕获多少资源(木材,石头,食物)。

我当前的方法

在城市受到攻击时改变价值但是有更好的方法吗?

请随时提出任何问题并更改问题的标签,因为我不知道这里适合的标签。

1 个答案:

答案 0 :(得分:2)

为什么你需要更新它,如果你有一个起始值和一个增加率,这是一个相当简单的计算。 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;

通过这种方式,您可以避免仅用于显示目的的不必要的事务。

N.B。我假设资源只会在整整一个小时后才会增加,如果情况不是这样,你可能会需要这样的东西:

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

话虽如此,为了游戏的目的,如果这将不断增加,最好只提取3个组件(速率,时间和起始值),并将它们存储在您的会话中,并执行在客户端计算。