Meilleure façon de gérer les ressources dans un jeu

Récemment j'ai commencé le développement de jeux et je suis en train de faire un jeu MMORTS (stratégie en ligne en time réel massivement multijoueur) mais je suis coincé à un moment donné et j'ai besoin de suggestions pour le gérer. Voici le cas: –

Informations générales sur le jeu

Toutes datatables sont enregistrées dans SQL Server 2008
Ce jeu est en cours de développement pour être utilisé dans les mobiles .

entrez la description de l'image ici

ci-dessus est l'icône des ressources du jeu avec sa valeur.

Chaque ressource a son augmentation par heure supposer: –

Bois : – 100 / h
Pierre : – 100 / h
Nourriture : – 100 / heure

Problème

Le jeu que je développe aurait 10k users utilisant ce jeu en même time ce qui signifie que je ne peux pas mettre à jour continuellement la valeur de la ressource . Donc ma question est, comment puis-je gérer les ressources du jeu (bois, pierre, nourriture)?

Pourquoi mettre à jour la valeur de ressource dans la database?

C'est parce que si une personne attaque une ville, alors combien de ressources (bois, pierre, nourriture) sont disponibles pour être capturé.

Mon approche actuelle

Changer de valeur au moment où la ville est attaquée mais existe-t-il une meilleure méthode pour le faire?

N'hésitez pas à poser des questions et à changer les mots-keys de la question, car je ne sais pas quelle label correspondrait ici.

Pourquoi avez-vous besoin de le mettre à jour du tout, si vous avez une valeur de départ et un taux d'augmentation, c'est un calcul assez simple. StartValue + (HoursSinceStart * Rate) , cela couvrira vos affichages. Ensuite, chaque fois que vous ajoutez / supprimez une ressource par une action spécifique, insérez un nouvel logging avec le montant de l'action de publication et un nouvel horodatage.

Par exemple, en utilisant Wood, User1 commence par 100:

Ressource

 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 

Pour get la valeur à @DateTime, vous pouvez utiliser:

 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; 

Ensuite, si l'user fait quelque chose qui utilise une quantité de 50, il suffit de créer un nouvel logging:

 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; 

De cette façon, vous évitez les transactions inutiles pour des choses qui ne sont qu'à des fins d'affichage.

NB J'ai supposé que la ressource n'augmenterait qu'après une heure complète, si ce n'est pas le cas, vous pourriez avoir besoin de quelque chose comme:

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

Cela étant dit, pour les besoins du jeu, si cela va sans cesse augmenter, il est probablement préférable d'extraire les 3 composants (taux, time et valeur de départ), et de les stocker dans votre session, et de faire le calcul sur le côté client.