微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)

摘录网上的“.NET 15周年”信息如下:

微软的 .NET 框架本周迎来了 15 岁生日。.NET 的第一个版本在 2002 年 2 月 13 日作为的 Visual Studio.NET 的一部分首次公开亮相。过去 15 年,.NET 框架从一个流行的闭源软件开发平台,变成了一个开源的跨平台开发工具,微软是在 2014 年 11 月 12 日宣布开源 .NET,支持竞争对手 Linux 和 OS X 的平台。微软称,Visual Studio 2017 将于 2017 年 3 月 7 日发布,而 Visual Studio 也迎来了 20 岁生日,开源的 .NET Core 也将发布 2.0版本。

 

      我梳理了一下目前的.NET技术栈: 业务是基于Unity3D(跨平台游戏开发引擎),开发AR、VR 应用; 绝大部分项目采用单机版,使用的编程语言是C#(Mono.NET),不过最近交流的AR几个业务,明显用户已经不太满足单机版,有更多的需求需要用到联网的服务器功能,故技术选型就势在必行了:也算是未雨绸缪吧。

 

技术栈选型

我的技术选型有2点原则

  1. 成熟,有助于提高开发效率

  2. 人多,有坑大家一起填

这2点原则是基于第一次创业失败的经验总结。约在3年前吧,刚开始创业的时候,特别排斥C#.NET技术(互联网创业,还用C#,说出去都不好意思啊),虽然用的是Unity3D游戏引擎(C#),但是服务器选择却是非.NET倾向的。 那个时候对比了多种技术栈:

  • PHP游戏服务器

  • Node.js游戏服务器

  • C++游戏服务器

  • JAVA游戏服务器

权衡再三选择是Java,采用的是SmartFoxServer商用服务器框架,JAVA和C#非常类似、学习成本低一些。

种种原因,后来呢,第一次创业失败了,我的反思是“创业成功大部分原因是CEO的引导有方,创业失败大部分原因是CTO的选择失误导致”。

当时我没有考虑到成本意识、对一个5人研发团队,C#、Java并行的沟通风险有多大:

如果当时客户端是C#技术栈、服务器端也是C#技术栈,则可以从5人技术团队裁掉1人,节约20%人力成本,而且减少沟通后可以提高30%的开发效率,进而有效的推动产品快速扑向市场的速度,可惜这个是“事后诸葛亮”。

这个“事后诸葛亮”,我一直如噎在喉.

       不过去年在一次微软技术峰会,看到网易案例的演讲,我的眼睛亮了起来:“微软技术大神徐玉涛Tory做的分享—网易《绝代双骄》将游戏后端从Java转为新一代.NET Core,研发效率提升20%,服务器成本节省50%”–在线视频为证。

 

故对选择一款C#的服务器,以打通AR、VR客户端、服务器端,提高开发效率,生产力加速,我个人非常期待

Photon

商用

成熟

C# (Mono.NET)

ASP.NET Core

开源

 2.0还未发布

.NET Core

Unity NetworkUnity自带局域网

C# (Mono.NET)




有SmartFoxServer的实践经验,故雷同的商用服务器Photon我本次做了专门的实践.

Photon支持3种类型服务器

  • LoadBalancing: 负载均衡服务器

  • MMO: 大型MMO网游服务器

  • Lite: 大厅、房间类型服务器 (相对简单一些)

Photon授权策略:免费版100个CCU (对于绝大部分AR、VR项目足以了);  商用版3500美金不限制CCU (约2.5万人民币)。

 

云服务器选型

我的选型原则也就2点:

  1. 速度:国内访问速度快、快、快!

  2. 便宜:方便我们这种初创型公司节约不必要的成本

虽然同样是世纪互联在运营,但是早期的AZure在我心目中,网速那是非常非常的慢、价格也是高高在上(和国内的阿里、百度等云比起来,毫无优势可言),故原来使用过阿里云、七牛云,国际版高大上的AZure和AWS都未曾考虑过。

但是呢,微软MVP内部微信群、邮件组,AZure的讨论还是很多的,尤其是“自2017年2月1日起,Azure虚拟机价格大幅下调,最高降价幅度高达60%!”这则消息讨论了好几天,我也渐渐回头持续关注AZure。

通过信息搜集,我了解的AZure信息碎片如下:

Windows Azure在北京、上海部署有服务器

中国的AZure是个”国内版本”–和国际版AZure采用物理隔离方案

MySQL也是比较符合目前国内接地气的方案;

AZure新的特效,国际版和国内版部署时间约差不多是3个月至半年。

https://www.azure.cn/  是国内版本的网站

 

在Azure上搭建Photon服务器(C#.NET)

 

未来AR产品软件框架是这样的,服务器端需要搭建游戏逻辑Photon、以及资源更新AssetBundle–更新资源。MySQL目前是国内很多公司的标配–社区版免费。

 

Photon运行方式很简单,选择服务器实例,启动应用即可,符合GUI操作习惯。

 

AZure虚拟机,提供了C盘,直接把需要的软件和数据,通过远程桌面拷贝过去即可,windows Server 2012英文系统,还是挺方便的。

 

几个有用的小技巧:

  • TT模板:database first–自动生成模型代码

原创文章来源: 使用T4模板生成MySql数据库实体类

注意在VS2015下,需要把.ttinclude后缀修改为.tt才可以。 同时,需要修改 数据库连接为你自己的 9 var connectionString = @"server=127.0.0.1;uid=root;pwd=12345678;charset=utf8;";

AZure开5505 UDP端口

  • 前端、后端C#链接类快捷方式:节约成本的王道

即,直接可以实现前段和后端复用模型实体代码、传递的Code枚举代码,以减少文档重复工作量。

以关键的OperationCode为例,如果前端是C#、后端是Java,则无法做到代码级别复用,即需要写文档来约束。而相同的C#代码后,注释好.cs文件,前端和后端是同样的代码,则沟通起来畅快了很多。

public enum MyOperationCodes : byte 
    { 
        /// <summary> 
        /// LoginOperation 
        /// </summary> 
        LoginOperation = 100,

        /// <summary> 
        /// EchoOperation 
        /// </summary> 
        EchoOperation = 101,

        /// <summary> 
        /// GameOperation 
        /// </summary> 
        GameOperation = 102,

        /// <summary> 
        /// ChatOperation 
        /// </summary> 
        ChatOperation = 103,

        /// <summary> 
        /// ChatOperation 
        /// </summary> 
        CCUOperation = 104, 
    }

  • MySQL ORM (Dapper框架):

    我选择了轻量级、火热的Dapper(stackoverflow网站就用它来做ORM),而且开源。 

  • 参考:

  • dapper操作连接mysql开发最完整实例总结
  • 使用SQL部分代码如下:

Db aa = DbInit();

  
var a3 = aa.Query<device>("select * from device where uuid=@uuid", new { uuid = "aabb636238694579824398" });

 

device dv = new device 

     UUID = "aabb" + DateTime.Now.Ticks.ToString(), 
     DeviceModel = "IOS", 
     DeviceName = "Iphone 5s", 
     RegisterDate = DateTime.Now.AddDays(-1), 
     UpdateDate = DateTime.Now, 
     TokenID = DateTime.Now.Ticks.ToString() 
}; 
long ret = aa.Devices.InsertOrUpdate(dv);

var a1 = aa.Devices.All();

    • Json序列化工具:newtonsoft

    本来Unity5.3已结自带了Json序列化API,但是有bug,Json序列化可能为空,就选择了”老朋友”newtonSoft.dll了。

    • AZure开通端口
    • 应用跑起来后,端口一直不通,需要AZure开通端口–首先在Windows Server里面开通端口(TCP\UDP),然后再AZure里面开通:网络接口–网络安全组–入站安全规则、出站安全规则。

     

    • APK Demo下载:
    •  

    • https://www.pgyer.com/
    •  搭建Photon服务器(C#.NET)

     

    PhotonLab 源码:https://git.oschina.net/xifarm/PhotonLab

     

    参考

    1. 时间飞快–连微软官方都开源了208个源码库

    2. 《岁月在挑灯夜战中走过:亲历的软件框架 》

    3. 《我的微软.net演进路线图》

    4. 《荣获2015微软.NET MVP称号!》

    5. 《写在.NET 15周年之际——致那些仍然爱着.NET的中国程序员们 来自微软MVP Tony Qu微信

    6. 《.NET 十五岁,谈谈我眼中的.NET 来自微软MVP  张善友的博客》

    原文地址:http://www.xifarm.com/photononazure/


    .NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326619.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    分治算法---汉诺塔

    思路分析 代码实现 package com.atguigu.dac;public class Hanoitower {public static void main(String[] args) {hanoiTower(5,A,B,C);}//汉诺塔移动的方法//使用分治算法public static void hanoiTower(int num,char a,char b,char c){//如果只有一个盘if(num1){System.out…

    .NET Core跨平台:使用.NET Core开发一个初心源商城总括

    1..NET Core基本介绍 a 作为一个.NET的开发者&#xff0c;在以前的开发中&#xff0c;我们开发的项目基本都是部署在windows服务器上,但是在windows服务器上的话某些比较流行的解决访问量的方案基本都是先出现在linux上&#xff0c;而后才能迁移出现windows上&#xff0c;而且效…

    二分查找非递归方式实现

    思路分析 代码实现 package com.atguigu.binarysearchnorecursion;/*** 创建人 wdl* 创建时间 2021/4/2* 描述*/ public class BinarySearchNoRecur {public static void main(String[] args) {//测试int[] arr{1,3,8,10,11,67,89};int i binarySearch(arr,67);System.out.pr…

    jQuery实现判断li的个数从而实现其他功能

    需求&#xff1a;当ul中的li大于6个的时候显示图片&#xff0c;当li小于6个的时候隐藏图片&#xff0c;先来看看效果&#xff1a; 当有7个li的时候&#xff1a; 当有3个li的时候&#xff1a; 现在吧源码放上来&#xff1a; <!DOCTYPE html> <html><head…

    windows mysql memcached_Memcached在Windows下的安装

    前言 &#xff1a; 简介下 Memcached 和 Memcache 的区别和联系Memcached和Memcache的区别&#xff0c;其实很简单&#xff0c;一个是服务端&#xff0c;一个是客户端&#xff0c;就像mysql一样&#xff0c;我们在命令行里输入各种sql语句就能查询到需要的结果&#xff0c;这就…

    辅助Visual Studio 2017部署的DevOps新工具

    我们能看到Visual Studio 2017中的一个重大改进是对安装程序做了完全重写。前期的Visual Studio构建版本都是大一统的&#xff0c;完成安装需要相当长的时间和大量的磁盘空间。因此有需求要对安装过程做一些改进&#xff0c;这在本质上需要改进Visual Studio及其组件的检测方式…

    2016蓝桥杯省赛---java---B---6(方格填数)

    题目描述 方格填数 思路分析 全排列检查 代码实现 package com.atguigu.TEST;import static java.lang.Math.abs;class Main{static int a[]{0,1,2,3,4,5,6,7,8,9};static int ans;public static boolean check(){if (abs(a[0] - a[1]) 1 || abs(a[0] - a[3]) 1 || abs…

    java中的tostring_java 中重写toString()方法

    toString()方法 一般出现在System.out.println(类名.toString());toString()是一种自我描述方法 本身返回的是 getClass().getName() "" Integer.toHexString(hashCode());也就是 类名 hashCode的值重写toString() 只会对类生效&#xff0c;并不能字符串生效; 例如…

    走过20年……你出现在哪里?

    Visual Studio Live 倒计时ing 20岁的 Visual Studio 陪伴了一代代程序猿的成长&#xff0c;从青葱岁月一直走过而立之年&#xff0c;从一个小后生变成了 wuli欧巴……由单身狗也成了孩子他爸…… 如今二十载已过&#xff0c;你还记得当年大明湖畔的 Visual Studio 么&#xff…

    2016蓝桥杯省赛---java---B---7(剪邮票)

    题目描述 剪邮票 思路分析 全排列深度优先搜索连通检查 代码实现 package com.atguigu.TEST;class Main{static int a[] { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };static int ans;static boolean vis[]new boolean[12];static void dfs(int g[][], int i, int j) {g[i][…

    css解决li边框重合问题

    我直接写了个案例&#xff0c;先看下效果图&#xff1a; 下面是html代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>机构动态</title><style type"text/css">*{margin:0px;p…

    学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?

    ASP.NET Core 的请求处理管道由一个Server和一组有序排列的中间件构成&#xff0c;前者仅仅完成基本的请求监听、接收和响应的工作&#xff0c;请求接收之后和响应之前的所有工作都交给注册的中间件来完成。ASP.NET Core的中间件通过一个类型Func<RequestDelegate, RequestD…

    2016蓝桥杯省赛---java---B---8(四平方和)

    题目描述 四平方和 代码实现 package com.atguigu.TEST;import java.util.Scanner;class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);int N0;if (sc.hasNext()){Nsc.nextInt();}for (int a 0; a < 2400; a) {for (int b a; b…

    在物理内存中观察CLR托管内存及GC行为

    虽然看了一些书&#xff0c;还网络上的一些博文&#xff0c;不过对CLR托管内存细节依然比较模糊。而且因为工作原因总会有很多质疑&#xff0c;想要亲眼看到内存里二进制数据的变化。 所以借助winhex直接查看内存以证实书上的描述或更进一步揣摩CLR托管内存的运作方式&#xff…

    2017蓝桥杯省赛---java---B---1(购物单)

    题目描述 &#xff08;购物单&#xff09; 思路分析 cmd 打开电脑上的计算器算(算出来的结果是00结尾&#xff0c;作为检测) 答案 5200

    DataProtection设置问题引起不同ASP.NET Core站点无法共享用户验证Cookie

    这是这两天ASP.NET Core迁移中遇到的一个问题。2个ASP.NET Core站点&#xff08;对应于2个不同的ASP.NET Core Web应用程序&#xff09;&#xff0c;2个站点都可以登录&#xff0c;但在其中任1个站点登录后&#xff0c;在当前站点处于登录状态&#xff0c;访问另外1个站点却处于…

    mybatis+spring报错PropertyAccessException 1

    男生关注会更帅&#xff0c;女生关注会更美&#xff01;mybatisspring报错PropertyAccessException 1: org.springframework.beans.MethodInvocationExceptionorg.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘dataSource’ defined…

    字符串暴力匹配算法+思路分析

    思路分析 代码实现 package com.atguigu.kmp;/*** 创建人 wdl* 创建时间 2021/4/4* 描述*/ public class ViolenceMatch {public static void main(String[] args) {//测试暴力匹配算法String str1 "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";String str2&quo…

    springmvc中报错Request processing failed;

    今天在整个ssm的时候出现了个低级错误&#xff0c;找了好久才找出来&#xff0c;在发现真理的那一刻&#xff0c;我都有死的冲动了。 报错如下&#xff1a; HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Optional int …

    在.NET Core 上运行的 WordPress

    在.NET Core 上运行的 WordPress,无需安装PHP既可跨平台运行WordPress。 在Peachpie中实现PHP所需的功能数月后&#xff0c;现在终于可以运行一个真实的应用程序&#xff1a;WordPress。 本文是基于Peachpie https://github.com/iolevel/peachpie Peachpie是一个基于Microsof…