目前大多数使用的寻路算法有哪些?

目前市面上大部分游戏的寻路算法是A*,或者B*。
A*通常所说的是最优算法也就是寻找最短路径。B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路。当然以上都是我的理解。

我这里只描述一下A*算法的一部分。

通常A*算法分为四方向和八方向计算。

现目前的游戏方式来看不管是2D还是2.5D,还是3D,几乎都采用8方向方式,也有游戏是采用360°点位方式。

本文重点剖析8方向的。

先来看一个效果图

图中你看到的图案表示非阻挡地区,其余是阻挡地区。

绿色的线是表示寻路走过路线。

寻路步骤

 1. 从起点A开始, 把它作为待处理的方格存入一个"开启列表", 开启列表就是一个等待检查方格的列表.
 2. 寻找起点A周围可以到达的方格, 将它们放入"开启列表", 并设置它们的"父方格"为A.
 3. 从"开启列表"中删除起点 A, 并将起点 A 加入"关闭列表", "关闭列表"中存放的都是不需要再次检查的方格

原谅我盗用了园友的图。

图中浅绿色描边的方块表示已经加入 "开启列表" 等待检查. 淡蓝色描边的起点 A 表示已经放入 "关闭列表" , 它不需要再执行检查.

从 "开启列表" 中找出相对最靠谱的方块, 什么是最靠谱? 它们通过公式 F=G+H 来计算.

废话不多说了,直接来源码

源码来之园友,但是稍作修改。修改1,原本算法不支持复杂地形图。修改2,原本算法foreach List列表,改为for循环,倒入循环。因为每一次的寻路下一个节点的时候8方向都是上一个节点。修改3,修改单例模式。

来一张大图看看目前我的地形图

源码

     public class FindWayManager
     {
         static readonly FindWayManager instance = new FindWayManager();
         public static FindWayManager Instance { get { return instance; } }

         /// <summary>
         /// 阻挡点配置,,
         /// </summary>
         ;

         //从开启列表查找F值最小的节点
         private Point GetMinFFromOpenList(List<Point> Open_List)
         {
             Point Pmin = null;

             int count = Open_List.Count;
             ; i >= ; i--)
             {
                 if (Pmin == null || Pmin.G + Pmin.H > Open_List[i].G + Open_List[i].H)
                     Pmin = Open_List[i];
             }
             return Pmin;
         }

         //判断关闭列表是否包含一个坐标的点
         private bool IsInCloseList(int x, int y, List<Point> Close_List)
         {
             )
             {
                 return false;
             }

             int count = Close_List.Count;
             ; i >= ; i--)
             {
                 if (Close_List[i].X == x && Close_List[i].Y == y)
                     return true;
             }
             return false;
         }
         //从关闭列表返回对应坐标的点
         private Point GetPointFromCloseList(int x, int y, List<Point> Close_List)
         {
             int count = Close_List.Count;
             ; i >= ; i--)
             {
                 if (Close_List[i].X == x && Close_List[i].Y == y)
                     return Close_List[i];
             }
             return null;
         }

         //判断开启列表是否包含一个坐标的点
         private bool IsInOpenList(int x, int y, List<Point> Open_List)
         {
             int count = Open_List.Count;
             ; i >= ; i--)
             {
                 if (Open_List[i].X == x && Open_List[i].Y == y)
                     return true;
             }
             return false;
         }
         //从开启列表返回对应坐标的点
         private Point GetPointFromOpenList(int x, int y, List<Point> Open_List)
         {
             int count = Open_List.Count;
             ; i >= ; i--)
             {
                 if (Open_List[i].X == x && Open_List[i].Y == y)
                     return Open_List[i];
             }
             return null;
         }

         //计算某个点的G值
         private int GetG(Point p)
         {
             ;
             ;
             ;
         }

         //计算某个点的H值
         private int GetH(Point p, Point pb)
         {
             return Math.Abs(p.X - pb.X) + Math.Abs(p.Y - pb.Y);
         }

         //检查当前节点附近的节点
         private void CheckP8(Point p0, byte[,] map, Point pa, Point pb, List<Point> Open_List, List<Point> Close_List)
         {
             //这里的循环其实就是8方向判断
             ; xt <= p0.X + ; xt++)
             {
                 ; yt <= p0.Y + ; yt++)
                 {
                     //排除超过边界和等于自身的点
                      && xt < map.GetLongLength() && yt >=  && yt < map.GetLongLength()) && !(xt == p0.X && yt == p0.Y))
                     {
                         //排除障碍点和关闭列表中的点
                         if (map[yt, xt] != BlockConst && !IsInCloseList(xt, yt, Close_List))
                         {
                             Point pt = GetPointFromOpenList(xt, yt, Open_List);
                             if (pt != null)
                             {
                                 //如果节点在开启列表中更新带价值
                                 ;
                                 ;
                                 ;
                                 if (G_new < pt.G)
                                 {
                                     //Open_List.Remove(pt);
                                     pt.Next = p0;
                                     pt.G = G_new;
                                     //Open_List.Add(pt);
                                 }
                             }
                             else
                             {
                                 //不在开启列表中,如果不存在创建添加到开启列表中
                                 pt = new Point();
                                 pt.X = xt;
                                 pt.Y = yt;
                                 pt.Next = p0;
                                 pt.G = GetG(pt);
                                 pt.H = GetH(pt, pb);
                                 Open_List.Add(pt);
                             }
                         }
                     }
                 }
             }
         }

         public Point FindWay(byte[,] r, int sx, int sz, int ex, int ez)
         {
             //定义出发位置
             Point pa = new Point();
             pa.X = sx;
             pa.Y = sz;
             //定义目的地
             Point pb = new Point();
             pb.X = ex;
             pb.Y = ez;
             //如果点超出范围,或者是阻挡点
              < pb.X && pb.X < r.GetLength()
                 &&  < pa.X && pa.X < r.GetLength()
                 &&  < pb.Y && pb.Y < r.GetLength()
                 &&  < pa.Y && pa.Y < r.GetLength()
                 && !CheckBlocking(r, pa)
                 && !CheckBlocking(r, pb))
             {
                 //开启列表
                 List<Point> Open_List = new List<Point>();
                 //关闭列表
                 List<Point> Close_List = new List<Point>();

                 Open_List.Add(pa);
                 ))
                 {
                     Point p0 = GetMinFFromOpenList(Open_List);
                     if (p0 == null) return null;
                     Open_List.Remove(p0);
                     Close_List.Add(p0);
                     CheckP8(p0, r, pa, pb, Open_List, Close_List);
                 }
                 Point p = GetPointFromOpenList(pb.X, pb.Y, Open_List);
                 return Reverse(p);
             }
             return null;
         }

         Point Reverse(Point point)
         {
             //新节点
             Point newNode = null;
             //当前节点
             Point current = point;
             while (current != null)
             {
                 //取当前节点的下一个,放入临时节点中
                 Point temp = current.Next;
                 //将当前节点的下一个设置为新节点
                 //(第一次将设置为null,也对着呢,因为第一个节点将作为尾节点)
                 current.Next = newNode;
                 //把当前节点给新节点
                 newNode = current;
                 //把临时节点给当前节点(就是取当前节点的下一个而已)
                 current = temp;
             }
             //将最后的新节点给头节点
             return newNode;
         }

         public bool CheckBlocking(byte[,] r, Point point)
         {
             return CheckBlocking(r, point.X, point.Y);
         }

         public bool CheckBlocking(byte[,] r, int x, int y)
         {
             return r[y, x] == BlockConst;
         }

         public void PrintMap(byte[,] r)
         {
             Console.Clear();
             Console.ForegroundColor = ConsoleColor.Gray;
             ; y < r.GetLongLength(); y++)//Y轴
             {
                 ; x < r.GetLongLength(); x++)//X轴
                 {
                     Console.Write(r[y, x]);
                 }
                 Console.Write("\n");
             }

         }

         public void PrintWay(byte[,] r, Point way)
         {
             Console.ForegroundColor = ConsoleColor.Green;
             while (way != null)
             {
                 Console.CursorLeft = way.X;
                 Console.CursorTop = way.Y;
                 Console.Write(");
                 System.Threading.Thread.Sleep();
                 way = way.Next;
             }
             Console.ForegroundColor = ConsoleColor.Gray;
         }

         bool check(int x, int y, Point way)
         {
             Point f = way;
             while (f != null)
             {
                 if (f.X == x && f.Y == y)
                 {
                     return true;
                 }
                 f = f.Next;
             }
             return false;
         }
     }

     public class Point
     {
         //坐标点
         public int Y { get; set; }
         //坐标点
         public int X { get; set; }
         //从起点到当前点的代价
         public int G { get; set; }
         //从终点到当前点的代价
         public int H { get; set; }

         public Point()
         {
         }

         public Point Next { get; set; }
     }

由于地图阻挡点配置是由工具决定的,所以我根据我这里的方式来创建测试代码

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Xml.Serialization;

 namespace ConsoleApplication1
 {
     [XmlRootAttribute("SceneInfo_Server")]
     [Serializable]
     public class MapBlockConfig
     {
         public MapBlockConfig()
         {

         }
         [XmlAttribute("MapID")]
         public int MapID { get; set; }

         [XmlElement("WalkSetting")]
         public WalkSetting Walk { get; set; }

         [Serializable]
         public class WalkSetting
         {
             public WalkSetting()
             {

             }
             [XmlAttribute("RZLEN")]
             public int Rzlen { get; set; }

             [XmlAttribute("RXLEN")]
             public int Rxlen { get; set; }

             [XmlAttribute("STARTX")]
             public int Startx { get; set; }

             [XmlAttribute("STARTY")]
             public int Starty { get; set; }

             [XmlAttribute("STARTZ")]
             public int Startz { get; set; }

             [XmlAttribute("BLOCKINFO")]
             public String Blockinfo { get; set; }
         }

     }
 }

阻挡配置

<?xml version="1.0" encoding="utf-8"?>
<SceneInfo_Server xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" MapID="3501">
  <WalkSetting RZLEN="120" RXLEN="120" STARTX="0" STARTY="200" STARTZ="0" BLOCKINFO="111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000011111111111111111111111111111111111111111111111111111111111111111111111111110000000000011111111111111111111110000000000001111111111111111111111111111111111111111100000000001111111111111111111111000000000000001111111111111111111100000000000000011111111111111111111111111111111111111000000000000111111111111111111110000000000000000111111111111111111000000000000000011111111111111111111111111111111111100000000000000011111111111111111110000000000000000111111111111111110000000000000000011111111111111111111111111111111111000000000000000001111111111111111100000000000000000011111111111111100000000000000000011111111111111111111111111111111110000000000000000000111111111111111100000000000000000011111111111111000000000000000000011111111111111111111111111111111100000000000000000000001111111111111100000000000000000001111111111111100000000000000000011111111111111111111111111111111100000000000000000000000111111111111100000000000000000001111111111111110000000000000000011111111111111111111111111111111100000000000000000000000011111111111110000000000000000001111111111111100000000000000000111111111111111111111111111111111100000000000000000000000001111111111110000000000000000001111111111110000000000000000000111111111111111111111111111111111100000000000000000000000001111111000000000000000000000001111111111100000000000000000001111111111111111111111111111111111100000000000000000000000000000000000000000000000000000001111111110000000000000000000011111111111111111111111111111111111100000000000000000000000000000000000000000000000000000001111111100000000000000000000111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111100000000000000000000000001111111000000000000000000000000000000000000000000000011111111111111111111111111111111111111111100000000000000000000000001111111000000000000000000000000000000000000000000000111111111111111111111111111111111111111111100000000000000000000000001111111000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111100000000000000011111111111111100000000000000000000000000000000000000000111111111111111111111111111111111111111111111111100000000000000011111111111111111000000000000000000000000000000000000011111111111111111111111111111111111111111111111111100000000000000111111111111111111100000000000000000000010000000000000111111111111111111111111111111111111111111111111111100000000000000111111111111111111111000000000000000000111000000000001111111111111111111111111111111111111111111111111111100000000000001111111111111111111111100000000000000001111100000000001111111111111111111111111111111111111111111111111111100000000000001111111111111111111111111000000000000011111100000000001111111111111111111111111111111111111111111111111111100000000000001111111111111111111111111111111111100111111100000000001111111111111111111111111111111111111111111111111111100000000000111111111111111111111111111111111111111111111100000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111110000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111110000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111111000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111110000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111110000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111110000000001111111111111111111111111111111111111111111111111111000000000000011111111111111111111111111111111111111111111110000000001111111111111111111111111111111111111111111111111111000000000000011111111111111111111111111111111111111111111111000000000111111111111111111111111111111111111111111111111111000000000000011111111111111100001111111111111111111111111111000000000001111111111111111111111111111111111111111111111111000000000000011111111111111000000000000000001111111111111111100000000000011111111111111111111111111111111111111111111111000000000000011111111111110000000000000000000000000011111111110000000000000011111111111111111111111111111111111111111111000000000000011111111111000000000000000000000000000001111111111100000000000000111111111111111111111111111111111111111111000000000000011111111110000000000000000000000000000001111111111100000000000000001111111111111111111111111111111111111111100000000000011111111100000000000000000000000000000000111111111100000000000000000011111111111111111111111111111111111111100000000000011111110000000000000000000000000000000000111111111100000000000000000000111111111111111111111111111111111111100000000000011111110000000000000000000000000000000000111111111100000000000000000000001111111111111111111111111111111111100000000000011111100000000000000000000000000000000000111111111100000000000000000000000011111111111111111111111111111111100000000000011111100000000000000000000000000000000000111111111100000000000000000000000000111111111111111111111111111111100000000000011111100000011000000000000000000000000000111111111100000000000000000000000000111111111111111111111111111111100000000000011111100000111110000000000000000000000000111111111100000000000000000000000000111111111111111111111111111111100000000000011111100000111111000000000000000000000000111111111100000000000000000000000000011111111111111111111111111111100000000000111111100000001111000000000000000000000000111111111100000000000000000000000000011111111111111111111111111111100000000000111111000000000001000000000000000000000000111111111100000000000000000000000000001111111111111111111111111111100000000000111111000000000000000000000000000000000000111111111100000000000000000000000000001111111111111111111111111111100000000000111111000000000000000000000000000000000000111111111100000000000000000000000000000111111111111000000000000111100000000000111111000000000000000000000000000000010001111111111100000000000000000000000000000111111111111000000000000111100000000000111111000000000010000000000000000000111111111111111100000000000000000000000000000011111111111000000000000111100000000001111111000001111111111111111111111111111111111111111100000000000000000000000000000011111111111000000000000111100000000001111110000000111111111111111111111111111111111111111100000000000000000000000000000011111111111000000000000111100000000001111111000000111111111111111111111111111111111100000000000000000000000000000000000001111111111000000000011111100000000001111111000000111111111111111111111111111111111000000000000000000000000000000000000001111111111000000000011111100000000001111111000000111111111111111111111111111111111000000000000000011100000000000000000001111111111000000000011111110000000001111111100000111111111111111111111111111111111000000000000000111111100000000000000001111111111000000000011111110000000000111111100000111111111111111111111111111111111000000000000000111111111100000000000001111111111000000000011111110000000000111111100000011111111111111111111111111111110000000000000000111111111100000000000001111111111000000000111111110000000000111111110000001111111111111111111111111111110000000000000001111111111100000000000001111111111000000000111111110000000000011111110000000111111111111111111111111111110000000000000001111111111000000000000001111111111000000001111111110000000000011111110000000011111111111111111111111111100000000000000011111111111000000000000001111111111000000001111111111000000000111111110000000001111111111111111111111111100000000000000011111111111000000000000001111111111000000000111111111000000000111111111000000000111111111111111111111111100000000000000011111111110000000000000001111111111000000000111111111000000000011111111000000000111111111111111111111111000000000000000111111111110000000000000001111111111000000000111111111000000000011111111000000000011111111111111111111111000000000000000111111111110000000000000001111111111000000000111111111000000000011111111100000000011111111111111111111111000000000000000111111111100000000000000001111111111000000000111111111000000000001111111100000000011111111111111111111110000000000000001111111111100000000000000001111111111000000000111111111000000000001111111100000000011111111111111111111000000000000000001111111111100000000000000001111111111000000000111111111000000000001111111110000000011111111111111111100000000000000000001111111111000000000000000001111111111000000000111111111000000000000011111110000000011111111111111110000000000000000000011111111111000000000000000001111111111000000000111111111000000000000011111110000000011111111111111000000000000000000000011111111110000000000000000001111111111000000000111111111000000000000001111111000000011111111111100000000000000000000000011111111110000000000000000001111111111000000000111111111000000000000000111111000000000000000000000000000000000000000000011111111110000000000000000001111111111000000000111111111000000000000000111111000000000000000000000000000000000000000000001111111111000000000000000001111111111000000000111111111000000000000000111111000000000000000000000000000000000000000000001111111111000000000000000001111111111000000000111111111000000000000000111111000000000000000000000000000000000000000000000111111111000000000000000011111111111000000000111111111000000000000000111111000000000000000000000000000000000000000000000111111111100000000000000111111111111000000000111111111000000000000000111110000000000000000000000000000000000000000000000111111111100000000000001111111111111000000000111111111000000000000000111110000000000000000000000000000000000000000000000011111111100000000000001111111111111000000000111111111000000000000000111110000000000000000000000000000000000000000000000011111111110000001111111111111111111000000000111111111000000000000000111110000000000000000000000000000000000000000000000001111111110000001111111111111111111000000000111111111000000000000000111110000000000000000000000000000000000000000000000001111111111000001111111111111111111000000000111111111100000000000001111110000000000000000000000000000000000000000000000001111111111111111111111111111111111000000000011111110000000000000111111100000000000000000000000000000000000100000000000000111111111111111111111111111111111000000000001111100000000000001111111100000000000000000000000000000000001111000000000000111111111111111111111111111111111000000000001110000000000000001111111100000000000000000000000000000000111111111000000000111111111111111111111111111111111000000000000100000000000000001111111100000000000000000000000000000001111111111110000000111111111111111111111111111111111000000000000000000000010000111111111100000000000000000000000000000011111111111111110000111111111111111111111111111111111000000000000000000000111111111111111111111110000000000000000000000111111111111111111111111111111111111111111111111111111000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" />
</SceneInfo_Server>

测试代码

             ConsoleApplication1.MapBlockConfig block = new ConsoleApplication1.MapBlockConfig();
             System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(block.GetType());
             System.IO.FileStream fs = new System.IO.FileStream("3501.block.xml", System.IO.FileMode.Open);
             block = (ConsoleApplication1.MapBlockConfig)xml.Deserialize(fs);
             fs.Dispose();

             R = new byte[block.Walk.Rzlen, block.Walk.Rxlen];

             ; z < block.Walk.Rzlen; z++)
             {
                 ; x < block.Walk.Rxlen; x++)
                 {
                     char item = block.Walk.Blockinfo[block.Walk.Rxlen * z + x];
                     R[z, x] = Convert.ToByte(item + "");
                 }
             }

             List<int[]> ss = new List<int[]>();//{ { 7, 60, 55, 55 } };
             ss.Add(, , ,  });
             ss.Add(, , ,  });
             ss.Add(, , ,  });
             Random ran = new Random();
             Console.ReadLine();
             FindWayManager.Instance.PrintMap(R);
             Console.ReadLine();
             while (true)
             {
                 FindWayManager.Instance.PrintMap(R);
                 Point way = null;
                 System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                 watch.Start();
                 int index = ran.Next(ss.Count);
                 int[] points = ss[index];
                 way = FindWayManager.Instance.FindWay(R, points[], points[], points[], points[]);
                 watch.Stop();
                 Console.Title = "寻路用时:" + (watch.ElapsedMilliseconds);
                 FindWayManager.Instance.PrintWay(R, way);
                 System.Threading.Thread.Sleep();
             }
             Console.ReadLine();

效果图请参考上面的。

特别声明:感谢园友提供的思路和源码。我只是稍作修改。

看几张性能分析图

原本的对园友的代码优化和修改,就是基于这个性能分析结果得来。
 再一次的测试发现如果把关闭列表用 Dictionary<string, Point> Close_List = new Dictionary<string, Point>();性能还能再次提升。

但是如果把openlist也改为 Dictionary<string, Point> 性能却不如从前了。以上四张图都是程序运行一段时间稳定后截图。期待大神,有更优化的算法~!

一步一步开发Game服务器(五)地图寻路的更多相关文章

  1. 一步一步开发Game服务器(四)地图线程

    时隔这么久 才再一次的回归正题继续讲解游戏服务器开发. 开始讲解前有一个问题需要修正.之前讲的线程和定时器线程的时候是分开的. 但是真正地图线程与之前的线程模型是有区别的. 为什么会有区别呢?一个地图 ...

  2. 一步一步开发Game服务器(三)加载脚本和服务器热更新(二)完整版

    上一篇文章我介绍了如果动态加载dll文件来更新程序 一步一步开发Game服务器(三)加载脚本和服务器热更新 可是在使用过程中,也许有很多会发现,动态加载dll其实不方便,应为需要预先编译代码为dll文 ...

  3. 一步一步开发Game服务器(一)

    什么是服务器?对于很多人来说也许只是简单成为在服务器端运行的程序的确如此,服务器通常意义就是说在服务器端运行的程序而已.那么我们怎么理解和分析游戏服务器哪? 传统意义上来说,程序运行后,正常流程, 启 ...

  4. 跟我一步一步开发自己的Openfire插件

    http://www.blogjava.net/hoojo/archive/2013/03/07/396146.html 跟我一步一步开发自己的Openfire插件 这篇是简单插件开发,下篇聊天记录插 ...

  5. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  6. 一步一步实现HTTP服务器-开篇

    缘起 翻开清单,一条条计划一直列在那里,一天又一天,不知道什么时候写下了它,也知不道什么时候完成它,它一直在那静静的等待着. 静下心来,反思自己,才发现自己是多么的无知,多么的没有毅力.设定了无数目标 ...

  7. 一步一步构建手机WebApp开发——页面布局篇

    继上一篇:一步一步构建手机WebApp开发——环境搭建篇过后,我相信很多朋友都想看看实战案例,这一次的教程是页面布局篇,先上图: 如上图所示,此篇教程便是教初学者如何快速布局这样的页面.废话少说,直接 ...

  8. xmppmini 项目详解:一步一步从原理跟我学实用 xmpp 技术开发 2.登录的实现

    第二章登录的实现 金庸<倚天屠龙记> 张三丰缓缓摇头,说道:“少林派累积千年,方得达成这等绝技,决非一蹴而至,就算是绝顶聪明之人,也无法自创.”他顿了一顿,又道:“我当年在少林寺中住过,只 ...

  9. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  10. 一步一步来做WebQQ机器人-(五)(发送消息||完结)

    × 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个 ...

随机推荐

  1. win7安装时,避免产生100m系统保留分区的办法

    在通过光盘或者U盘安装Win7操作系统时,在对新硬盘进行分区时,会自动产生100m的系统保留分区.对于有洁癖的人来说,这个不可见又删不掉的分区是个苦恼.下面介绍通过diskpart消灭保留分区的办法: ...

  2. AngularJs之九(ending......)

    今天继续angularJs,但也是最后一篇关于它的了,基础部分差不多也就这些,后续有机会再写它的提升部分. 今天要写的也是一个基础的选择列表: 一:使用ng-options,数组进行循环. <d ...

  3. solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...

  4. 如何快速优化手游性能问题?从UGUI优化说起

    WeTest 导读   本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法.   在之前的文 ...

  5. [自翻]fasthttp中文文档(持续更新)

    fasthttp是由valyala编写的声称快于Go官方标准库net/http包十倍的快速HTTP实现.从各方的性能测试结果来看(评测一.评测二),fasthttp作为当下最快的http Go语言包当 ...

  6. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  7. javascript arguments(转)

    什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agru ...

  8. mysql 赋予用户权限

    # 赋予权限MySQL> grant 权限参数 on 数据库名称.表名称 to 用户名@用户地址 identified by '用户密码'; # 立即生效权限MySQL> flush pr ...

  9. .NET Portability Analyzer 已开源

    在一年前介绍过<介绍.NET 开发必备工具 .NET Portability Analyzer>,微软已经把代码开源到Github:https://github.com/Microsoft ...

  10. 关于我 — About Me

    个人简介 姓名:周旭龙 关注:.NET开发技术.Web前端技术 邮箱:edisonchou@hotmail.com GitHub: https://github.com/edisonchou 主要经历 ...