在游戏中管理资源的最佳方式
Best way to manage resources in a game
最近我开始了游戏开发,我正在制作一个MMORTS 游戏(大型多人在线实时策略游戏)但是我被困在某一点上,需要建议如何管理它。以下是案例:-
一般游戏信息
所有数据保存在SQL Server 2008
该游戏正在开发中,用于 手机 。
上面是游戏资源图标及其值。
每个资源都有其每小时增加假设:-
木材 :- 100/小时
斯通 :- 100/小时
食物 :- 100/小时
问题
我正在开发的游戏将有 10k 用户 同时使用该游戏,这意味着 我无法持续更新资源值 .所以我的问题是,我如何管理游戏的资源(木头、石头、食物)?
为什么要更新数据库中的资源值?
因为如果一个人进攻一个城市,那么有多少资源(木头,石头,食物)可以被夺取。
我目前的做法
攻城时改变数值,有没有更好的方法?
请随时提出任何问题并更改问题的标签,因为我不知道什么标签适合这里。
为什么你需要更新它,如果你有一个起始值和一个增长率,这是一个相当简单的计算。 StartValue + (HoursSinceStart * Rate)
,这将覆盖您的显示器。然后,每次您通过特定操作 add/remove 资源时,都会插入一条包含 post 操作数量和新时间戳的新记录。
例如,使用 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;
这样您就可以避免对仅用于展示目的的事物进行不必要的交易。
N.B。我假设资源只会在一个小时完成后增加,如果不是这种情况,您可能需要类似的东西:
Quantity = Value + FLOOR((r.HourlyIncrease * DATEDIFF(SECOND, ur.CreatedDateTime, @DateTime) / 3600))
话虽这么说,为了游戏的目的,如果这将不断增加,那么最好只提取 3 个组件(速率、时间和起始值),并将它们存储在您的会话中,并且在客户端进行计算。
最近我开始了游戏开发,我正在制作一个MMORTS 游戏(大型多人在线实时策略游戏)但是我被困在某一点上,需要建议如何管理它。以下是案例:-
一般游戏信息
所有数据保存在SQL Server 2008
该游戏正在开发中,用于 手机 。
上面是游戏资源图标及其值。
每个资源都有其每小时增加假设:-
木材 :- 100/小时
斯通 :- 100/小时
食物 :- 100/小时
问题
我正在开发的游戏将有 10k 用户 同时使用该游戏,这意味着 我无法持续更新资源值 .所以我的问题是,我如何管理游戏的资源(木头、石头、食物)?
为什么要更新数据库中的资源值?
因为如果一个人进攻一个城市,那么有多少资源(木头,石头,食物)可以被夺取。
我目前的做法
攻城时改变数值,有没有更好的方法?
请随时提出任何问题并更改问题的标签,因为我不知道什么标签适合这里。
为什么你需要更新它,如果你有一个起始值和一个增长率,这是一个相当简单的计算。 StartValue + (HoursSinceStart * Rate)
,这将覆盖您的显示器。然后,每次您通过特定操作 add/remove 资源时,都会插入一条包含 post 操作数量和新时间戳的新记录。
例如,使用 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;
这样您就可以避免对仅用于展示目的的事物进行不必要的交易。
N.B。我假设资源只会在一个小时完成后增加,如果不是这种情况,您可能需要类似的东西:
Quantity = Value + FLOOR((r.HourlyIncrease * DATEDIFF(SECOND, ur.CreatedDateTime, @DateTime) / 3600))
话虽这么说,为了游戏的目的,如果这将不断增加,那么最好只提取 3 个组件(速率、时间和起始值),并将它们存储在您的会话中,并且在客户端进行计算。