1

最近我开始了游戏开发,我正在制作一款MMORTS 游戏(大型多人在线实时策略),但我被困在了一个点上,需要如何管理它的建议。以下是案例:-

一般游戏信息

所有数据都保存在SQL Server 2008
中。这款游戏正在开发用于手机

在此处输入图像描述

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

假设每种资源都有每小时的增长:-

木材:- 100/小时
石头:- 100/小时
食物 :- 100/小时

问题

我正在开发的游戏将有10k 用户同时使用该游戏,这意味着我无法不断更新资源价值。所以我的问题是,我如何管理游戏的资源(木头、石头、食物)?

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

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

我目前的方法

在城市被攻击时改变价值但是有没有更好的方法呢?

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

4

1 回答 1

3

为什么你需要更新它,如果你有一个起始值和一个增长率,这是一个相当简单的计算。StartValue + (HoursSinceStart * Rate),这将覆盖您的显示器。然后,每次您通过特定操作添加/删除资源时,插入一条带有发布操作量的新记录和一个新的时间戳。

例如,使用 Wood,User1 以 100 开头:

资源

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

用户资源

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;

这样,您就可以避免对仅用于显示目的的事物进行不必要的交易。

注意我假设资源只会在一个小时完成后才会增加,如果不是这种情况,您可能需要类似的东西:

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

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

于 2015-09-04T12:35:22.363 回答