MMORPG通用成就系统两种表达式树方案求评估及替代建议
Hey fellow devs! Let me walk through my current progress on a universal achievement system for an MMORPG, and get your take on two expression tree approaches I'm weighing for filtering logic.
Project Background
I'm building a code-free, designer-friendly achievement system for an MMORPG. The core idea is to use configuration files to define achievements, which map to event type enums and support optional filter parameters. Here's a sample config:
name: ACHIEVEMENT_NAME event_type: ITEM_USAGE # String representation of the event enum count: 30 # Requirement: Use an item 30 times args: # Optional filter parameters item_vnum: 1127 # Target item VNum map_id: 1 # Only trigger on map ID 1
And here's the corresponding C# code structure:
public enum AchievementEventType { ITEM_USED, MONSTER_KILLED, } public interface IAchievementArgument { AchievementEventType EventType { get;} } public class MonsterKilledAchievementArgument : IAchievementArgument { public AchievementEventType EventType => AchievementEventType.MONSTER_KILLED; public long MonsterVnum { get; set; } public short? MapId { get; set; } } public class AchievementConfiguration { public string Name { get; set; } public string EventType { get; set; } public long Count { get; set; } public Dictionary<string, object>? Args { get; set; } } public delegate bool AchievementFilter(IAchievementArgument achievementArgument);
Core Problem: Choosing Expression Tree Approach for AchievementFilter
I plan to generate expression trees to build the AchievementFilter delegate, which determines whether a player's achievement counter should increment. I've got two competing approaches, each with tradeoffs, and I'm looking for external input on which to pick—or if there's a better middle ground.
Approach 1: One Expression Tree Per Achievement
- How it works: Generate a custom expression tree for every single achievement. The tree directly compares the incoming
IAchievementArgumentagainst that achievement's specific config parameters. - Pros: Blazing fast execution. Each achievement has a tailored delegate with no extra iteration overhead—just direct condition checks.
- Cons: Higher memory footprint. If the game ends up with hundreds or thousands of achievements, each holding its own delegate instance, memory usage can add up over time.
Approach 2: One Expression Tree Per IAchievementArgument Type
- How it works: Create a single, generic expression tree for each event argument type (e.g.,
MonsterKilledAchievementArgument). At runtime, it iterates through all key-value pairs in the achievement'sArgsconfig and checks if they match the incoming argument's properties. - Pros: Minimal memory usage. All achievements sharing the same event type reuse the same delegate, cutting down on instance count drastically.
- Cons: Slower execution. Every filter check requires looping through all configured parameters, which adds overhead—especially if an achievement has many optional args.
Looking for Community Input
I'd love to hear your thoughts:
- For a typical MMORPG scenario (lots of achievements, but not ultra-high frequency of filter checks), which approach makes more sense?
- Is there a hybrid optimization that balances memory and performance? For example, caching expression trees for common parameter combinations?
内容的提问来源于stack exchange,提问作者Blowa

