H5踩坑


以下C++相关的都废了,老板终于决定废掉原来的服务器用C#重写了

  • Web Socket与C++ 原生Socket通信实现

MDZZ
Web Socket的C++实现采用开源库Web Socket++(还有一个beast.websocket,蛋四这个的参考资料比较少)
这个库基于Boost.asio,需要先配置boost,配置过程中的error:
Error:c4996 unsafe ,
无法解析的外部符号 "class boost::system::error_categorye
-D_SCL_SECURE_NO_WARNINGS: Properties->C/C++->Command Line->add option复制
无法解析的xxx__imp__ntohs@4 referenced in function xxx: #pragma comment(lib,"WS2_32.lib")
to_string is not a member of std:
MinGW官网上那个getMinGW安装的g++(5.3.0)对于c++11中的一部分在源码中没有实现,win上可以使用MinGW-w64的安装包,除了获取新版本的g++外,还可以选择x86_64,即64位g++程序,目前版本为4.5,g++版本更新到 6.2.0

Websocket++提供了多种config,其中config::core仅需要stl,编译环境仅依赖C++11,蛋四没有什么文档,好像是没有实现网络功能,总之不会用,大多采用config::asio,这套方案直接实现了网络功能,蛋四需要boost::asio,也就是需要先编一份boost出来

整个流程有两种思路:
1.h5客户端连接到AgentServer转发服务器,在转发服务器上维护客户端列表,Agent和Tcp服务器之间保持一个socket连接,转发服务器将每条消息标识来源ID转发给TcpSrv,TcpSrv处理之后标识接收者ID发送给Agent,由Agent再发送给对应的客户端
2.client连接到Agent之后Agent发起一个到Tcp的连接,客户端列表要存两份,Agent这里要存一个tcpClient-wsClient的map
打算先用第一种

原生Socket

先插个书签
所谓的事件绑定和回调,本质还是一个(独立线程中)while(true)嵌套for循环,每一次循环依次检查每一个连接上recv是否大于0来判断是否收到来自某个连接的数据

OVER


  • 关于自动重连

  • 自动重连主要是基于客户端发起的(网络不稳定,断网之类的)
  • 因为完成端口对断网的检测(特别是ios端)存在延迟,很多时候需要客户端和服务器之间互发心跳包以确保连接
  • 为了保证用户体验,客户端尽量采用静默自动重连(可以转菊花但尽量少弹框)
  • tcp的connect建立是很快的,如果connect之后立刻开始收发数据,网络极度不稳定的话可能会丢包?,解决方案是让网络线程connect之后休眠一小段时间.
  • 每一次重连(重启网络线程)之间应该有个间隔时间(比如2s),期间客户端转菊花,但上一次连接(失败)2s后才会尝试再次连接,因为在网络不稳定的情况下(比如刚刚打开wifi开关)即使连100次也是很快就全部失败了
  • 注意客户端重连函数可能由不同的定时器触发(连接失败或是心跳包之类的),因此标志是否正在重连是很有必要的,如果执行重连函数的时候正在重连,一定不能再次执行重连,否则会造成无限连接失败进而卡死(ui都会死的那种)

客户端部分使用Cocos Creator

JS脚本之类的
js里函数和变量本质上是一样的,声明都是var something = somethingElse
js中没有类和命名空间的概念,在creator中
var MyClass=cc.Class({ //使用这样的方式来定义一个,在cc.Class“命名空间”下
ctor:function(){} //构造函数,new的时候调用
})
var a=new MyClass(); //调用ctor
cc.Class({
extends:cc.Component, //组件脚本继承自cc.Component
properties:{}, //这里竟然支持get/set方法可怕
onLoad:function{}, //组件的初始化函数,类似于Unity脚本周期中的Awake?和Unity里一样,组件的初始化不要用new
start:function(){}, //onLoad之后调用,Unity start()函数
update:function{} //update函数,贴心的是新建脚本这个函数默认是被注释掉的,毕竟事件响应的实现方式比update里一串分支优雅的多
})


layaBox?

  • 删除脚本文件除了src里删掉,bin/js里也要手动删除,还有bin/index.html里的js加载
  • pivot是以像素为单位的,默认0,0即左上角
  • 另一个anchor是0~1的范围,但只适用于UI组件
  • sprite.cacheAsBitmap = true; 将多个对象缓存为静态图像,这样绘制一大堆东西只有一个drawcall?(看文档好像并不是
  • loader.load([asset path],Handler.create(this,func,[args]) 给资源加载添加完成回调,如果加载失败会在控制台输出
  • 注意由IDE搭建的UI类或是UI扩展类的初始化要放在加载完成的回调函数里,否则会产生找不到资源的错误(因为被打到了图集里,res下并没有直接的对应路径)
  • 资源路径的根目录是bin,也就是说加载路径是"res/xxx/xxx.xx"
  • asset path可以是数组形式,加载一堆图集
  • stage/gameObject.on/off([eventType],[caller],[function])来启用/关闭事件捕获
  • Laya.Tween.to/from,缓动属性(组),还可以添加补间样式、回调和延迟执行时间,好屌哦
  • Laya.timer.loop/once 定时器,timer.clear 停止执行
  • Laya.Stat是那个显示帧率之类的状态框...
  • UI层级面板优化
    Unity有合并batch的概念,相邻的UI组件纹理如果使用同一图集可以一起渲染,Layer也有这种用法,而且更直观诶,用颜色标记不同图集,调整标记颜色相同的组件到一起,如图


    H5踩坑_第1张图片
    合并前

    H5踩坑_第2张图片
    合并后
  • F12发布UI项目,图片放在asset目录的子目录下

TypeScript

import [name =] namespace;js里是var name = namespace;
变量声明及初始化 var name:Type = new Type(args);
类函数声明 funName(args):return type{},不需要加关键字function

你可能感兴趣的:(H5踩坑)