当前位置:编程学习 > C#/ASP.NET >>

AJXA模版刷新延迟问题

此项目大体布局上模仿QQ游戏大厅第一步是设计围棋游戏。这个项目的关键点在于如何实时测试玩家是否在线,玩家的对象里有个存储时间的属性,在游戏页面里AJXA模版里每一秒更新一下存储时间。而每局游戏的对象每过2秒遍历检查一下每个用户的存储时间,如果存储时间大于我调试ASP.NET本地网站 用time刷新ajxa模版可发现刷新有延时 而且第一个会话比第二个会话本身严重 第二个会话开启第一个延时就严重了
    //所有游戏的对局基
    [Serializable]    
    public abstract class ZuoBase : DuiJu
    {
        private bool zhuangTai = false;//游戏是否开始
        private string diZhi = null;//游戏页面的地址
        private int liKaiHao = -1;//被判定离开的玩家座位号,留到游戏页具体处理
        [NonSerializedAttribute()]
        private System.Timers.Timer timer = null;//计时器
        private String liaoTian = "";//本局游戏的聊天记录
//属性定义部分取消
        //用户点击座位加入游戏,玩家对象之前已经创建好了但只有YongHu属性不为空才算座位上有玩家
        public void addWanJia(YongHu yongHu, int weiZhi)
        {
//...
        }
        //每两秒检查一下玩家的存储时间,如果游戏开始与现在相差两秒的玩家座位号记录下来进一步处理否则直接踢出
        private void TimerEventFunction(Object sender, System.Timers.ElapsedEventArgs e)
        {
            DateTime dt = DateTime.Now;
            bool zhuangTai = false;
            for (int i = 0; i < wanJiaList.Count; i++)
            {
                WanJia wanJia = WanJiaList[i];
                if (wanJia.YongHu != null)
                {
                    TimeSpan ts = dt.Subtract(wanJia.TiJiao);
                    if (ts.TotalSeconds >= 2)
                    {
                        if (zhuangTai)
                        {
                            liKaiHao = i;
                        }
                        else
                        {
                            wanJia.YongHu = null;
                            wanJia.FenShu = 0;
                            wanJia.ZhuangTai = false;
                        }
                    }
                    else
                    {
                        zhuangTai = true;
                    }
                }
            }
            if (!zhuangTai)
            {
                timer = null;
            }
        }

        public abstract void addWanJia(int zuoShu);
    }


下面是围棋游戏页面的页面代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="WeiQi_Default" %>
<!--头部部分省略-->
<body background="../img/weiqi/beijing.bmp">
    <form id="form1" runat="server">
   <asp:ScriptManager ID="smMoBan" runat="server">
        </asp:ScriptManager>
        <!--棋盘的图片-->
        <asp:Image ID="picQiPan" runat="server" style="z-index: 103; left: 151px; position: absolute; top: 35px;"  Height="529px" Width="529px" ImageUrl="~/img/weiqi/qipan.jpg" />
        <asp:UpdatePanel ID="uplWeiQi" runat="server"  UpdateMode="Conditional">
            <contenttemplate>
                <asp:Timer id="timWeiQi" runat="server" Interval="1000" OnTick="timWeiQi_Tick"></asp:Timer> 
                <div id="HeiZiLayer"  style="z-index: 101; left: 13px; width: 100px; position: absolute; top: 20px;
        height: 100px;">
        <!--显示玩家的头像和信息的用户控件-->
        <uc2:TouXiang ID="touXiang1" runat="server" />
    </div>
    <div id="BaiZiLayer"  style="z-index: 102; left: 13px; width: 100px; position: absolute; top: 226px;
        height: 100px;">
        <!--显示玩家的头像和信息的用户控件-->
        <uc2:TouXiang ID="touXiang2" runat="server" />
    </div>
    <!--玩家和观看游戏的用户列表,目前出现了问题暂时搁置-->
    <asp:Panel ID="pnlYongHu" runat="server" Height="227px" ScrollBars="Auto" Style="z-index: 103;
            left: 689px; position: absolute; top: 19px" Width="242px">
                    <asp:GridView ID="gvYongHu" runat="server" AutoGenerateColumns="False">
                        <Columns>
                            <!--省略列名-->
                        </Columns>
                    </asp:GridView>
        </asp:Panel>
            </contenttemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="timWeiQi" EventName="Tick"></asp:AsyncPostBackTrigger>
</Triggers>
        </asp:UpdatePanel>
        <div ID="QiPanKongZhiLayer" runat="server" Height="7px" Style="z-index: 104;
            left: 236px; position: absolute; top: 567px; width: 340px; height: 28px;" Width="299px">
            <asp:Button ID="btnKaiShi" runat="server" Text="开始" OnClick="btnKaiShi_Click" /> 
            <!--省略其他按钮-->
        </div>
        <div style="z-index: 105; left: 688px; width: 100px; position: absolute; top: 267px;
            height: 100px">
            <!--聊天的用户控件-->
            <uc1:LiaoTian id="LiaoTian1" runat="server">
            </uc1:LiaoTian></div>
            <!--用于更新玩家的存储时间-->
            <asp:UpdatePanel ID="UpdatePanel2" runat="server"  UpdateMode="Conditional">
            <contenttemplate>
                <asp:Timer id="timWeiQi2" runat="server" Interval="1000" OnTick="timWeiQi2_Tick"></asp:Timer> 
            </contenttemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="timWeiQi2" EventName="Tick"></asp:AsyncPostBackTrigger>
</Triggers>
        </asp:UpdatePanel>
    </form>
</body>
</html>
下面是围棋游戏页面的后置代码:
public partial class WeiQi_Default : System.Web.UI.Page
{
    //因为AXJA模版更新时会触发Page_Load所以我把这些需要实时更新信息的方法都放这里了
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["FangJianId"] != null && Request.QueryString["ZuoShu"] != null && Request.QueryString["YouXiId"] != null)
        {
            Dictionary<string, FangJian> allFangJians = (Dictionary<string, FangJian>)Application["allFangJian"];
            FangJian fangJian = allFangJians[Request.QueryString["FangJianId"]];
            Hashtable zuoBases = (Hashtable)fangJian.ZuoList;
            WeiQiZuo weiQiZuo = (WeiQiZuo)zuoBases[Request.QueryString["ZuoShu"]];
            LiaoTian1.ZuoBase = (ZuoBase)weiQiZuo;
            //更新棋盘上的棋子
    //...
            //更新两个玩家的信息
            //...
            //更新按钮
            //...
        }
    }
    protected void timWeiQi_Tick(object sender, EventArgs e)
    {
        //...
    }
    //点击棋子下棋
    protected void btnQiZi_Click(object sender, EventArgs e)
    {
        //...
    }
    //点击招手,如果两个玩家都点击招手则游戏开始
    protected void btnKaiShi_Click(object sender, EventArgs e)
    {
//...
    }
    //用于更新玩家的存储时间
    protected void timWeiQi2_Tick(object sender, EventArgs e)
    {
        if (Request.QueryString["FangJianId"] != null && Request.QueryString["ZuoShu"] != null && Request.QueryString["YouXiId"] != null)
        {
            Dictionary<string, FangJian> allFangJians = (Dictionary<string, FangJian>)Application["allFangJian"];
            FangJian fangJian = allFangJians[Request.QueryString["FangJianId"]];
            Hashtable zuoBases = (Hashtable)fangJian.ZuoList;
            WeiQiZuo weiQiZuo = (WeiQiZuo)zuoBases[Request.QueryString["ZuoShu"]];
            LiaoTian1.ZuoBase = (ZuoBase)weiQiZuo;

            if (Session["zuoWeiShu"] != null)
            {
                int zuoWeiShu = Convert.ToInt32(Session["zuoWeiShu"]);
                weiQiZuo.WanJiaList[zuoWeiShu].TiJiao = DateTime.Now;
            }
        }
    }
}
--------------------编程问答-------------------- 为什么没人回复?? --------------------编程问答-------------------- 你的..............
不知道lz准备要多少台天河1号啊? --------------------编程问答--------------------
引用 2 楼 luoweihua7 的回复:
你的..............
不知道lz准备要多少台天河1号啊?


什么意思? --------------------编程问答-------------------- 这不要刷死人 --------------------编程问答-------------------- 我表示关注这个游戏 --------------------编程问答-------------------- 服务器性能低下 --------------------编程问答-------------------- 如果只是因为效率低的话,为什么第二个会话的刷新速度偏向与正常,有没有什么办法提高运行速度?
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,