开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

golang plugin热更新尝试

当我们在使用php开发的时候,基本不需要关心热更新这件事的,因为PHP本身已经帮我处理好了,只需要提交代码,PHP重新解释一遍即可。而go则是静态语言,编译后得到的是直接被机器执行的,所有代码已经翻译成相对应的机器指令并且在运行时已经加载到内存,不能动态更新。那么如果想热更新就成了件麻烦的事,但是作为后端开发人员,很渴望支持这种功能,毕竟在线上能新增功能、修复bug客户端完全无感知是多么完美的事。   本文暂不讨论http这种无状态服务更新,网上能搜索到很多文章关于如何利用fd继承实现优雅重启。这里主要讨论使用golang 1.8新增的plugin来实现业务的更新,并且业务是类似游戏的有状态服务。官方文档中对plugin的描述比较简单,他可以动态的加载so和执行导出的方法,并且仅仅提供了两个方法:打开模块和提取符号,甚至连关闭都没有(-_-)。 一个程序包含两部分:数据和算法,那么既然是有状态服务,数据部分肯定不能动,那么热更就只能动算法部分了。这时我们需要一个容器,将这两部分隔离开,一方面是存储数据,另一方面要动态加载so。隔离了数据和算法,只要数据存在,我们就可以随意更新算法了。在开始编码之前,要先解决几个问题: 1、同一个so文件只会...
呵大官人 发布于 5天前 阅读 347

Unity3D加密 外壳加密保护代码及资源

很多VR企业开发的软件有很多文件资源需要保护,而目前行业鲜有好的加密方案可供开发者使用。基于深思云授权平台,有一套代码及资源加密保护方案,可通过Virbox Protector加壳工具对代码及资源进行加壳,再配合精锐5加密锁或者云锁及软锁,可达到极高的安全性,可防止代码被反编译及资源被拷贝。 Unity3D主要使用C#语法和开源mono运行开发商的代码逻辑,所有代码都不是编译到EXE,而是位于{APP}\build\game_Data\Managed\Assembly-CSharp.dll(注意Unity-2017位置略有不同)。而且mono执行原理跟微软.NET Framework兼容但是执行原理完全不一样。传统的.NET Framework加壳全部失效,因为Assembly-CSharp.dll不是PE格式的动态库也不是.NET的动态库,无法从.NET Framework加载,而是由mono.dll读取 Assembly-CSharp.dll的里面C#脚本解释执行。 基于此背景,深思研发的加壳工具Virbox Protector可对Unity3D开发的软件进行一键加壳,保护软件的安全。 Virbox Protector (Unity3D 加密外壳) 国内首家Unity3D的保护外壳,解决代码反编译和内存反dump代码,从而解决软件盗版与算法抄袭。 Virbox Protector核心优点: 1.一键加密你的代码逻辑,无法反编译,无法dump内存。 2.不降低游...
不会写书 发布于 1周前 阅读 285 评论 2

结合unity项目开发浅谈设计模式的六大原则(一)

  面向对象,六大原则,设计模式,数据结构与算法,这些知识点都是脱离编程语言存在的。也就意味着它们“比较抽象”,抽象的东西也就意味着从学习、理解到运用所需要花费的时间会比较长。     今天我们就主要谈谈设计模式的六大原则:     首先,六大原则是谁?     它们分别是单一职责、开闭原则原则、依赖倒置原则、里氏替换原则、接口隔离原则、迪米特原则。     其次,为什么需要学习这六大原则?     六大原则是我们提高面向对象编程代码质量的必备原则,另外还是我们理解设计模式的必备前提。    弄清楚了学习对象和学习目的,下面就可以进入正题了,这六大设计原则本质上是什么,又分别是用来做什么的,实际中的运用又有哪些? 一、单一职责 定义:就一个类而言,应该仅有一个引起它变化的原因。简单点理解就是,就是一个类只负责一项职责(功能)。 从生活中的具体示例理解单一职责, 饿了么:单一职责是点餐 2306:单一职责是定火车票 生活中的事物的单一性是为了集中(精力/财力/物力),然后把这一点做到最好,只有这样才能更有竞争力。 而编程中的单一性也是为了集中,一个类它的功能,作用,用途集中到一点。这样可以避免代码冗余,方便管理,方便...
coding_ 发布于 2周前 阅读 103

收集微信跳一跳的辅助

微信发布小游戏后,跳一跳作为第一款开屏小游戏,火爆朋友圈,然而火爆的夜幕下,在发布当天就出现了辅助软件,这里收集了数个GitHub上的开源项目,简单总结下,以作分享。
dingdayu 发布于 4个月前 阅读 2973 评论 4

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

2017——关于坚持了一年的事情

2017,你对自己成长负责了么
wier 发布于 4个月前 阅读 2158 评论 14 点赞 11

如何预估索引性能?

掌握快速预估索引耗时的能力
wier 发布于 4个月前 阅读 2164 评论 10 点赞 9

什么是DB的三星索引

如果你从网上或者教程中,查询索引设计相关规范,常常会看到一些不知所云的规则和注意事项,这些规则看似很有道理,但应用时,仍然一头雾水,那么究竟如何来做?
wier 发布于 4个月前 阅读 597 评论 2 点赞 1

Sql优化器究竟帮你做了哪些工作?

关系型数据库的一大优势之一,用户无需关心数据的访问方式,那么优化器是如何做到的,我们要如何优化?
wier 发布于 4个月前 阅读 3197 评论 22 点赞 8

DB——数据的读取和存储方式

数据库是我们常用的一些存储数据的方式,我们从读写来了解RDBMS的存取结构
wier 发布于 5个月前 阅读 2367 评论 5 点赞 6

Unity太空大战游戏-Socket网络通信教学示例

U3D游戏与WeaveSocket网络通信教学示例
dreamsfly 发布于 5个月前 阅读 1040 点赞 2

一致性hash在DynamoDB上的应用

Dynamo是Amazon提供的一个分布式存储NoSQL 数据库,它采用去中心化、松散耦合的方式,组成一个支持高度扩展的Key/Value 数据库,本篇我们着重分析一下,它是如何采用采用一致性hash而达到可高度扩展的。
wier 发布于 5个月前 阅读 1181 评论 1 点赞 1

娱乐开发两不误,10 大开源游戏框架推荐

游戏技术的不断发展和游戏模式的不断创新,给技术专家带来了许多新的挑战。
编辑部的故事 发布于 6个月前 阅读 6845 评论 19 点赞 6

如何合理的规划一次jvm性能调优

JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响,那么如何进行一次优雅的调优,提升应用的性能?
wier 发布于 6个月前 阅读 2925 评论 9 点赞 11

jvm优化必知系列——监控工具

项目部署线上之后,我们该如何基于监控工具来快速定位问题....
wier 发布于 6个月前 阅读 4492 评论 14 点赞 18

【码云周刊第 42 期】Unity 开发看这些就够了!

每周为您推送最有价值的开源技术内参!
码云Gitee 发布于 6个月前 阅读 2648 评论 5 点赞 5

jvm优化—— 图解垃圾回收

jvm必知系列,总结一些常见jvm回收机制,方便查阅
wier 发布于 6个月前 阅读 5724 评论 21 点赞 20

Cocos2dx 搓牌效果

先上效果图: ![输入图片说明](https://static.oschina.net/uploads/img/201709/27165000_30Za.png "在这里输入图片标题") ![输入图片说明](https://static.oschina.net/uploads/img/201709/27165022_OXxv.png "在这里输入图片标题") ![输入图片说明](https://static.oschina.net/uploads/img/201709/27165036_kC4x.png "在这里输入图片标题") cocos2dx 3D搓牌效果类如下: ``` -- date:2017/9/26 -- author:looyer -- purpose:3D搓牌效果层, -- 顶点着色器 local strVertSource = [[ attribute vec4 a_position; attribute vec2 a_texCoord; attribute vec4 a_color; uniform float ratio; //牌初始状态到搓牌最终位置的完成度比例 uniform float radius; //搓牌类似于绕圆柱滚起,其圆柱的半径 uniform float width; uniform float finish; //是否完成搓牌 uniform float offx; uniform float offy; varying vec4 v_fragmentColor; varying vec2 v_texCoord; void main() { //注意OpenGL-ES中:1.attribute修饰的变量是常量。2.没有自动转类型float a = 1;或者5.0/3都是错误的 //这两个问题改了两天,可以通过修改CPP代码,打印log来调试cocos2dx程序 vec4 tmp_pos = a_p...
looyer 发布于 7个月前 阅读 4579 评论 6 点赞 7 打赏 1

java多线程——并发测试

并发程序存在不确定性,出现的方式也没有固定规则。这对程序的应用会造成一些困难,如何在测试中,尽可能的暴露出这些问题,并且了解其性能瓶颈,这也是对开发者带来新的挑战。
wier 发布于 7个月前 阅读 1304 点赞 4

java多线程——CAS

CAS是什么,有那些特性,如何使用...
wier 发布于 7个月前 阅读 725 评论 5 点赞 5

java多线程——锁

这是多线程系列第四篇,偏重于线程的实践,对锁的几种应用做个简要介绍
wier 发布于 7个月前 阅读 3710 评论 15 点赞 4

关于在VS环境开发ActiveX控件不能在部分win10或者win8电脑上注册的解决方案

问题描述: VS2008上利用ATL(动态模板库)编写的项目ActiveX控件在部分电脑上可成功注册并运行,但部分电脑上无法注册特别是Win10环境上。 目标: 在Win7、Win8、Win10等环境下成功注册ActiveX控件。 解决方案: 通过对问题的分析,可以发现部分电脑是可以注册的,为什么部分不可以?通过了解后发现能注册的电脑是安装过VS或者安装某些软件时候自动安装了VS运行环境,那么问题可能就是这个。然后针对这个问题进行了三种方案的研究,两种方案验证可行,那么总结出问题就是运行环境问题导致不能注册,下边分别说明和比较: 方案一(存在问题) 既然项目依赖运行库,那么其它插件为什么不需要运行库,因此首先针对项目进行了研究。发现项目编译生成dll文件时,采用的是动态链接运行库文件,因此修改编译属性为静态链接后重新编译运行项目,注册成功。 属性修改方法:项目属性-》配置属性修改“C/C++/Code Generation” -》运行时库,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。   /MD和/MDd:动态链接库文件,/MD为release版本,/MDd为debug版本。 /MT和/MTd:静态链接库文件,/MT为release版本,/MTd为debug版本。  ...
我的代码不生虫 发布于 2个月前 阅读 91

Nginx WebSocket 配置

server {     listen       80;     server_name  bi.com;     access_log  /var/log/nginx/bi.access.log  main;     error_log  /var/log/nginx/bi.error.log  ;     # web socket  location must be  / ,otherwise failed.     location / {         access_log /var/log/nginx/ws.access.log main;         error_log /var/log/nginx/ws.err.log;         proxy_pass http://ws;         proxy_http_version 1.1;         proxy_set_header    Upgrade $http_upgrade;         proxy_set_header    Connection "upgrade";     }     location /bi/ {         // app context path         proxy_pass http://bi/;     } } upstream bi {     ip_hash;     server 172.16.8.2:1904;     server 172.16.8.3:1904; } upstream ws {     ip_hash;     server 172.16.8.16:1903;     server 172.16.8.17:1093; } Note: 如果使用了htts 或者是SSL, 请使用wss协议代替ws协议. 如下是一个完整的配置: proxy_pass http://backend/; proxy...
idoz 发布于 2个月前 阅读 247

Maya Python开发

# Maya基本操作 建立Object,Maya漫游 Alt+ Maya最下面有Mel最右边,有小按钮 Maya 脚本编辑器,Maya右键操作滑动 切换到点模式:右键切换定点模式 按F切换物体的中心 对象模式? # Maya脚本编写 ## 功能 Maya程序运行是串行结构,和Unity一致;UI按钮执行脚本;操作都会现实在脚本编辑器中 脚本编辑器显示的日志是mel语句。 查maya 的帮助,命令当中勾选快捷提示,都勾上mel看起来像linux命令 select -r select -add 的mel脚本执行 在写脚本的时候,如果遇到命令,先在界面上完成,然后根据mel脚本的提示,根据mel脚本编写python。 脚本编辑器 直接点击运行会清空下面的代码,点击》》来执行并不清空内容 操作tranform修改属性,maya当中用的最多的是setAttr 创建摄影机,修改摄影机焦距, Object的名称的唯一性, 中间拖拽到形成父子关系, 通过路径的方式找到唯一对象 问题:同级不能出现同名,maya内部会自动改名字 ## mel转python 有规律可循,Maya像linux的命令或函数, ``` import maya #import maya.cmds as cmds values = maya.cmds.ls() maya.cmds.setAttr(...) # mel转python可能的两种形式 # select -tgl xxx maya.cmds.select('xxx', tgl=True) #maya.cmds.s...
抢小孩糖吃 发布于 2个月前 阅读 89 点赞 1

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

tensorflow lstm for mnist

# -*- coding:utf-8 -*- import tensorflow as tf import numpy as np from tensorflow.contrib import rnn from tensorflow.examples.tutorials.mnist import input_data # 设置 GPU 按需增长 config = tf.ConfigProto() config.gpu_options.allow_growth = True sess = tf.Session(config=config) """ 首先导入数据,看一下数据的形式""" mnist = input_data.read_data_sets('../../MNIST_data', one_hot=True) print(mnist.train.images.shape) """设置各种超参数""" lr = 1e-3 input_size = 28 # 每个时刻的输入特征是28维的,就是每个时刻输入一行,一行有 28 个像素 timestep_size = 28 # 时序持续长度为28,即每做一次预测,需要先输入28行 hidden_size = 256 # 隐含层的数量 layer_num = 2 # LSTM layer 的层数 class_num = 10 # 最后输出分类类别数量,如果是回归预测的话应该是 1 _X = tf.placeholder(tf.float32, [None, 784]) # 输入占位符 y = tf.placeholder(tf.float32, [None, class_num]) # 输出占位符 # 在训练和测试的时候,我们想用不同的 batch_size.所以采用占位符的方式 batch_size = tf.placeholder(tf.int32, []) # 注意类型必须为 tf...
marjey 发布于 1个月前 阅读 24

Unity ECS 框架

20180312 #### ECS编程思想 这种编程思想很早前就已经提出,ECS分别是Entity,Component,System的缩写. - Entity是实例,作为承载组件的载体,也是框架中维护对象的实体. - Component只包含数据,具备这个组件便具有这个功能. - System作为逻辑维护,维护对应的组件执行相关操作. ECS和传统的OOP相比更看重的是组件,附加组件即具备功能. C#是面向对象语言,从语言层面上就支持面向对象的编程思想:集成封装和多态. - 面向对象:我是什么,我有属性,我有方法,我要继承然后重写成自己独有的. - 面向组件:我有什么,我有组件便具备这个功能,我由很多组件组成了实体. 按照ECS的思路,功能拆分成组件,然后把这些细小的组件组合便组成了具备所需功能的对象.实际上Unity也是这种实现思路,但是它的组件式属性和逻辑的合集. 最近看了ECS编程思想,看了Entitas逻辑,写了小Demo,感觉: 编程思路/框架没有最好只有更合适,可能A框架适合RPG游戏,B框架更适合FPS游戏. - Entity的时序 开发中经常会遇到控制时序的逻辑,比如某个Entity必须在另一个Entity逻辑完成后再执行,当然可以通过添加组件标识来控制时序执行,但是如果存在大量这种逻辑势必会增加很多对应的组件作为标识. - System时序 同样可以添加C...
小海oschina 发布于 1个月前 阅读 55

ulua,tolua升级到替换为xlua

最近unity 项目需要热修复 csharp代码错误 xlua是一种不错的选择方案 热替换某个特定的csharp函数 涉及到问题: unity lua插件 涉及三个层次: c/c++层 lua层 c#层 c++层的 ulua.c 替换为 xlua.c 以及 i64lib perflib c#层剔除掉ulua 文件夹, 放入xlua文件夹 lua层 用xlua的 import_type load_assembly 替换 luanet 的接口 c#层业务逻辑代码修改 ,调用lua的地方使用 xlua的 LuaEnv.Globals.GetInPath 之类的接口替换接口
李勇2 发布于 3个月前 阅读 105

Unity3d中的Tcp socket通信(开源)

开源地址:https://github.com/hiramtan/HiSocket_unity # HiSocket_unity ---------------------- ### 如何使用 可以从此链接下载最新的unity package: [![Github Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)](https://github.com/hiramtan/HiSocket_unity/releases) --------- ### 功能 - Tcp socket - Udp socket - 可伸缩字节表 - 高性能字节块缓冲区 - 消息注册和回调 - 二进制字节消息封装 - Protobuf消息封装 - AES消息加密 ### 详情 - Tcp和Udp都是采用主线程异步连接的方式(避免主线程阻塞). - 启动发送线程和接收线程处理数据传输(提高性能). - 供用户调用发送或接受数据的API在主线程中(方便直接操作unity的组件) - 监听连接事件获得当前的连接状态. - 监听接收事件获得接收的数据. - 存在字节数组队列,方便用来测试和数据重发. - 高性能字节缓冲区避免内存空间重复申请,减少GC. - 如果使用Tcp协议需要实现IPackage接口处理粘包拆包. - Ping接口因为mono底层的bug会在.net2.0平台报错(.net 4.6 没有问题,或者也可以使用unity的接口获得Ping,工程中有示例代码) --------- ### 细节 - Tcp [Transmission Control Protocol](https://...
小海oschina 发布于 3周前 阅读 26

【码云周刊第 61 期】四款开源项目教你玩转微信游戏

每周为您推送最有价值的开源技术内参!
码云Gitee 发布于 2个月前 阅读 2041 评论 1 点赞 2

cocos2d-lua .csb文件动画播放

local root = cc.CSLoader:createNode("SecondLayer.csb")     layer:addChild(root)          self.sprite2 = root:getChildByName("Sprite_2")         local timeline = cc.CSLoader:createTimeline("SecondLayer.csb");     layer:runAction(timeline);       timeline:setFrameEventCallFunc(function(dt)         print(dt:getEvent())  -- 帧事件     end)          local startBtn = root:getChildByName("Button_1")     local function startAction(sender,eventType)         if eventType == 2 then             if sender:getTitleText() == "开始" then                 sender:setTitleText("暂停")                 timeline:gotoFrameAndPlay(0,true);             else                  sender:setTitleText("开始")                 timeline:gotoFrameAndPlay(5,false);             end         end                      print(eventType)     end     startBtn:addTouchEventListener(startAction)...
尹enjoy 发布于 2个月前 阅读 44

LZ4 和 LZMA 压缩算法针对不同格式的压缩比数据测试

本次测试使用了四种数据格式: BMP图像(较多数据冗余,447KB) JPG图像(较少数据冗余,经过一层算法压缩,35KB) TXT文档(万历十五年小说,334KB) DLL程序(PE格式,242KB)   压缩算法为LZ4(默认压缩,非HC算法)、LZMA算法(经测试采用综合效果较好的1、6压缩级别) LZMA算法分为普通算法和快速算法,压缩级别为1时使用快速算法,为6时使用普通算法   压缩比数据整理 文档类型 LZ4算法 LZMA快速算法 LZMA普通算法 BMP 30.76% 19.57% 17.65% JPG 92.21% 89.68% 89.41% DLL 63.97% 44.54% 42.35% TXT 84.31% 55.95% 51.13%   耗时数据整理(毫秒) 文档类型 LZ4算法 LZMA快速算法 LZMA普通算法 BMP 9 31 69 JPG 5.6 9.7 9.8 DLL 9.4 32.6 77.1 TXT 11.4 64.6 106.6   这个算法测试主要为 xPack 提供理论数据支撑, xPack 将采用LZ4作为快速压缩算法,用于快速压缩的情况使用,LZMA快速压缩算法作为普通压缩算法,用于性能均衡的情况下使用,而LZMA普通算法则作为高压缩比压缩算法,提供尽可能高的压缩率。...
xLeaves 发布于 1个月前 阅读 31 评论 1

网页拉起游戏APP

android下: 配置android:scheme 来启动 网页代码 <a href ="ldhcr://"></a>也可以     IOS下:todo
梦想游戏人 发布于 1个月前 阅读 11

osg+Bullet 自己写的代码,体现出Bullet的重力与碰撞

用osg的简单渲染,应用Bullet的坐标数据 一头牛,一块地板,牛会落到地板上。 单位是米,但牛有几十米的身高,所以看起来很慢
洛克人杰洛 发布于 1个月前 阅读 28

关于LUA+Unity开发_toLua篇【二】

这篇来说说github上的的toLua框架 LuaFramework。两个版本分别对应UGUI和NGUI。这个框架是基于新一代toLua#的,toLua#的性能是强过uLua和早期的toLua,且自带assetbundle机制,方便用户开发。 框架地址: https://github.com/jarjin/LuaFramework_UGUI 在使用过程中还是得多看看官方给的文档: http://doc.ulua.org/default.asp   总体来说有点绕,刚使用时由于结构不清楚容易迷失。不过设计思想还是很好的。在框架使用上,Main.lua做为对于一个全局入口,而非单个游戏的入口,我的做法的是将Controller,View写好后,具备原生回调的Model层需要在C#实现然后直接进行桥接,当然这样做的Model是无法进行扩展的! 所以可以采用将C#的各实体带MonoBehavior的类以“固定形式”桥接到LUA中实现。 比如如下一种情况,大家有什么好办法呢? 1.LUA实例两个带刚体带碰撞的Cube 2.C#层实现一个碰撞检测,获得回调OnCollisionEnter,将碰撞的对象(GameObject)传给LUA。 3.在LUA中拿到此GameObject后,如何判定是碰了1中的哪个Cube呢?     我的方法: 1. 比较的谨慎的办法, 为Cube创建唯一的名字,取出来后通过名字判定 2. 最直接的方法!! 直接比较GameObject,经不断测试...
AveryHuo 发布于 3个月前 阅读 142

记一次 skynet 中使用 skynet.queue 给消息加锁时的问题

应该大多数 skynet 项目都是以 Lua 作为主开发语言。在使用 Lua 编写 skynet 服务时,基本的执行单元是 coroutine 。当有消息到达使用 Lua 编写的服务时,skynet 都会起一个 coroutine 来处理消息,当某个 coroutine 涉及到异步让出执行时,skynet 便继续执行下一条消息,等到该 coroutine 的唤醒消息到达时便会继续执行。 比如客户端先发送 a 消息,再发送 b 消息,而 a 中有异步操作,b 中无异步操作,则 b 会先比 a 处理完返回到客户端。若 a 中需要扣除金币,在异步前检查了金币满足,在异步返回后还需要再次检查金币数量,因为这个时候金币可能被修改而不满足条件了。在游戏开发中,有时我们想保持处理客户端发送消息的顺序性。比如某玩法,客户端依次发送消息 a 和 b ,而我们确实想 b 一定要在 a 之后返回,这个时候就需要用到 `skynet.queue` 。具体的代码在 skynet 中 lualib/skynet/queue.lua 文件中。`skynet.queue` 函数执行后会返回一个 closure 而这个 closure 的参数是函数以及这个函数的参数。若对这个 closure 传入参数 f1 f2 f3 f4 等函数及参数,那么这 4 个函数将会按照顺序依次执行,假设顺序是 f1 -> f2 -> f3 -> f4 ,若其中有函数比如 f2 中间会让...
ylme 发布于 4周前 阅读 13

在unity游戏开发中,可能会遇到在游戏中截屏的效果。

方法一: 在unity的API中,unity给我们提供了一个现成的API  :  Application.CaptureScreenshot(imagename),但是在我们使用这个API截图后的截图存放在哪儿呢?很多新朋友可能不是很清楚,当然不同的平台它的存放路径是有差别的。如果你想要你的游戏中显示你截图的缩略图,那么这种方法不是一个好方法,因为你要用 WWW去加载你刚才的截图,这会消耗你一部分的时间。 下面是各个平台的截图存放路径: Application.CaptureScreenshot(screencapture.png) if(Application.platform==RuntimePlatform.Android || Application.platform==RuntimePlatform.IPhonePlayer) imagePath=Application.persistentDataPath; else if(Application.platform==RuntimePlatform.WindowsPlayer) imagePath=Application.dataPath; else if(Application.platform==RuntimePlatform.WindowsEditor) { imagePath=Application.dataPath; imagePath= imagePath.Replace("/Assets",null); } imagePath = imagePath + "/screenca...
姿势喵 发布于 3个月前 阅读 13

Egret 2D(10)Tween缓动动画

确保项目支持 Tween 在 Egret 项目中,修改egretProperties.json中的modules,添加 tween 模块: { "name": "tween" } 在项目所在目录内执行一次引擎编译: egret build -e Tween缓动基本用法 Tween中封装了最常用的缓动动画功能,包括动画时间设定,缓动动画控制, 缓动效果控制等等。下面是一个缓动动画示例。 var shp:egret.Shape = new egret.Shape(); shp.graphics.beginFill( 0x00ff00 ); shp.graphics.drawRect( 0, 0, 100, 100 ); shp.graphics.endFill(); this.addChild( shp ); //获得需要缓动的显示对象 var tw=egret.Tween.get(shp); //to方法开始缓动 tw.to({x:150},1000) 缓动对象是用 egret.Tween.get() 获得的,该方法需要传入用于缓动的目标对象,即例中的 shp。,然后通过 to() 方法给出需要设置缓动的具体参数。to() 的第一个参数用于设置缓动属性以及目标值:例中的属性为 x ,目标值为 150,即会将 shp 从当前 x 坐标位置缓动到 x 坐标为 150;to() 的第二个参数为缓动时间长度,单位为毫秒,例中的缓动长度为 1000毫秒,即 1 秒 。 缓动对象的基本控制参数 在定义缓动时,还...
Chason-洪 发布于 3周前 阅读 12

记Bugly崩溃查找过程unity-il2cpp

Bugly上面的崩溃,刚打开根本看不懂什么函数地什么堆栈 1...一开始想到的是把il2cpp的代码生成符号文件,上传到bugly 但是找了一大圈,并没有il2cpp的符号文件,debug版本的话 代码也不一样 毫无参考价值, 2...就算是找到了符号表 也看不懂,il代码变为cpp代码根本看不懂。 3....开始根据堆栈尝试还原,因为是内存错误,首先想到的是无效指针,或者大内存分配失败,通过可以制造崩溃,然后看bugly的堆栈信息是否吻合,如果吻合那么就证明是这里的调用堆栈的问题了。然后查起来就容易多了, 4....崩溃堆栈起始是_pthread_startXXXX,基本可以断定是我们开的线程里面出错,unity主线程的话会是UnityMain。 5.....代码里面只有网络部分是自己开的线程,重点审查代码,var x = new byte[1024*1024*1024] 开始逐个可能造成内存错误的代码块插入上述测试代码,开始测试
梦想游戏人 发布于 2个月前 阅读 70

cocos官网例子

玩一玩撒,就只抄了一半,会移动的小紫
无极之岚 发布于 3周前 阅读 15

Unity3d的Log系统重构

# 编者注 由于要重写Unity3d的Log系统,变更为自定义方式,按照Log4j的显示的内容方法 # Unity3d的Log 一般在Unity3d中编写日志入下代码 ``` Debug.Log("hello message"); ``` 在UnityEditor和UnityEngine当中除了打印message以外,还会打印堆栈信息。性能低下,根据有经验的人讲解,在客户端打印大量日志,会严重降低渲染性能。 # Unity3d的Debug原理 ## 原理分析 在Rider中查看Debug.Log的实现,我们可以看到如下内容 ``` public static void Log(object message) { Debug.unityLogger.Log(LogType.Log, message); } ``` 我们能够了解到,实质是调用了`Debug.unityLogger` ``` public static ILogger unityLogger { get { return Debug.s_Logger; } } ``` unityLogger实质是调用了Debug.s_Logger,而在下面就定义了s_Logger的实现 ``` internal static ILogger s_Logger = (ILogger) new Logger((ILogHandler) new DebugLogHandler()); ``` DebugLogHandler实质是调用的静态方法,根据UnityEngine各个平台的实现进行调用 ``` using System; using System.Runtime.CompilerServices; using UnityEngine.Scripting; namespace UnityEngine { internal sealed class DebugL...
抢小孩糖吃 发布于 2个月前 阅读 87

如何规避适配风险?以《乱世王者》为例,探秘手游兼容性测试之路

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:Lane Li,腾讯适配测试负责人、WeTest专家兼容测试负责人 由 腾讯游戏云 发布在云+社区 项目背景 《乱世王者》是一款历史架空背景的战争策略手游,最大程度的还原策略游戏的精髓的同时加入了RPG元素。作为腾讯首款战争策略手游,无论游戏性以及品质都达到了一个令人满意的程度,在正式上线一周内便成功达到iOS畅销排行前三的佳绩。传统的策略游戏中融入RPG、主播引导、AR互动等模式,将其完美的糅合在一起,同时三国名将悉数登场、名城复古重现以及各个经典战役元素,使得游戏策略性、代入感和可玩性都更加吸引人。《乱世王者》在同类SLG游戏中位于佼佼者,它的成功取决于紧密的游戏逻辑、精细的游戏画面以及优秀的游戏品质。 游戏品质离不开质量控制,《乱世王者》也一样,游戏的每个部分都进行专业测试,在兼容性测试的部分,为了保证兼容性方面的质量,从轻测版本到运营上线做了数十次全量兼容测试,目的就是保证产品在兼容性方面的质量。本文就将阐述腾讯WeTest如何为该游戏进行兼容性测试。 测试过程 特殊机型纳入测试范围:除了正常的按照腾讯大数据平台排名选取的Android TOP100和iOS 全机型泛覆盖之...
腾讯云加社区 发布于 2个月前 阅读 16

Nginx WebSocket 配置

server {     listen       80;     server_name  bi.com;     access_log  /var/log/nginx/bi.access.log  main;     error_log  /var/log/nginx/bi.error.log  ;     # web socket  location must be  / ,otherwise failed.     location / {         access_log /var/log/nginx/ws.access.log main;         error_log /var/log/nginx/ws.err.log;         proxy_pass http://ws;         proxy_http_version 1.1;         proxy_set_header    Upgrade $http_upgrade;         proxy_set_header    Connection "upgrade";     }     location /bi/ {         // app context path         proxy_pass http://bi/;     } } upstream bi {     ip_hash;     server 172.16.8.2:1904;     server 172.16.8.3:1904; } upstream ws {     ip_hash;     server 172.16.8.16:1903;     server 172.16.8.17:1093; } Note: 如果使用了htts 或者是SSL, 请使用wss协议代替ws协议. 如下是一个完整的配置: proxy_pass http://backend/; proxy...
idoz 发布于 2个月前 阅读 247

关于LUA+Unity开发_toLua篇【二】

这篇来说说github上的的toLua框架 LuaFramework。两个版本分别对应UGUI和NGUI。这个框架是基于新一代toLua#的,toLua#的性能是强过uLua和早期的toLua,且自带assetbundle机制,方便用户开发。 框架地址: https://github.com/jarjin/LuaFramework_UGUI 在使用过程中还是得多看看官方给的文档: http://doc.ulua.org/default.asp   总体来说有点绕,刚使用时由于结构不清楚容易迷失。不过设计思想还是很好的。在框架使用上,Main.lua做为对于一个全局入口,而非单个游戏的入口,我的做法的是将Controller,View写好后,具备原生回调的Model层需要在C#实现然后直接进行桥接,当然这样做的Model是无法进行扩展的! 所以可以采用将C#的各实体带MonoBehavior的类以“固定形式”桥接到LUA中实现。 比如如下一种情况,大家有什么好办法呢? 1.LUA实例两个带刚体带碰撞的Cube 2.C#层实现一个碰撞检测,获得回调OnCollisionEnter,将碰撞的对象(GameObject)传给LUA。 3.在LUA中拿到此GameObject后,如何判定是碰了1中的哪个Cube呢?     我的方法: 1. 比较的谨慎的办法, 为Cube创建唯一的名字,取出来后通过名字判定 2. 最直接的方法!! 直接比较GameObject,经不断测试...
AveryHuo 发布于 3个月前 阅读 142

Maya Python开发

# Maya基本操作 建立Object,Maya漫游 Alt+ Maya最下面有Mel最右边,有小按钮 Maya 脚本编辑器,Maya右键操作滑动 切换到点模式:右键切换定点模式 按F切换物体的中心 对象模式? # Maya脚本编写 ## 功能 Maya程序运行是串行结构,和Unity一致;UI按钮执行脚本;操作都会现实在脚本编辑器中 脚本编辑器显示的日志是mel语句。 查maya 的帮助,命令当中勾选快捷提示,都勾上mel看起来像linux命令 select -r select -add 的mel脚本执行 在写脚本的时候,如果遇到命令,先在界面上完成,然后根据mel脚本的提示,根据mel脚本编写python。 脚本编辑器 直接点击运行会清空下面的代码,点击》》来执行并不清空内容 操作tranform修改属性,maya当中用的最多的是setAttr 创建摄影机,修改摄影机焦距, Object的名称的唯一性, 中间拖拽到形成父子关系, 通过路径的方式找到唯一对象 问题:同级不能出现同名,maya内部会自动改名字 ## mel转python 有规律可循,Maya像linux的命令或函数, ``` import maya #import maya.cmds as cmds values = maya.cmds.ls() maya.cmds.setAttr(...) # mel转python可能的两种形式 # select -tgl xxx maya.cmds.select('xxx', tgl=True) #maya.cmds.s...
抢小孩糖吃 发布于 2个月前 阅读 89 点赞 1

ulua,tolua升级到替换为xlua

最近unity 项目需要热修复 csharp代码错误 xlua是一种不错的选择方案 热替换某个特定的csharp函数 涉及到问题: unity lua插件 涉及三个层次: c/c++层 lua层 c#层 c++层的 ulua.c 替换为 xlua.c 以及 i64lib perflib c#层剔除掉ulua 文件夹, 放入xlua文件夹 lua层 用xlua的 import_type load_assembly 替换 luanet 的接口 c#层业务逻辑代码修改 ,调用lua的地方使用 xlua的 LuaEnv.Globals.GetInPath 之类的接口替换接口
李勇2 发布于 3个月前 阅读 105

7.0神器挑战外观

法师   奥法:     冰法:     火法:   牧师   神牧:     戒律:     暗牧:   术士   痛苦:     毁灭:     恶魔:   恶魔猎手   复仇:   浩劫: 德鲁伊   平衡:   守护:   野性:   治疗: 武僧   酒仙:   美猴王的传奇:通过研究职业大厅二层特质进入酒坊拿酒喝,有几率开出该外观解锁道具,见帖子:[酒仙隐藏神器外观解锁] 点击图片查看大图   织雾:   宁静精华:官方论坛收集到的消息为团队本翡翠梦魇boss梦魇之龙掉落解锁道具。   踏风:   雪怒的意志:Reddit上有玩家通过任务枯法者训练奖励获得(同血DK隐藏外观获得方式) 7.2隐藏外观:   酿酒:   踏风:   织雾: 盗贼   刺杀:   狂徒:   敏锐:   萨满   恢复:   元素:   增强: 猎人   射击:   生存:   兽王:   战士   防战:   狂暴:   武器: 死亡骑士   冰霜:   鲜血:   邪恶: 圣骑士   神圣:   惩戒:   防骑:  
wangchen1999 发布于 5天前 阅读 15

关于在VS环境开发ActiveX控件不能在部分win10或者win8电脑上注册的解决方案

问题描述: VS2008上利用ATL(动态模板库)编写的项目ActiveX控件在部分电脑上可成功注册并运行,但部分电脑上无法注册特别是Win10环境上。 目标: 在Win7、Win8、Win10等环境下成功注册ActiveX控件。 解决方案: 通过对问题的分析,可以发现部分电脑是可以注册的,为什么部分不可以?通过了解后发现能注册的电脑是安装过VS或者安装某些软件时候自动安装了VS运行环境,那么问题可能就是这个。然后针对这个问题进行了三种方案的研究,两种方案验证可行,那么总结出问题就是运行环境问题导致不能注册,下边分别说明和比较: 方案一(存在问题) 既然项目依赖运行库,那么其它插件为什么不需要运行库,因此首先针对项目进行了研究。发现项目编译生成dll文件时,采用的是动态链接运行库文件,因此修改编译属性为静态链接后重新编译运行项目,注册成功。 属性修改方法:项目属性-》配置属性修改“C/C++/Code Generation” -》运行时库,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。   /MD和/MDd:动态链接库文件,/MD为release版本,/MDd为debug版本。 /MT和/MTd:静态链接库文件,/MT为release版本,/MTd为debug版本。  ...
我的代码不生虫 发布于 2个月前 阅读 91

Unity3d的Log系统重构

# 编者注 由于要重写Unity3d的Log系统,变更为自定义方式,按照Log4j的显示的内容方法 # Unity3d的Log 一般在Unity3d中编写日志入下代码 ``` Debug.Log("hello message"); ``` 在UnityEditor和UnityEngine当中除了打印message以外,还会打印堆栈信息。性能低下,根据有经验的人讲解,在客户端打印大量日志,会严重降低渲染性能。 # Unity3d的Debug原理 ## 原理分析 在Rider中查看Debug.Log的实现,我们可以看到如下内容 ``` public static void Log(object message) { Debug.unityLogger.Log(LogType.Log, message); } ``` 我们能够了解到,实质是调用了`Debug.unityLogger` ``` public static ILogger unityLogger { get { return Debug.s_Logger; } } ``` unityLogger实质是调用了Debug.s_Logger,而在下面就定义了s_Logger的实现 ``` internal static ILogger s_Logger = (ILogger) new Logger((ILogHandler) new DebugLogHandler()); ``` DebugLogHandler实质是调用的静态方法,根据UnityEngine各个平台的实现进行调用 ``` using System; using System.Runtime.CompilerServices; using UnityEngine.Scripting; namespace UnityEngine { internal sealed class DebugL...
抢小孩糖吃 发布于 2个月前 阅读 87

cocos2d-lua .csb文件动画播放

local root = cc.CSLoader:createNode("SecondLayer.csb")     layer:addChild(root)          self.sprite2 = root:getChildByName("Sprite_2")         local timeline = cc.CSLoader:createTimeline("SecondLayer.csb");     layer:runAction(timeline);       timeline:setFrameEventCallFunc(function(dt)         print(dt:getEvent())  -- 帧事件     end)          local startBtn = root:getChildByName("Button_1")     local function startAction(sender,eventType)         if eventType == 2 then             if sender:getTitleText() == "开始" then                 sender:setTitleText("暂停")                 timeline:gotoFrameAndPlay(0,true);             else                  sender:setTitleText("开始")                 timeline:gotoFrameAndPlay(5,false);             end         end                      print(eventType)     end     startBtn:addTouchEventListener(startAction)...
尹enjoy 发布于 2个月前 阅读 44

Unity ECS 框架

20180312 #### ECS编程思想 这种编程思想很早前就已经提出,ECS分别是Entity,Component,System的缩写. - Entity是实例,作为承载组件的载体,也是框架中维护对象的实体. - Component只包含数据,具备这个组件便具有这个功能. - System作为逻辑维护,维护对应的组件执行相关操作. ECS和传统的OOP相比更看重的是组件,附加组件即具备功能. C#是面向对象语言,从语言层面上就支持面向对象的编程思想:集成封装和多态. - 面向对象:我是什么,我有属性,我有方法,我要继承然后重写成自己独有的. - 面向组件:我有什么,我有组件便具备这个功能,我由很多组件组成了实体. 按照ECS的思路,功能拆分成组件,然后把这些细小的组件组合便组成了具备所需功能的对象.实际上Unity也是这种实现思路,但是它的组件式属性和逻辑的合集. 最近看了ECS编程思想,看了Entitas逻辑,写了小Demo,感觉: 编程思路/框架没有最好只有更合适,可能A框架适合RPG游戏,B框架更适合FPS游戏. - Entity的时序 开发中经常会遇到控制时序的逻辑,比如某个Entity必须在另一个Entity逻辑完成后再执行,当然可以通过添加组件标识来控制时序执行,但是如果存在大量这种逻辑势必会增加很多对应的组件作为标识. - System时序 同样可以添加C...
小海oschina 发布于 1个月前 阅读 55

7.0神器隐藏外观

法师   奥术:【点击查看】   火焰:【点击查看】   天界聚焦之刃:苏拉玛区域的所有夜之子和法多雷蜘蛛怪,不论是稀有还是普通怪物都有几率掉落(不确定是否稀有怪掉率会更高)。   冰霜:【点击查看】   霜火之忆:2级职业大厅升级传送门相关分支,有一定几率通过传送门传送到霜火岭(Frostfire Ridge)获取解锁道具。   牧师   戒律:   秘典守护者的塔杖:神器知识等级打到5级,职业大厅的档案管理员会要求你收集12本散落在世界各地的光与影的典籍,收集齐12本书合成一本书后完成任务获取外观,详细的位置及流程【点击查看】。   1.档案管理员给你第一本。   2.职业大厅暮语者琼维斯旁边   3.职业大厅梅瑞德乐·光星旁边   4.通灵学院一号boss的房间内。   5.卡拉赞馆长后面的图书馆右手边。   6.血色大厅最后的房间里。   7.达拉然紫罗兰城堡。   8.龙骨荒野新壁炉谷的教堂图书馆。   9.黑鸦堡垒内有一堆鬼魂和书架的房间。   10.阿苏纳稀有bitterbrine掉落。   11.风暴峡湾英灵殿西南方向洞穴里内的稀有怪掉落。   12.苏拉玛护月堡垒稀有怪技师洛赛尔掉落。   神圣:【点击查看】   光之子法杖:解锁道具由光之子纹章(英灵殿...
wangchen1999 发布于 5天前 阅读 8

python+Layaair引擎学做html5棋牌游戏开发

过年这段时间,无聊就开始练习做游戏开发,由于经验不足,而且自己规定限制在20天之内完成,因此只能瞎子摸象,一步步摸索。没有游戏代码样本、没有H5游戏经验、没有前端开发知识。 练习目标:做个棋牌游戏玩玩。 1:选择游戏引擎,这个开源的有很多选择,比如egret、Phaser、cocos2d-JS、layaair等,可以根据自己的选择,我这里选择layaair,开发语言是typescript。 2:游戏服务器,H5游戏一般用websocket做主要的协议,可以的话在websocket中用protobuf协议来和服务器通信,我这里选择了python做服务器。 先说明一下,涉及到了网络传输和数据库等操作,python不会比其他语言慢,因为服务器不是用来密集型计算的,而是在于IO,服务器主要耗时在于读写数据库和网络传输。此外目前python在手游中做为服务器的比例越来越高。 游戏服务器设计: 游戏服务器 table,play类等: table类主要属性包含: tableCase#目前房间状态,空闲 抢庄,准备,投注,结算等等 tablePlays#游戏玩家 tableZhuangjia#庄家 tableforbiddener#黑名单 tableRoomer #房主 tableModel #房间模式 ,抢庄或者指定庄家 tableroomCard#当前牌桌的总局数,超过局数就结束 tableCurrent#当前牌局的局...
大洋的顶端 发布于 2个月前 阅读 98

Lua截取utf-8编码的中英文混合字符串

Lua截取utf-8编码的中英文混合字符串
lbfamous 发布于 4天前 阅读 6

php redis cluster

predis纯php实现 性能堪忧 而且好像不支持长连接   官方的C扩展phpredis优势: 1.性能 2.支持持久化链接 predis每次请求40MS左右,phpredis 25MS左右,开启phpredis 链接持久化后 8MS 官方扩展phpredis安装: 下载对应的dll  放到ext目录下 然后 wamp下是使用的 ts版本 下载直接覆盖 php.ini phpForApache.ini  添加  extension=php_redis.dll   <?php //header("Content-Type:application/json"); header("Connection:close"); $method =$_SERVER['REQUEST_METHOD']; if ($method == 'GET') { $uuid = $_GET["uuid"]; $id = $_GET["id"]; $oid = "11"; $id="1";//pid $rmb = 100; //echo '{"code":1,"msg":"new redis error"}'; $redis = new RedisCluster(NULL, ['127.0.0.1:7000'], 1.5, 1.5, true); //var_dump($redis); echo($redis->get("1111")); } ?>  ...
梦想游戏人 发布于 4天前 阅读 7

Unity3d中的Tcp socket通信(开源)

开源地址:https://github.com/hiramtan/HiSocket_unity # HiSocket_unity ---------------------- ### 如何使用 可以从此链接下载最新的unity package: [![Github Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)](https://github.com/hiramtan/HiSocket_unity/releases) --------- ### 功能 - Tcp socket - Udp socket - 可伸缩字节表 - 高性能字节块缓冲区 - 消息注册和回调 - 二进制字节消息封装 - Protobuf消息封装 - AES消息加密 ### 详情 - Tcp和Udp都是采用主线程异步连接的方式(避免主线程阻塞). - 启动发送线程和接收线程处理数据传输(提高性能). - 供用户调用发送或接受数据的API在主线程中(方便直接操作unity的组件) - 监听连接事件获得当前的连接状态. - 监听接收事件获得接收的数据. - 存在字节数组队列,方便用来测试和数据重发. - 高性能字节缓冲区避免内存空间重复申请,减少GC. - 如果使用Tcp协议需要实现IPackage接口处理粘包拆包. - Ping接口因为mono底层的bug会在.net2.0平台报错(.net 4.6 没有问题,或者也可以使用unity的接口获得Ping,工程中有示例代码) --------- ### 细节 - Tcp [Transmission Control Protocol](https://...
小海oschina 发布于 3周前 阅读 26

记Bugly崩溃查找过程unity-il2cpp

Bugly上面的崩溃,刚打开根本看不懂什么函数地什么堆栈 1...一开始想到的是把il2cpp的代码生成符号文件,上传到bugly 但是找了一大圈,并没有il2cpp的符号文件,debug版本的话 代码也不一样 毫无参考价值, 2...就算是找到了符号表 也看不懂,il代码变为cpp代码根本看不懂。 3....开始根据堆栈尝试还原,因为是内存错误,首先想到的是无效指针,或者大内存分配失败,通过可以制造崩溃,然后看bugly的堆栈信息是否吻合,如果吻合那么就证明是这里的调用堆栈的问题了。然后查起来就容易多了, 4....崩溃堆栈起始是_pthread_startXXXX,基本可以断定是我们开的线程里面出错,unity主线程的话会是UnityMain。 5.....代码里面只有网络部分是自己开的线程,重点审查代码,var x = new byte[1024*1024*1024] 开始逐个可能造成内存错误的代码块插入上述测试代码,开始测试
梦想游戏人 发布于 2个月前 阅读 70

Egret 2D(5)-矢量绘图和遮罩

Graphics矢量绘图 Egret中封装了 Graphics 类实现矢量绘图功能,可以绘制矩形、圆形、直线、曲线、圆弧等。 绘制矩形 drawRect接受4个参数(x,y,宽度,高度) //绘制 let shape:egret.Shape=new egret.Shape(); //填充颜色 shape.graphics.beginFill(0xff0000,1);//第一参数为16进制颜色,第二参数为alpha透明度 //绘制矩形 shape.graphics.drawRect(0,0,100,100);//x,y,w,h //结束绘制操作 shape.graphics.endFill(); this.addChild(shape); 描边 //描边 shape.graphics.lineStyle(10,0x000000);//宽度,颜色 注意: 描边要在结束绘制和矢量图绘制之前描边 绘制圆形 drawCircle() 方法接受三个参数,第一个参数为圆心的X轴坐标,第二个参数为圆心的Y轴坐标,第三个参数为半径。 //绘制 let shape:egret.Shape=new egret.Shape(); //填充颜色 shape.graphics.beginFill(0xff0000,1);//第一参数为16进制颜色,第二参数为alpha透明度 //描边 shape.graphics.lineStyle(10,0x000000); //绘制圆形 shape.graphics.drawCircle(0,0,50);//x,y,radius //结束绘制操作 shape.graphics.endFill(); this.addChild(shape); 绘制直线 move...
Chason-洪 发布于 4周前 阅读 21

cocos官网例子

玩一玩撒,就只抄了一半,会移动的小紫
无极之岚 发布于 3周前 阅读 15

【码云周刊第 61 期】四款开源项目教你玩转微信游戏

每周为您推送最有价值的开源技术内参!
码云Gitee 发布于 2个月前 阅读 2041 评论 1 点赞 2

UE4坐标变换运算

最近又做了不少UE4坐标运算的事情,总结一下。
小保哥 发布于 2个月前 阅读 44

LZ4 和 LZMA 压缩算法针对不同格式的压缩比数据测试

本次测试使用了四种数据格式: BMP图像(较多数据冗余,447KB) JPG图像(较少数据冗余,经过一层算法压缩,35KB) TXT文档(万历十五年小说,334KB) DLL程序(PE格式,242KB)   压缩算法为LZ4(默认压缩,非HC算法)、LZMA算法(经测试采用综合效果较好的1、6压缩级别) LZMA算法分为普通算法和快速算法,压缩级别为1时使用快速算法,为6时使用普通算法   压缩比数据整理 文档类型 LZ4算法 LZMA快速算法 LZMA普通算法 BMP 30.76% 19.57% 17.65% JPG 92.21% 89.68% 89.41% DLL 63.97% 44.54% 42.35% TXT 84.31% 55.95% 51.13%   耗时数据整理(毫秒) 文档类型 LZ4算法 LZMA快速算法 LZMA普通算法 BMP 9 31 69 JPG 5.6 9.7 9.8 DLL 9.4 32.6 77.1 TXT 11.4 64.6 106.6   这个算法测试主要为 xPack 提供理论数据支撑, xPack 将采用LZ4作为快速压缩算法,用于快速压缩的情况使用,LZMA快速压缩算法作为普通压缩算法,用于性能均衡的情况下使用,而LZMA普通算法则作为高压缩比压缩算法,提供尽可能高的压缩率。...
xLeaves 发布于 1个月前 阅读 31 评论 1

高效教练—领导的特质

    1、未来的领导者需要拥有明确的价值观和清晰的愿景,他们真诚、灵活、内心一致、目标明确。   2、领导者必须具备基本特质:价值观、愿景、真诚、灵活性、一致性、目的   3、我们真正的价值观藏于内心,这些价值观在根本上都是普世性的。   4、在开始探索自我和自己的价值观,更清楚地探索社会问题之前,我首先必须摆脱来自父母、社会和文化的制约。   5、我们需要价值观驱动型的领导者——是集体价值观而非个人价值观,并且他们专注于他们的价值观,把它们最合适地用在最合适的问题上。   6、强迫员工改变内心的价值观来与公司的规定保持一致是很危险的。   7、未来的领导者必须具备的第二个特质是一个包容所有人的愿景。   8、全方位的系统思考与价值观密切相关,因为任何行动都可能在看似毫不相关的领域产生意想不到的后果。   9、个人进一步发展的过程中有一个阶段,即在超个人教练的帮助下学习退后一步,变成一个冷静的观察者。   10、绝对的真诚总是与最好的价值观和愿景密切相关。   11、一方面是摆脱来自父母、社会和文化的固有成见和旧的信念与假设的束缚;另一方面是消除恐惧,尤其是阻碍人们对改变持开放心态的对未知的恐惧。   1...
软件测试网 发布于 2天前 阅读 3

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

php redis cluster

predis纯php实现 性能堪忧 而且好像不支持长连接   官方的C扩展phpredis优势: 1.性能 2.支持持久化链接 predis每次请求40MS左右,phpredis 25MS左右,开启phpredis 链接持久化后 8MS 官方扩展phpredis安装: 下载对应的dll  放到ext目录下 然后 wamp下是使用的 ts版本 下载直接覆盖 php.ini phpForApache.ini  添加  extension=php_redis.dll   <?php //header("Content-Type:application/json"); header("Connection:close"); $method =$_SERVER['REQUEST_METHOD']; if ($method == 'GET') { $uuid = $_GET["uuid"]; $id = $_GET["id"]; $oid = "11"; $id="1";//pid $rmb = 100; //echo '{"code":1,"msg":"new redis error"}'; $redis = new RedisCluster(NULL, ['127.0.0.1:7000'], 1.5, 1.5, true); //var_dump($redis); echo($redis->get("1111")); } ?>  ...
梦想游戏人 发布于 4天前 阅读 7

Lua截取utf-8编码的中英文混合字符串

Lua截取utf-8编码的中英文混合字符串
lbfamous 发布于 4天前 阅读 6

7.0神器隐藏外观

法师   奥术:【点击查看】   火焰:【点击查看】   天界聚焦之刃:苏拉玛区域的所有夜之子和法多雷蜘蛛怪,不论是稀有还是普通怪物都有几率掉落(不确定是否稀有怪掉率会更高)。   冰霜:【点击查看】   霜火之忆:2级职业大厅升级传送门相关分支,有一定几率通过传送门传送到霜火岭(Frostfire Ridge)获取解锁道具。   牧师   戒律:   秘典守护者的塔杖:神器知识等级打到5级,职业大厅的档案管理员会要求你收集12本散落在世界各地的光与影的典籍,收集齐12本书合成一本书后完成任务获取外观,详细的位置及流程【点击查看】。   1.档案管理员给你第一本。   2.职业大厅暮语者琼维斯旁边   3.职业大厅梅瑞德乐·光星旁边   4.通灵学院一号boss的房间内。   5.卡拉赞馆长后面的图书馆右手边。   6.血色大厅最后的房间里。   7.达拉然紫罗兰城堡。   8.龙骨荒野新壁炉谷的教堂图书馆。   9.黑鸦堡垒内有一堆鬼魂和书架的房间。   10.阿苏纳稀有bitterbrine掉落。   11.风暴峡湾英灵殿西南方向洞穴里内的稀有怪掉落。   12.苏拉玛护月堡垒稀有怪技师洛赛尔掉落。   神圣:【点击查看】   光之子法杖:解锁道具由光之子纹章(英灵殿...
wangchen1999 发布于 5天前 阅读 8

7.0神器挑战外观

法师   奥法:     冰法:     火法:   牧师   神牧:     戒律:     暗牧:   术士   痛苦:     毁灭:     恶魔:   恶魔猎手   复仇:   浩劫: 德鲁伊   平衡:   守护:   野性:   治疗: 武僧   酒仙:   美猴王的传奇:通过研究职业大厅二层特质进入酒坊拿酒喝,有几率开出该外观解锁道具,见帖子:[酒仙隐藏神器外观解锁] 点击图片查看大图   织雾:   宁静精华:官方论坛收集到的消息为团队本翡翠梦魇boss梦魇之龙掉落解锁道具。   踏风:   雪怒的意志:Reddit上有玩家通过任务枯法者训练奖励获得(同血DK隐藏外观获得方式) 7.2隐藏外观:   酿酒:   踏风:   织雾: 盗贼   刺杀:   狂徒:   敏锐:   萨满   恢复:   元素:   增强: 猎人   射击:   生存:   兽王:   战士   防战:   狂暴:   武器: 死亡骑士   冰霜:   鲜血:   邪恶: 圣骑士   神圣:   惩戒:   防骑:  
wangchen1999 发布于 5天前 阅读 15

7.0神器威望外观

死亡骑士 血DK         冰DK         邪DK         恶魔猎手 浩劫DH         复仇DH         德鲁伊 鸟D         猫德                 熊德                 奶德         猎人 兽王猎         射击猎         生存猎         法师 奥法         火法                 冰法         武僧 酒仙         奶僧         风行         圣骑士 奶骑               防骑 点击图片查看大图               惩戒骑         牧师 神牧         戒律牧         暗牧                 盗贼 刺杀贼       狂徒贼         敏锐贼         萨满 元素萨                 增强萨         奶萨                 术士 痛苦术         恶魔术         毁灭术         战士 武器战         狂暴战         防战                ...
wangchen1999 发布于 5天前 阅读 4

JAVA发展史

Java:由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当时任职太阳微系统的詹姆斯·高斯林(James Gosling)等人于1990年代初开发,它最初被命名为Oak。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Dayanga 发布于 6天前 阅读 9

网络协议头部添加自定义字段 be

在之前公司的项目中,就有同事提到在头部类中预留一个 int 类型字段以备紧急情况,当时我不是太能体体会到这种用法。日常开发中就是定义一个继承至头部类的 C# 类,里面添加通信用到的字段,底层会把对象中头部类和添加的 C# 类中的字段一起序列化,头部类包含一些通用字段比如 session 和 errorcode 。当时这种方式足以满足日常需求,就没有再继续考虑在头部类中预留一个字段。 后来接触到 skynet 配套的序列化库 [sproto](https://github.com/cloudwu/sproto) 。云大给的 rpc 示例中日常开发也是类似。如下所示。 ``` .package { type 0 : integer session 1 : integer } foobar 1 { request { what 0 : string } response { ok 0 : boolean } } ``` `package` 是底层用到的包头类型。假设 `foobar` 是日常开发时添加的协议,假设这里是客户端发送请求并且在 what 字段中添加需要发送的信息,服务端处理完毕后返回,并在 ok 字段中告知处理结果。日常开发便是如此,只需要关注添加的协议即可。 具体到 sproto.lua 文件中,查看接收数据时解码处理,片段如下。阅读代码可知 sproto 先解析头部,再解析内容。所以定义头部类型 `.packege` 时,必须要有 type session 字段,...
ylme 发布于 6天前 阅读 6

Egret 中eui的应用

default.thm.json 如果项目中没有 default.thm.json,手动新建,然后里面输入{ "autoGenerateExmlsList": true,},然后编译就会自动生成一些路径到exmls中 { "autoGenerateExmlsList": true, "exmls": [ "resource/exml/classicBtn.exml", "resource/exml/headerDiamondsSkin.exml", "resource/exml/headerGlodSkin.exml" ], "skins": {} } 所需要的文件 可到eui的demo中拷贝AssetAdapter.ts和ThemeAdapter解析材料和解析主题两个文件到项目中。然后在Math.ts中解析素材。下文有。 Main.ts 首先是Matin.ts继承eui.UILayer class Main extends eui.UILayer { /** * 加载进度界面 * Process interface loading */ private loadingView: LoadingUI; public constructor() { super(); } protected childrenCreated() { //注入自定义的素材解析器 let assetAdapter = new AssetAdapter(); egret.registerImplementation("eui.IAssetAdapter", assetAdapter); egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter()); egret.lifecycle.addLif...
Chason-洪 发布于 1周前 阅读 13

cornerstone破解

https://www.jianshu.com/p/c7476b2d6c30
ghou-靠墙哭 发布于 2周前 阅读 8

全局静态变量析构和线程结束先后顺序问题

  主线程main退出后 全局变量mutex 没有在 子线程销毁后销毁(析构) 问题:主线程main退出后 detach后的子线程(C RT托管)和 全局静态变量(生命周期CRT托管)析构 的先后问题。 翻了一遍CRT源码,,没找到 他们先后关系 , 但是这里的示例给出的答案是 main函数return后 detach了的子线程的结束在全局静态变量析构后   吐槽:为什么会是这个顺序 CRT的设计者不会没考虑过这种情况吧? 全局静态变量并不属于某个thread所有 为了方式出错也应该所有thread被结束后才析构(销毁)全局静态变量
梦想游戏人 发布于 2周前 阅读 10

模板内部模板的初始化

对于局部静态的初始化很容易,如果是全局变量的内部模板类的初始化就是一个问题了 老是编译不过   比如 就会编译错误 改为 编译通过 但是 还是没有初始化ctor  引用还会导致编译错误 未找到符号XXX 由于全局变量析构顺序不同的编译器下不一样 因此还是放在局部静态变量安全 缺陷就是第一次调用会消耗一些时间  
梦想游戏人 发布于 2周前 阅读 4

C++对象池以及shared_ptr的支持

对象池 和 支持对象池的shared_ptr 性能测试 数字的单位是微妙 分配5万个 1kb的object  10 kb 100kb 500b 128b 因此 只考虑对象分配速度问题的话  大于 512的对象推荐使用pool版本 第一个是:自己实现的池容器  对象池 第二个是:make_shared   非对象池 第三个是:原始的new delete  非对象池 测试2: 和上上面的一样 只不过第一条数据是 std::queue 而非自己实现的容器   对于release 0x3优化 版本的测试 相差很大   32bytes 64bytes 128 bytes 512 10kb 因此综合来看 超过 32 字节的 都应该用pool来处理   Object.h #pragma once /* Email me@dreamyouxi.com 注意事项: 1.使用例子在cpp文件各种test函数里面 2. class说明: RawObject: 1.最原始的指针 只不过封装了一个release函数 用于delete this RefObject: 1.简单的引用计数 需要手动去计数 Retain Release快速简单 RefObjectThreadSafe: 1.RefObject的线程安全版本 只保证计数安全 SharedObject: 1.std::enable_shared_from_this 封装 无需手动在继承 如果想用原始的std::shared_ptr可以继承方便使用 Recycleable: 1.对象池可回收对象 ctor和dtor需要重写 以供初始化内部数据 share_ptr: ...
梦想游戏人 发布于 2周前 阅读 14

Rotisserie在手,“吃鸡”直播精彩时刻尽在掌握 !

据说,“吃鸡游戏”已经霸榜 Steam一年了, 这款游戏能风靡全球并自带“热搜体质”, 离不开各大平台玩家直播的强势圈粉。 在 Twitch 等直播平台上, 有几十万人观看数以千计的玩家直播。 但问题是—— 人人都只想看即将分出胜负的关键时刻, 但偏偏大多数直播都处于冗长无趣的多人存活期, 如何才能在千篇一律的直播中挑出“最优质”的那个? 绝地求生 Rotisserie ,了解一下? 全面监控 Twitch 上可用的所有直播, 随时切换,显示只剩少数玩家并接近最后时刻的直播。 悄悄告诉你,这么厉害的新功能, 目前只有绝地求生 Rotisserie 能办到哦! 马上点击“阅读原文”查看完整文章,祝各位“吃鸡”粉们,大吉大利,今晚吃鸡!  
IBMdW 发布于 3周前 阅读 13

Egret之常见操作

获取舞台宽度和高度 如果是Main.ts中: 任何对象添加到舞台对象都可以通过 this.stage.stageWidth this.stage.stageHeight 如果其他类中: 注意项目中要有game类,也就是egretProperties.json中要有{"name":"game"} egret.MainContext.instance.stage.stageWidth egret.MainContext.instance.stage.stageHeight 横屏显示 可以在 index.html 里的 body 部分修改 data-orientation 属性 也可以: this.stage.orientation = egret.OrientationMode.LANDSCAPE; 缩放模式 建议使用fixedNarrow 
Chason-洪 发布于 3周前 阅读 6

Unity3d中的Tcp socket通信(开源)

开源地址:https://github.com/hiramtan/HiSocket_unity # HiSocket_unity ---------------------- ### 如何使用 可以从此链接下载最新的unity package: [![Github Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)](https://github.com/hiramtan/HiSocket_unity/releases) --------- ### 功能 - Tcp socket - Udp socket - 可伸缩字节表 - 高性能字节块缓冲区 - 消息注册和回调 - 二进制字节消息封装 - Protobuf消息封装 - AES消息加密 ### 详情 - Tcp和Udp都是采用主线程异步连接的方式(避免主线程阻塞). - 启动发送线程和接收线程处理数据传输(提高性能). - 供用户调用发送或接受数据的API在主线程中(方便直接操作unity的组件) - 监听连接事件获得当前的连接状态. - 监听接收事件获得接收的数据. - 存在字节数组队列,方便用来测试和数据重发. - 高性能字节缓冲区避免内存空间重复申请,减少GC. - 如果使用Tcp协议需要实现IPackage接口处理粘包拆包. - Ping接口因为mono底层的bug会在.net2.0平台报错(.net 4.6 没有问题,或者也可以使用unity的接口获得Ping,工程中有示例代码) --------- ### 细节 - Tcp [Transmission Control Protocol](https://...
小海oschina 发布于 3周前 阅读 26

软件---网景战Microsoft

在20世纪留下这个星球的一方 从国人自己的角度工业化在南方北方(我们不努力自己都不知外面) 从国人自己的角度信息化发展的当下  也有腾讯和360  搜索大战  南车北车产业链之争 留下的案例   有ppt   请找湖湘老黑   wyhexin@163.com  
海博1600 发布于 3周前 阅读 9

cocos官网例子

玩一玩撒,就只抄了一半,会移动的小紫
无极之岚 发布于 3周前 阅读 15

io_service 多线程化

由于单线程设计一台8核机器 15个进程 浪费了15个端口 考虑 合并到一个进程里面以共享端口,但是设计和代码书写方式还是按照单线程来设计 一个io_service hold 了一个GameApp对象 操作该app对象 都是线程安全的   //TODO
梦想游戏人 发布于 3周前 阅读 6

Egret 2D(10)Tween缓动动画

确保项目支持 Tween 在 Egret 项目中,修改egretProperties.json中的modules,添加 tween 模块: { "name": "tween" } 在项目所在目录内执行一次引擎编译: egret build -e Tween缓动基本用法 Tween中封装了最常用的缓动动画功能,包括动画时间设定,缓动动画控制, 缓动效果控制等等。下面是一个缓动动画示例。 var shp:egret.Shape = new egret.Shape(); shp.graphics.beginFill( 0x00ff00 ); shp.graphics.drawRect( 0, 0, 100, 100 ); shp.graphics.endFill(); this.addChild( shp ); //获得需要缓动的显示对象 var tw=egret.Tween.get(shp); //to方法开始缓动 tw.to({x:150},1000) 缓动对象是用 egret.Tween.get() 获得的,该方法需要传入用于缓动的目标对象,即例中的 shp。,然后通过 to() 方法给出需要设置缓动的具体参数。to() 的第一个参数用于设置缓动属性以及目标值:例中的属性为 x ,目标值为 150,即会将 shp 从当前 x 坐标位置缓动到 x 坐标为 150;to() 的第二个参数为缓动时间长度,单位为毫秒,例中的缓动长度为 1000毫秒,即 1 秒 。 缓动对象的基本控制参数 在定义缓动时,还...
Chason-洪 发布于 3周前 阅读 12

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

如何预估索引性能?

掌握快速预估索引耗时的能力
wier 发布于 4个月前 阅读 2164 评论 10 点赞 9

Sql优化器究竟帮你做了哪些工作?

关系型数据库的一大优势之一,用户无需关心数据的访问方式,那么优化器是如何做到的,我们要如何优化?
wier 发布于 4个月前 阅读 3197 评论 22 点赞 8

DB——数据的读取和存储方式

数据库是我们常用的一些存储数据的方式,我们从读写来了解RDBMS的存取结构
wier 发布于 5个月前 阅读 2367 评论 5 点赞 6

一致性hash在DynamoDB上的应用

Dynamo是Amazon提供的一个分布式存储NoSQL 数据库,它采用去中心化、松散耦合的方式,组成一个支持高度扩展的Key/Value 数据库,本篇我们着重分析一下,它是如何采用采用一致性hash而达到可高度扩展的。
wier 发布于 5个月前 阅读 1181 评论 1 点赞 1

如何合理的规划一次jvm性能调优

JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响,那么如何进行一次优雅的调优,提升应用的性能?
wier 发布于 6个月前 阅读 2925 评论 9 点赞 11

jvm优化必知系列——监控工具

项目部署线上之后,我们该如何基于监控工具来快速定位问题....
wier 发布于 6个月前 阅读 4492 评论 14 点赞 18

jvm优化—— 图解垃圾回收

jvm必知系列,总结一些常见jvm回收机制,方便查阅
wier 发布于 6个月前 阅读 5724 评论 21 点赞 20

java多线程——锁

这是多线程系列第四篇,偏重于线程的实践,对锁的几种应用做个简要介绍
wier 发布于 7个月前 阅读 3710 评论 15 点赞 4

java多线程——volatile

java多线程系列第三篇,深入理解volatile的原理以及应用
wier 发布于 8个月前 阅读 3653 评论 11 点赞 6

java 多线程—线程怎么来的?

并发处理的广泛应用是使得amdah1定律代替摩尔定律成为计算机性能发展源动力的根本原因,是人类压榨计算机运算能力的最有力武器。
wier 发布于 8个月前 阅读 4754 评论 5 点赞 9

图解LZ77压缩算法

数据压缩是一个减小数据存储空间的过程,目前被应用在软件工程的各个地方,了解其一些原理,方便我们更好的甄选压缩方案。
wier 发布于 9个月前 阅读 3768 评论 7 点赞 16

游戏服务器架构演进(完整版)

王者荣耀技术分析第三篇,服务器架构模型分析...
wier 发布于 9个月前 阅读 7910 评论 38 点赞 21

从王者荣耀聊聊游戏的帧同步

通过王者荣耀,我们来聊一聊帧MOBA游戏的技术实现以及同步方式
wier 发布于 10个月前 阅读 10182 评论 58 点赞 39

有趣的二进制—高效位运算

位运算是一种比较特别的数学运算。一般情况下,位运算的运算效率比加减乘除等常规数学运算要高得多。此外,位运算具备一些常规数学运算所没有的特点和规律,我们可以利用位运算的相关特性来完成一些非常巧妙的程序设计。
wier 发布于 1年前 阅读 3718 评论 31 点赞 8

有趣的二进制

优秀应用算法都大量用到位运算,而位运算在工作中很少用到,所以借助其算法,我们看一下位运算的优势以及应用,但是大多数教材只会教大家二进制和十进制如何互换,都是死记硬背式的,并没有去讲解真正含义,换一个进制之后,依然不会,我们回到最根本的一些计数方法上,从10进制来推算,希望用一种更简单的方式介绍其原理
wier 发布于 1年前 阅读 5376 评论 22 点赞 11

WinformGDI+入门级实例——扫雷游戏(附源码)

本文将作为一个入门级的、结合源码的文章,旨在为刚刚接触GDI+编程或对相关知识感兴趣的读者做一个入门讲解。游戏尚且未完善,但基本功能都有,完整源码在文章结尾中。
穆翔 发布于 2年前 阅读 1528 评论 6 点赞 1

几款 Pokémon Go 开源项目介绍

Pokémon Go是由任天堂发布的增强现实(AR)游戏,一经推出,火遍全球,收获众多玩家。想必很多只猿,也沉浸其中。在这里,介绍几款 Pokémon Go开源项目,感兴趣的猿,可以尝试尝试。
催呀催呀 发布于 2年前 阅读 5719 评论 14 点赞 3

Xgame 合服工具技术设计文档

这是一篇介绍“合服工具”的技术文档;合服工具代码可以参考:https://git.oschina.net/afrxprojs/xgame-php_tool,注意:合服工具使用 PHP 语言开发!为什么使用 PHP,我后面会简要说明;该文档的主要目的是说明开发“合服工具”的思维过程,而不仅仅是使用说明!技术文档的价值在于过程而不是结论;我假定你对游戏行业的技术岗位工作有所了解。如果你亲身参与过游戏合服工作,这篇文档阅读起来可能会比较轻松;这是一篇不合规范的文档,所有符合规范的文档,没有人喜欢读……该文档以“轻松、易读、实用”作为规范;
hjj2017 发布于 3年前 阅读 1081 评论 3 点赞 2

C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI

目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词)。 NGUI虽然不是Unity 官方原生的,但以其强大的能力和友好的操作性,成为了事实上的王者—-无他,OnGUI太挫了。
王文刚_AR_VR 发布于 3年前 阅读 16595 评论 4 点赞 7 打赏 1

C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想

如果你接触过《设计模式》、软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”。 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例)。
王文刚_AR_VR 发布于 3年前 阅读 2084 评论 4 点赞 2
顶部