游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4952|回复: 4

回合制战斗逻辑循环与多线程单线程选择

[复制链接]

2

主题

10

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2012-6-10 10:13:00 | 显示全部楼层 |阅读模式
正做一款回合制小游戏,遇到了多线程和单线程的选择问题:

战斗逻辑循环很明了,如下:

for(所有战斗单位)
{
  当前单位:
  {
    if(当前单位属电脑控制)
    {
      计算行动方式;
    }
    else(当前单位属玩家控制)
    {
      等待玩家输入行动方式;
    }

    行动;
  }

  设置下个单位为当前单位;
}

如果选择多线程(把以上战斗逻辑循环放在一个单独的线程中):
优点:战斗逻辑循环可直接使用,无需更改,代码清晰。
缺点:与界面显示之间大量的同步代码,极易出错,调试困难,难于维护。

如果选择单线程:
优点:单一线程,无同步代码,调试简单,易于维护。
缺点:战斗逻辑循环无法直接使用,因为程序无法同时运行两个循环(主界面消息循环和战斗逻辑循环)。需使用状态机等方式将战斗逻辑循环拆解执行,代码支离破碎。

望高手支招,多谢。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20547
发表于 2012-6-10 10:22:00 | 显示全部楼层

Re:回合制战斗逻辑循环与多线程单线程选择

妥妥单线程处理掉。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20547
发表于 2012-6-10 11:04:00 | 显示全部楼层

Re:回合制战斗逻辑循环与多线程单线程选择

补充一下楼主说的单线程缺点问题,

是不是用了一些堵塞式的处理,如果是单线程,可以让各块逻辑是轮询式或事件触发,这样就不会出现无法同时UI逻辑和主逻辑之类的问题,将控制权按序列发送下去,可以比较好解决这个问题。

关于多线程,我相信你将面临更多问题,而且程序不易于调试,在没有对windows系统构架很熟悉的情况下,我个人不建议过多使用多线程来处理逻辑部分。

2

主题

10

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2012-6-10 13:36:00 | 显示全部楼层

Re: 回合制战斗逻辑循环与多线程单线程选择

我最初是选择多线程的,一直以来如履薄冰,很小心的加锁,但经过近几天莫名的死锁和对代码质量的不确定感后,我决定单线程了,稳定第一啊。多线程还是留给更需要的模块吧。

但现在的问题是,回合制战斗逻辑放在循环里真的是一个最直观的选择,如果让各块逻辑按状态机方式轮询要增加不少偶然复杂性,比如状态记录参数传递等,代码在一个循环里的话就简洁多了。

想保留这个逻辑循环的话用嵌套消息处理可不可以呢 (类似于Delphi耗时操作循环中不断调用Application.ProcessMessage来响应用户输入和更新界面,达到类似多线程的效果):

战斗逻辑循环:
{
    ...
    while(等待用户输入)
    {
      处理消息,渲染帧;
    }
    ...
    while(等待动画结束)
    {
      处理消息,渲染帧;
    }
    ...
}

2

主题

10

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2012-6-13 21:41:00 | 显示全部楼层

Re:回合制战斗逻辑循环与多线程单线程选择

经过几天的考虑和实验,决定用嵌套消息处理了:既不破坏程序结构,又无多线程。呵呵,就是我想要的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-29 12:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表