??xml version="1.0" encoding="utf-8" standalone="yes"?>无码任你躁久久久久久,人妻精品久久无码区,亚洲国产精品无码久久久不卡http://www.shnenglu.com/sunicdavy/archive/2018/08/29/215887.html战魂筑战魂筑Wed, 29 Aug 2018 03:16:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2018/08/29/215887.htmlhttp://www.shnenglu.com/sunicdavy/comments/215887.htmlhttp://www.shnenglu.com/sunicdavy/archive/2018/08/29/215887.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/215887.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/215887.htmlZ~写Zcellnet的新一代游戏服务器框架Q最q深入研I微服务QServiceMesh{概c研I过E中对Web和游戏两U服务器架构设计有一些心得,~写q记录下来?下文中,Game表示游戏服务器,Web表示Web服务? ``
状态缓?/span>
所谓状态缓存,是在内存而非专业数据~存服务器(如redisQ中保存和处理逻辑数据Q手动编写此q程较ؓJ琐但是效率较高Q但随着状态逻辑复杂性和q发、扩定w题提出,状态同步会变得来复杂?/span>
Game:
Z互性的服务器类型需要在服务器做~存Q逻辑~写也较为容易,无需处理事务q发问题。例如:l队Q匹配,战斗逻辑。服务器不能随意重启?/span>
׃互性的服务器类型可配合redis做成无状态服务器Q例如:LQ技能升U,领取物品{。服务器随时支持重启?/span>
游戏服务器ؓ了提高性能Q早期所有服务器都是使用状态缓存写法编写,特别是MMORPGq类Z互的游戏服务器尤Z重?/span>
Web:
均ؓ无状态服务器Q弱交互。用事务方式处理ƈ发逻辑Q例如:交易Q下单等?/span>
推送,单独发?/span>
q里提到的所谓推送,单独发送是与RPC区别的通讯Ҏ。RPC要求h必须有回应。而推送单独发送则更像是通知和广播,无需目的方返回Q何消息?/span>
Game:
扑ֈ服务器的SessionQ直接Send
通过中{服务器,或称Z心服务器q行注册/q播
客户端的model数据需要更新时Q服务器会主动推送消息?/span>
游戏服务器没有严格的RPC设计需求,推送和单独发送较Web服务器更多。而且游戏服务器多使用长连接,所以主动推送也比Web服务器来的方便一些?/span>
Web:
推送做成专有的服务Qƈ做排队和q发处理?/span>
可用?/span>
听说q游戏停服更斎ͼ支付宝服务器在刷二维码时停服了可一定被骂惨吧。WebҎ务器高可用性要求很高,游戏虽然也注重服务器E_性和可用性,但是׃版本q代更新频繁Q停服更新反而能获得玩家接受?/span>
Game:
游戏对可用性要求不高?/span>
游戏大版本更新时需要停服更新。支持热更新技术的服务器(例如ErlangQSkynetQ仅使用热更C复bugQ很直接更新新版本?/span>
不是所有的游戏服务器支持动态添加服务器?/span>
Web:
极高的可用性,服务不允许停服更斎ͼ使用蓝绿及灰度方式更新服务器?/span>
随时可以横向扩展服务器,提高服务器容量和承蝲?/span>
q接及传?/span>
均用TCP传输协议Q游戏服务器注重性能Q自有协议及二进制协议用较多?/span>
Web注重兼容和接口友好,使用JSON格式较多?/span>
Game:
使用长连接,需要从逻辑层维护连接状态及处理服务器不在线情况
使用自有包格式Q大部分使用protobuf或二q制格式?/span>
Web:
微服务大部分使用短连接,grpc支持http2长连?/span>
使用json~码方便调试和版本兼宏V?/span>
量限制
人数多了QQ何服务器都扛不住Q流量限制和d限制能有效保护服务器E_?/span>
Game:
单服有h数限Ӟ可以通过GM后台讄挡墙Q超q无法进?/span>
Web:
限流器中间gQ可以精到服务控制量
断流Q防止雪?/span>
Game:
游戏没有Q也不需要这U概念,游戏h不会H然升高Q即便有Q也通过GM后台Zؓ控制
Web:
断流器中间g
服务发现
如何扑ֈ服务器地址?/span>
服务有变化时Q通过Watchpȝ通知订阅者更新本地缓?/span>
服务器没有变化时Q用本地缓存找到服务地址
Game:
游戏服务器互怾赖复用只在很的范围内,因此无需在不同语a不同q程服务间获得地址Q大部分在配|文件中填写各服务的IP及地址卛_互相讉K?/span>
早期游戏自己~写服务器状态及地址发现服务?/span>
有用redis做服务发?/span>
Web:
使用服务发现pȝQ分布式部v。无需依赖配置文g
|关需?/span>
Game:
|关处理客户端上下线通知Q心跻Il持q接Q{发,q播上下行封?/span>
Web:
Ҏh地址路由Q无上下U概念,无心跟뀂广播通过消息推送系l完?/span>
׃W者从事游戏行业,对Web服务器概念在逐渐熟悉中,若有错误和不各位大{指出?/span>
本hC《Go语言从入门到q阶实战》,生动的语aQ例子带有各U彩蛋,L了解Go语言Ҏ,更有cellnet框架剖析解密
https://search.jd.com/Search?keyword=go%E8%AF%AD%E8%A8%80%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6%E5%AE%9E%E6%88%98&enc=utf-8&suggest=1.def.0.V02&wq=Go%E8%AF%AD%E8%A8%80%E4%BB%8E&pvid=145d55a92cab4b07b71326f8beb1700b


战魂筑 2018-08-29 11:16 发表评论
]]>
在Windows下运行Linux Shellhttp://www.shnenglu.com/sunicdavy/archive/2017/11/27/215373.html战魂筑战魂筑Mon, 27 Nov 2017 07:15:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2017/11/27/215373.htmlhttp://www.shnenglu.com/sunicdavy/comments/215373.htmlhttp://www.shnenglu.com/sunicdavy/archive/2017/11/27/215373.html#Feedback3http://www.shnenglu.com/sunicdavy/comments/commentRss/215373.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/215373.html

来多的h选择用Mac或者Linux环境q行跨^台项目开发。但是仍然有大部分h习惯于在Windows环境下进行开发,毕竟Windows在各斚w使用q是较ؓ方便Q特别像文g版本理QGitQSVN{)

在跨q_下开发游戏或软gQ就需要有一套方便的自动化工兗Windows下需要用批处理Q虽然有PowerShell加持Q但q东西学了也不靠谱,只有一个^台能用。大家还是习惯Linux Shell。连Macq_都可以用ShellQWindows上要做自动化脚本显得非常尴?/p>

我曾l在目中用go~写了一套将配置转ؓ批处理和Linux Shell的工兗用过E较为复杂,但是能跨q_q行表格导出和协议编译等工作?/p>

但是Q这个工兯是需要对不同的^台编写多套模板进行代码生成,非常J琐。如果有一套跨q_的ShellQ编写一ơ就可以跨^台运行那该多好?/p>

查阅资料后,一共有几个ҎQ?/p>

  1. 使用Python作ؓ自动化工?q个Ҏ其实是使用python把批处理和Shellq的事情用代码来解决。但前提是要重新学习PythonQ也需要一部分熟悉单的Python语法Qh为学习成本较高,也比较费事?/p>

  2. 自己~写一套独立的自动化工?q个Ҏ需要长旉的适配q程Q差什么指令补什么指令,寚w目进度有一定干扰?/p>

  3. 自己~写Linux Shell的解释器 q个更难了Q要做到100%兼容Q基本不可能?/p>

  1. 使用Cygwin和Mingw 需要一个微型运行时q行Linux Shell的解释,msys大概?8M左右Q可行性较高?/li>

在研ICygwin和Mingw如何整合的过E中Q我误操作点M一个sh后缀的Linux ShellQ这是我希望让Mingwq行的Shell。结果呢Qsh后缀的文件居然能在Windows下运行。我马上~写了一pd的例子,发现几乎完全兼容常用的Shell指o?l过研究Q我发现Windows下能q行sh文g是由Git自带的msys2提供的。MSYS2 QMinimal SYStem 2Q?nbsp;http://www.msys2.org/Q?/a> 是一个MSYS的独立改写版本,主要用于 shell 命o行开发环境。同时它也是一个在Cygwin QPOSIX 兼容性层Q??MinGW-w64Q从"MinGW-生成"Q基上生的Q追求更好的互操作性的 Windows 软g?/p>

那就是说Q?span style="box-sizing: border-box; font-weight: 600;">只要安装了GitQ?a style="box-sizing: border-box; background-color: transparent; color: #0366d6; text-decoration-line: none;">https://git-scm.com/Q,那么可以在Windows下直接运行Linux ShellQ只需要将文g后缀命名为sh卛_?/p>

问过周边友h是否知道q一功能Q都说知道,只是没有q播而已Q害我研I很?#8230;…



战魂筑 2017-11-27 15:15 发表评论
]]>
Golang 热更新研I笔?/title><link>http://www.shnenglu.com/sunicdavy/archive/2017/07/06/215057.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Thu, 06 Jul 2017 04:47:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2017/07/06/215057.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/215057.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2017/07/06/215057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/215057.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/215057.html</trackback:ping><description><![CDATA[<p data-source-line="1" style="box-sizing: border-box; margin-bottom: 16px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 21px; widows: 1; background-color: #ffffff; margin-top: 0px !important;">本文主要研究游戏服务器带状态的热更新需?http的无状态热更新需求已l有成熟Ҏ, 故不在本文描q范?/p><h1><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#基本概念" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>基本概念</h1><ul data-source-line="6" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; padding-left: 2em; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 21px; widows: 1; background-color: #ffffff;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">Golang的热更新采用什么机?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">使用go1.8提供的plugin包机制实?/p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">plugin包本w设计的目的是热更新?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">plugin包其实只是支持将代码分别~译为多个动态库,动态加载后q行 q不能完全支持类似C/C++的动态库方式处理代码</p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">带状态的q程热更新的基本概念及范围是什?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">数据部分(model)不更? 只更新逻辑部分(函数)</p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">表格和配|更新算热更C?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">? 但不是本文描q范?/p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">热更新能在windows上用么?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">不支?/p></li></ul><h1><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#代码及结? style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>代码及结?/h1><ul data-source-line="29" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; padding-left: 2em; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 21px; widows: 1; background-color: #ffffff;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">我能原来一个exe的代码编译ؓso提供lplugin使用?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">可以, 但是必须仍然保留main包作为插件入? q在main包内d提供lplugin调用入口.</p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">如果动态库中没有main? ~译出的so能用?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">不能, 包必d含main, 否则输出的是.a的文? plugin包加载会报错</p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">动态库? 非main包的的代码修改能做热更新?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;"><span style="box-sizing: border-box; font-weight: 600;">不能</span>!(崩溃了吧, 我提了一个issue: <a style="box-sizing: border-box; color: #4078c0; text-decoration-line: none; background-color: transparent;">https://github.com/golang/go/issues/20554</a>)</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">如果实做了修改, 底层会报? plugin was built with a different version of package</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">解决Ҏ: 修改plugin包底层实现ƈ重新~译 打开runtime/plugin.go, 注释以下代码 for _, pkghash := range md.pkghashes { if pkghash.linktimehash != *pkghash.runtimehash { return "", nil, pkghash.modulename } } 执行/usr/local/go/run.bash 重编?试</p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">代码中哪些可以被更新? Ҏ可以被更C? 闭包?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">只能更新拥有静态地址的结?例如: 包别函?cM于静态函?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">例如: svc_0.so里有一个Foo函数, svc_1.so修改了Foo函数实现, 热更新可实现</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;"><span style="box-sizing: border-box; font-weight: 600;">闭包=函数+捕获变量</span>, 实际上是一个动态结? 没有静态地址, 无法被更?/p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">各种包别变? l构体变? l构体方? 局部变量均不能被热更新, 但是变量g会被影响</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">新增l构可以被运?/p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">使用l构体方法调用了包别函? 包别函数能被更C?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">可以, 虽然Ҏ不能被更? 但方法被调用的包U别函数的地址是固定的, 所以可以被热更?/p></li><li style="box-sizing: border-box; margin-top: 0.25em;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">init包初始化函数能用? 能被热更C?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">官方q样描述:</p><pre data-source-line="71" style="box-sizing: border-box; font-stretch: normal; font-size: 11.9px; line-height: 1.45; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; word-wrap: normal; margin-top: 0px; margin-bottom: 16px; padding: 16px; overflow: auto; border-radius: 3px; background-color: #f7f7f7;"><code style="box-sizing: border-box; display: inline; overflow: visible; padding: 0px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; margin: 0px; font-size: 11.9px; border-radius: 3px; word-break: normal; border: 0px; line-height: inherit; word-wrap: normal; background: 0px 0px transparent;"><span style="box-sizing: border-box; font-weight: 700;">When</span> a plugin <span style="box-sizing: border-box; font-weight: 700;">is</span> first opened, the init functions <span style="box-sizing: border-box; font-weight: 700;">of</span> <span style="box-sizing: border-box; font-weight: 700;">all</span> packages <span style="box-sizing: border-box; font-weight: 700;">not</span> already part <span style="box-sizing: border-box; font-weight: 700;">of</span> the program are called. The main <span style="box-sizing: border-box; font-weight: 700;">function</span> <span style="box-sizing: border-box; font-weight: 700;">is</span> <span style="box-sizing: border-box; font-weight: 700;">not</span> run. A plugin <span style="box-sizing: border-box; font-weight: 700;">is</span> only initialized once, <span style="box-sizing: border-box; font-weight: 700;">and</span> cannot be closed</code></pre><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">插gW一ơ被打开? 其关联的, 没有成ؓE序的一部分的所有的包的init函数被调用. 插g的main函数不会被调? 插g只会被初始化一? 不能被关?/p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">因此, 需要手动将init函数Ҏ自己的函? l一在so的main包里调用</p></li></ul><h1><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#~译" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>~译</h1><ul data-source-line="80" style="box-sizing: border-box; margin-top: 0px; padding-left: 2em; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 21px; widows: 1; background-color: #ffffff; margin-bottom: 0px !important;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">如何~译获得plugin包支持的动态库</p><pre data-source-line="82" style="box-sizing: border-box; font-stretch: normal; font-size: 11.9px; line-height: 1.45; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; word-wrap: normal; margin-top: 0px; margin-bottom: 16px; padding: 16px; overflow: auto; border-radius: 3px; background-color: #f7f7f7;"><code style="box-sizing: border-box; display: inline; overflow: visible; padding: 0px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; margin: 0px; font-size: 11.9px; border-radius: 3px; word-break: normal; border: 0px; line-height: inherit; word-wrap: normal; background: 0px 0px transparent;">SVCNAME=<span style="box-sizing: border-box; color: teal;">$1</span> SVCVER=<span style="box-sizing: border-box; color: teal;">$2</span> TIMESTAMP=`date <span style="box-sizing: border-box; color: #dd1144;">'+%Y%m%d_%H%M%S'</span>` go build -v -buildmode=plugin --ldflags=<span style="box-sizing: border-box; color: #dd1144;">"-pluginpath=${SVCNAME}_${TIMESTAMP}"</span> -o ${SVCNAME}<span style="box-sizing: border-box; color: teal;">_</span>${SVCVER}.so ${SVCNAME}</code></pre><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">-buildmode=plugin是重要参?/p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">--ldflags里的-pluginpath的作用是: 每次~译的内部识别\径都是不同的, 避免重复加蝲的警?/p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">参? <a style="box-sizing: border-box; color: #4078c0; text-decoration-line: none; background-color: transparent;">https://github.com/golang/go/issues/19004</a></p></li></ul><img src ="http://www.shnenglu.com/sunicdavy/aggbug/215057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2017-07-06 12:47 <a href="http://www.shnenglu.com/sunicdavy/archive/2017/07/06/215057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MMO怽技术研I?/title><link>http://www.shnenglu.com/sunicdavy/archive/2017/04/08/214817.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Sat, 08 Apr 2017 06:41:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2017/04/08/214817.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/214817.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2017/04/08/214817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/214817.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/214817.html</trackback:ping><description><![CDATA[<h1>怽技?/h1><p data-source-line="3" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">怽技术大规模出现在魔兽世界WLK版本, 现在应用已经q泛应用在各UMMORPG游戏? 下面对相位技术的做法q行单归Ux?/p><h2><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#表现分类" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>表现分类</h2><h3><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#副本怽" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>副本怽</h3><p data-source-line="10" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">早期副本的出? 避免抢怪问? 所? 副本其实本n是一U相位技? 只不q实现时, 我们一般会小队和怪物直接预分配在独立的一个副本实例中(所以副本原文也是实例的意?</p><h3><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#分线怽" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>分线怽</h3><p data-source-line="15" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">怽技术还没有正式命名? 同一个场? 玩家q到不同的分U看到的玩家不一? 也是属于怽的一U? 当然, 如果是组队玩? 服务器默认会分配所有队伍玩家在同一个线(位面)</p><h3><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#真相? style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>真相?/h3><p data-source-line="20" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">副本怽和分U相位其实都是静态相? 一旦进? 中途不会有切换或者؜合查看的q程. 真相位可以在一个场景中,动态切换相? 怽内和怽外所以不?/p><p data-source-line="22" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">我们常见的真怽表现? <span style="box-sizing: border-box; font-weight: bolder;">怽中的角色+玩家+队伍成员</span></p><p data-source-line="24" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">在护送Q务时, q会在上面所见角色中叠加世界中的所有角? 也就是说, 你和队伍成员可以看到的角? 其他人看不到, 其他Z看不C和你的队伍成?/p><hr style="box-sizing: content-box; overflow: hidden; height: 4px; padding: 0px; margin: 16px 0px; border-width: 0px; border-style: initial; border-bottom-color: #eeeeee; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background: #e7e7e7;" /><p data-source-line="28" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">Z清晰的简单的描述, 我ؓ怽创徏如下概念与名?/p><h2><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#怽客体" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>怽客体</h2><p data-source-line="33" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">表现为除玩家外的角色(怪物,交互物体与相位可见场?</p><h3><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#U有客体" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>U有客体</h3><p data-source-line="37" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">q是最常见的一U相位内角色</p><ul data-source-line="39" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; padding-left: 2em; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">持有变量</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">取PhasingID?为PhasingTargetID</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">生成规则</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">当玩家开启相位后, 在玩家相位内<span style="box-sizing: border-box; font-weight: bolder;">生成的角?/span>为私有客?</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">此时, ?PhasingTargetID讄为相位生成者的实例ID</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">删除规则</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">如果玩家退出相? U有客体会存在一D|间或按照需求删?/p></li></ul><h3><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#公共客体" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>公共客体</h3><p data-source-line="55" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">一般指提前攄在场景中, 世界内不可见, 但是能被同相位玩家可?且同怽玩家都可以互相可?比如: 只要接了同一个Q务的玩家, 都可以看到的NPC</p><ul data-source-line="58" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; padding-left: 2em; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">持有变量</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">取PhasingID?为PublicPhasingID</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">生成规则</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">通过场景~辑? 攄角色? 讄其可被观察到的Q务ID</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">角色被加载后, Q务ID讄到StaticPhasingID</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">删除规则</p><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">场景删除, 角色删除</p></li></ul><h2><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#怽M" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>怽M</h2><p data-source-line="75" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">包含玩家与同队伍玩家</p><ul data-source-line="78" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; padding-left: 2em; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">开启相位后, 可见U有客体+公有客体</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">队长视ؓ怽M, 单h? 自己为队?/p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">队伍其他成员׃n队长的私有相位客?/p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">队伍其他成员Ҏ自己的PublicPhasingID匚w目标对象的PublicPhasingID时可互相可见</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;">持有变量</p></li></ul><p data-source-line="88" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">怽开启时, 取PhasingID? 色实例ID</p><p data-source-line="90" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">怽关闭? 取PhasingID? ?</p><p data-source-line="92" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">PublicPhasingID</p><h2><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#可见规则" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>可见规则</h2><p data-source-line="98" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">当两个角色的PhasingID相等? M与私有客体互相可?/p><p data-source-line="100" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">当两个角色的PublicPhasingID相等? M与公有客体互相可?/p><p data-source-line="102" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff;">可以通过开兌|? 是否在可见的怽客体基础? 叠加世界角色(护送Q?</p><h2><a href="file:///C:/Users/Davy/AppData/Local/Youdao/YNote/markdown/index.html#U束" style="box-sizing: border-box; color: #4078c0; text-decoration-line: none;"></a>U束</h2><ul data-source-line="106" style="box-sizing: border-box; margin-top: 0px; padding-left: 2em; color: #333333; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; line-height: 22.4px; widows: 1; background-color: #ffffff; margin-bottom: 0px !important;"><li style="box-sizing: border-box;">玩家同时只能看见1个相?/li></ul><img src ="http://www.shnenglu.com/sunicdavy/aggbug/214817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2017-04-08 14:41 <a href="http://www.shnenglu.com/sunicdavy/archive/2017/04/08/214817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unity3D_子pȝ屏幕外不更新不渲染问?/title><link>http://www.shnenglu.com/sunicdavy/archive/2016/08/01/214082.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Mon, 01 Aug 2016 07:23:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2016/08/01/214082.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/214082.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2016/08/01/214082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/214082.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/214082.html</trackback:ping><description><![CDATA[<p>q是一个Unity3D元老bug, 表现是:  角色在屏q边~放Ҏ,  d屏幕持箋一D|间后再回到屏q后, 发现Ҏ重新播放. 昄q是错误的效?/p> <p>解决Ҏ:</p> <p>在ParticleSystemlg上勾选SubEmitter, 不要问ؓ什? 做就?/p> <p>相关官方链接</p> <p><a title="http://answers.unity3d.com/questions/218369/shuriken-particle-system-not-rendering-particles-w.html" >http://answers.unity3d.com/questions/218369/shuriken-particle-system-not-rendering-particles-w.html</a></p> <p> </p> <p>天煞? 4.XE序无法讉K_子pȝ的参? 所以只能辛苦美术兄弟们?/p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/214082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2016-08-01 15:23 <a href="http://www.shnenglu.com/sunicdavy/archive/2016/08/01/214082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ҏios应用的网lipv6适配ȝhttp://www.shnenglu.com/sunicdavy/archive/2016/06/16/213731.html战魂筑战魂筑Thu, 16 Jun 2016 06:18:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2016/06/16/213731.htmlhttp://www.shnenglu.com/sunicdavy/comments/213731.htmlhttp://www.shnenglu.com/sunicdavy/archive/2016/06/16/213731.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/213731.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/213731.htmlҎ要求?016q??日后新的app必须支持ipv6|络, 技术发展靠Ҏ果然没错, 但开发者还是要开始忙h?br>q里介绍下Unity3D的适配的一些经?

基本注意?/h3>
  • ios ipv6适配无需修改服务? 也就是说, 如果你的服务器依然是ipv4的也是可以用的
  • Ҏ的适配Ҏ是将ipv4的地址转换为ipv6, C路由层再转回ȝl利用ipv4|络传输

试|络环境搭徏

转蝲h?http://www.shnenglu.com/sunicdavy战魂筑

|上有很多翻译了Ҏ官方的搭建ipv6试|络环境的文? 例如:
http://www.cocoachina.com/ios/20160525/16431.html
注意以下几点

  • 无需路由器支持ipv6, 但猫(modem)必须要支持ipv6. 因ؓ现在大多数都是光?br>以下截图是光猫管理端
    3440e3f9-12de-435b-85ab-a7a3be8b384b[6]
    光猫里的ipv6支持默认是关闭的, 所以需要手动打开, 按默认值配|即?/p>

  • L认mac ospȝ必须是osx 10.11以后的版本才可以打开NAT64

  • 正确q接mac的ios讑֤应是如下截图C意
    91f54476-4b5d-4585-a364-0da2139774c1[6]

  • 默认q接上wifi时看q接信息? 一般只会有U色DNS地址或者根本不昄
  • 只有在第一ơ访问网l? 例如打开览器进入Q意网站时, 才会昄上面的几条信?
  • 如果只有DNS没有IP地址和子|掩? 一般是光猫没有打开ipv6的DHCP, 没有分配IP
  • q有一U测试ipv6 DHCP是否正常工作的方? 关闭NAT64时可以上|? 但打开NAT64无法上网

转蝲h?http://www.shnenglu.com/sunicdavy战魂筑

Unity3D的Socket适配

WWWcLw已l支持了IPV6, 无需处理, q里讲解使用C#原生Socket的处?

  • 试用的讑֤的iOS版本必须?.3以上?
  • Socket构造时, AddressFamily 讄为InterNetworkV6时只支持ipv6|络, 传入InterNetwork时只支持ipv4|络
  • 4.7.2?.4.3的当前版本在mono层ƈ未支持ipv6代码适配的核心函数getaddrinfo, 因此需要通过oc层做转换, 以下是代?br>q段代码getaddrinfo的地址转换成一个完整字W串, 格式?
    ipv4|ipv4地址|ipv6|ipv6地址|

P.S. copyStrq种用法参考了http://www.codeinsect.net/blog/2016/05/26/unity-ipv6-socket-%E6%94%AF%E6%8C%81%EF%BC%8C%E5%B7%B2%E6%B5%8B%E8%AF%95%E9%80%9A%E8%BF%87/
会造成内存泄露, 如果有更好的ҎƢ迎反馈

转蝲h?http://www.shnenglu.com/sunicdavy战魂筑

iosaddrinfo.mm

   1:  #include <sys/socket.h>
   2:  #include <netdb.h>
   3:  #include <arpa/inet.h>
   4:  #include <err.h>
   5:  #define OUTSTR_SIZE 4096
   6:  extern "C"
   7:  {
   8:      const char* copyStr( const char* str )
   9:      {
  10:          char* s = (char*)malloc(strlen(str) + 1);
  11:          strcpy(s, str);
  12:          return s;
  13:      }
  14:      const char* IOSGetAddressInfo(const char *host )
  15:      {
  16:          if( NULL == host )
  17:              return copyStr("ERROR_HOSTNULL");
  18:          char outstr[OUTSTR_SIZE];
  19:          struct addrinfo hints, *res, *res0;
  20:          memset(&hints, 0, sizeof(hints));
  21:          hints.ai_family = PF_UNSPEC;
  22:          hints.ai_socktype = SOCK_STREAM;
  23:          hints.ai_flags = AI_DEFAULT;
  24:          printf("getaddrinfo: %s\n", host);
  25:          int error = getaddrinfo(host, "http", &hints, &res0);
  26:          if (error != 0 )
  27:          {
  28:              printf("getaddrinfo: %s\n", gai_strerror(error));
  29:              return copyStr("ERROR_GETADDR");
  30:          }
  31:          memset( outstr, 0, sizeof(char)*OUTSTR_SIZE );
  32:          struct sockaddr_in6* addr6;
  33:          struct sockaddr_in* addr;
  34:          const char* solvedaddr;
  35:          char ipbuf[32];
  36:          for (res = res0; res; res = res->ai_next)
  37:          {
  38:              if (res->ai_family == AF_INET6)
  39:              {
  40:                  addr6 =( struct sockaddr_in6*)res->ai_addr;
  41:                  solvedaddr = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));
  42:                  strcat ( outstr, "ipv6|");
  43:                  strcat ( outstr, solvedaddr);
  44:              }
  45:              else
  46:              {
  47:                  addr =( struct sockaddr_in*)res->ai_addr;
  48:                  solvedaddr = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));
  49:                  strcat ( outstr, "ipv4|");
  50:                  strcat ( outstr, solvedaddr);
  51:              }
  52:              strcat ( outstr, "|");
  53:          }
  54:          return copyStr(outstr);
  55:      }
  56:  }
转蝲h?http://www.shnenglu.com/sunicdavy战魂筑

iosaddrinfo.h

   1:  #pragma once
   2:  extern "C"{
   3:      const char* IOSGetAddressInfo(const char *host );
   4:  }
  • C#层的处理假设多个地址中都是统一的地址cd,要么全是v4要么全是v6
    q回l定的host内多个IP地址, 可以供处理复杂的北网?南电信问?/li>

   1:  using System;
   2:  using System.Net;
   3:  using System.Net.Sockets;
   4:  using System.Runtime.InteropServices;
   5:  using UnityEngine;
   6:  using System.Collections;
   7:  using System.Collections.Generic;
   8:  public class IOSIPV6
   9:  {
  10:      [DllImport("__Internal")]
  11:      private static extern string IOSGetAddressInfo(string host );  
  12:      public static IPAddress[] ResolveIOSAddress(string host, out AddressFamily af)
  13:      {
  14:          af = AddressFamily.InterNetwork;
  15:          var outstr = IOSGetAddressInfo(host);
  16:          Debug.Log("IOSGetAddressInfo: " + outstr);
  17:          if (outstr.StartsWith ("ERROR")) 
  18:          {
  19:              return null;
  20:          }
  21:          var addressliststr = outstr.Split('|');
  22:          var addrlist = new List<IPAddress>();
  23:          foreach (string s in addressliststr)
  24:          {
  25:              if (String.IsNullOrEmpty(s.Trim()))
  26:                  continue;
  27:              switch( s )
  28:              {
  29:                  case "ipv6":
  30:                      {                        
  31:                          af = AddressFamily.InterNetworkV6;
  32:                      }
  33:                      break;
  34:                  case "ipv4":
  35:                      {
  36:                          af = AddressFamily.InterNetwork;
  37:                      }
  38:                      break;
  39:                  default:
  40:                      {
  41:                          addrlist.Add(IPAddress.Parse(s));
  42:                      }
  43:                      break;
  44:              }
  45:          }
  46:          return addrlist.ToArray();
  47:      }
  48:  }
转蝲h?http://www.shnenglu.com/sunicdavy战魂筑

参考链?/h3>

官方文档
https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

某h的解x?br>http://www.codeinsect.net/blog/2016/05/26/unity-ipv6-socket-%E6%94%AF%E6%8C%81%EF%BC%8C%E5%B7%B2%E6%B5%8B%E8%AF%95%E9%80%9A%E8%BF%87/
注意, 此方案中的方法可? 但是地址q不能解军_北互通的问题

战魂筑 2016-06-16 14:18 发表评论
]]>资源理模式之Unity3D的Prefab与电子表?/title><link>http://www.shnenglu.com/sunicdavy/archive/2016/03/24/213107.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Thu, 24 Mar 2016 08:33:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2016/03/24/213107.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/213107.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2016/03/24/213107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/213107.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/213107.html</trackback:ping><description><![CDATA[<p>最q在目中进行资源优? 我们的项目一直以来都是以传统的电子表格配|ؓ中心的资源驱动加载方? 拿角色携带的Ҏ要播攑և来这个case来具体点说就?</p> <p>1. 技能部分的Ҏ可以遍历动作表播攄所有特效id, 提前预蝲</p> <p>2. buffcȝ效是动态确定的,无法分析. 需要通过角色表添加资源id在加载角色时加蝲Ҏ</p> <p>q种做法的缺?</p> <p>当角色特效效果调整时, 术和策划需要调整特效id? 多出来不用的Ҏ也加载是感觉不出来的, 分析也是很困隄</p> <p>所以这U以传统的电子表格配|ؓ中心的方式在Unity3D? 内存, 包优化会是个大问?</p> <p> </p> <p>那么, 什么是Unity3D的开发核心思想? </p> <p>除了lg思想? 是Prefab, 贯彻整个~辑器及引擎自始至终</p> <p> </p> <p>处理角色携带Ҏ加蝲后播攄q个case, 用PrefabZ心的资源理来做的话, 大概是q样:</p> <p>1. E序~写一个角色特效列表脚? 把List暴露出来可以在编辑器里?/p> <p>2. 术在做技能时, 把要用到的特效拖拽到List?/p> <p>3. Ҏ无需再编制全局ID~码</p> <p>4. {划Ҏq个角色挂接的特效烦? 在配|表里添加播放指?/p> <p>q样做的优点:</p> <p>角色引用到的资源才会被打到最l游戏包? 不用的资源是不会被加蝲?/p> <p> </p> <p>cM? 在UIҎ? 也应该是要播放的特效挂接到对象? 而不是动态通过代码d?/p> <p>在Unity3D? Prefab图?Shader, Ҏ, 脚本{一切^{看? 只要有引? 一ơ性加? </p> <p>同时, 也可以通过静态工具分析Prefab. </p> <p>如果是通过代码加蝲的效? 则只能让E序员做优化, q种q程无法让Unity3D官方后期提供的工兯行优?/p> <p> </p> <p>所? 推荐使用PrefabZ心的资源理模式</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/213107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2016-03-24 16:33 <a href="http://www.shnenglu.com/sunicdavy/archive/2016/03/24/213107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google Protobuf 3版本介绍http://www.shnenglu.com/sunicdavy/archive/2016/01/25/212739.html战魂筑战魂筑Mon, 25 Jan 2016 06:23:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2016/01/25/212739.htmlhttp://www.shnenglu.com/sunicdavy/comments/212739.htmlhttp://www.shnenglu.com/sunicdavy/archive/2016/01/25/212739.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/212739.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/212739.html本文~写? Google 官方?protobuf 版本?.0.0beta

下面介绍下proto3的一些细节变?/p>

Proto3的语法变?/h1>

语法标记

q个版本的protoc的protobuf~译器已l可以支持proto2语法和proto3的语?/p>

如果你的proto文g没有dsyntax说明的话, 用这个版本的~译器会报错, 提示你默认proto2支持, h加语法标?/p>

syntax = "proto2";

 

optional不需要了

只保留repeated标记数组cd, optional和required都被L?/p>

实际使用证明, required的设计确实是蛋疼, C++的调试版会弹出assert,release版和optional也没啥区?/p>

map支持

map~写格式?/p>

map<key_type, value_type> map_field = N;
例如:
map<string, Project> projects = 3;
代码生成认支持map, q对于很多语a来说又可以偷懒了

字段default标记不能使用?/h2>

位于proto2语法的字Dnumber后的[default=XX]

q个东西不能用了, 理由?

对于同一D序列化后的数据, 如果序列化端的default和反序列化端的default描述不一样会D最l结果完全不一?/p>

? 同一个数据两个结? q是不可预测的结? 因此q掉q个Ҏ?/p>

不过本h觉得, 对于游戏来说, q个功能本n可以压羃很多数据,虽然会有隐患

 

枚D默认g定是0

proto2里的默认值是枚D的第一个value对应的? 不一定ؓ0

proto3在你定义value? 强制要求W一个值必Mؓ0

q个修改为避免隐患还是有帮助?/p>

泛型描述支持

anycd, 可以代表Mcd, 可以先读q来, 再进行解? 没具体用, 步子跨大了怕扯到蛋

支持json序列?/h2>

q个极好, json再次被同化了

增加了多U语a支持

js, objc, ruby, C#{等

然? C#版本的基runtime库是用C# 6.0的语法写?q对于Unity mono传2.0来说, 实扯到蛋了,没法?/p>

Protobuf现在使用CMAKE做配|系l?/h2>

~译hE微ȝ, q要下个被墙掉的cmake?/p>

 

 

W三方库里对于proto3的变?/h1>

Golang的官方protobuf支持: https://github.com/golang/protobuf

生成代码中的l构体字D늱型变?/h2>

对于proto2的文? 生成的go代码中的l构体依然用类型指针作为默认存? 兼容老的pȝ

对于proto3的文? 生成的go代码中的l构体直接用字D作为默认存? 不再使用GetXXX来作为字DD? 赋值时也无需使用proto.cd() 函数q行指针cd字段值创?

q个调整很是方便, 但丢׃optional判断功能, 对应C++里就是hasXXX的功? 不过好歹q个逻辑现在用的不多?/p>

q个修改大概也是配合json序列化来做的, go默认的json序列化时, 无法使用proto2生成的结构体? 因ؓ都是指针,无法赋?.

 

新版protoc-gen-go的插件会生成descriptor的压~数?/h2>

新插件会l每ơ生成的文gdq样一D代?/p>

var fileDescriptor0 = []byte{
    // 220 bytes of a gzipped FileDescriptorProto
    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x64, 0x8f, 0xcd, 0x4e, 0xc5, 0x20,
    0x10, 0x85, 0x53, 0xbd, 0x35, 0x32, 0xb7, 0xdd, 0x4c, 0x5c, 0xb0, 0x70, 0x71, 0xd3, 0xb8, 0x70,
    0x75, 0x17, 0xfa, 0x04, 0xc6, 0xd8, 0xb8, 0x50, 0x63, 0xa8, 0x2f, 0x80, 0xed, 0x44, 0x89, 0x28,
    0x04, 0xc6, 0xbf, 0x47, 0xf1, 0x6d, 0x95, 0x49, 0x8d, 0x4d, 0x5c, 0x01, 0xdf, 0x39, 0x7c, 0x30,
    0x00, 0x1c, 0x82, 0xdf, 0xc6, 0x14, 0x38, 0xe0, 0xaa, 0xec, 0xbb, 0x37, 0x68, 0x2e, 0x3e, 0x62,
    0x48, 0x7c, 0x49, 0x76, 0xa2, 0x84, 0x47, 0xd0, 0xde, 0x96, 0xf8, 0xee, 0x33, 0xd2, 0x8d, 0x7d,
    0x26, 0x5d, 0x6d, 0xaa, 0x63, 0x65, 0xda, 0xb8, 0x84, 0xd8, 0x41, 0x63, 0xc2, 0x7b, 0xef, 0xc8,
    0x4f, 0x52, 0xda, 0x91, 0x52, 0x93, 0x16, 0x0c, 0x0f, 0x41, 0x89, 0xa9, 0x77, 0x9e, 0xf4, 0xae,
    0x14, 0x54, 0xfc, 0x05, 0xdd, 0x57, 0x05, 0x4a, 0xba, 0xd7, 0xc4, 0x16, 0xb7, 0x80, 0x03, 0x27,
    0xf7, 0xf2, 0x70, 0x72, 0xe5, 0x32, 0x0f, 0xd1, 0x3b, 0xa6, 0x34, 0x5b, 0x31, 0xff, 0x4b, 0x70,
    0x03, 0x6b, 0x43, 0x91, 0x2c, 0x9f, 0x3f, 0xd2, 0xf8, 0x24, 0xf6, 0x7d, 0xb3, 0x4e, 0x7f, 0x08,
    0x0f, 0xa0, 0x3e, 0xf3, 0xce, 0x66, 0xbd, 0x12, 0x49, 0x6d, 0xcb, 0xa1, 0x4c, 0x37, 0xbf, 0xf3,
    0xb3, 0xbc, 0x8e, 0xac, 0x6b, 0xb9, 0xd9, 0xe6, 0x25, 0xbc, 0xdf, 0x93, 0x6f, 0x9e, 0x7e, 0x07,
    0x00, 0x00, 0xff, 0xff, 0x0c, 0x9f, 0x10, 0xa8, 0x2e, 0x01, 0x00, 0x00,
}

对于meta信息的提取还是很方便?/p>

然?/p>

对于多个文g的生? q样做非常的ȝ, 因ؓq个字段会重复导致编译错?/p>

很多人在论坛里吐? 官方l出的解x法是, 使用protoc一ơ性传入一个package下的所有的proto直接生成一个go

而不是现在的一个proto一个go

生成代码会自动注册到全局, q可以方便的查询

以前q个代码需要自己来? 现在官方提供了支? 很是方便

然? Z么不支持遍历?D念? 又要自己动手?/p>

战魂筑 2016-01-25 14:23 发表评论
]]>
pp助手服务器端支付的RSA的奇葩公钥解密设?/title><link>http://www.shnenglu.com/sunicdavy/archive/2015/10/12/211993.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Mon, 12 Oct 2015 06:27:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2015/10/12/211993.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/211993.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2015/10/12/211993.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/211993.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/211993.html</trackback:ping><description><![CDATA[<p>最q接入pp助手的服务器端支? 按照PP官方提供的文档来? 需要服务器做RSA的验? </p> <p>首先我们来看?/p> <h1>RSA的几个标准用?/h1> <h2>非对U加密解?/h2> <p>假设A要把内容传输lB</p> <p>1. B生成RSA的公钥和密钥, q是成对出现? 密钥由B保存, 把公钥告诉A</p> <p>2. A用B的公钥加密内? q把密文内容传输lB</p> <p>3. B用密钥解?/p> <h2>验证</h2> <p>证明某个内容是你发的, 而不是被别h冒名替, 例如git的push中就带有q个功能</p> <p>假设A有内?  B要验证内容确实由A发出</p> <p>1. A生成公钥和密?/p> <p>2. A内容做一个hash, 把hash码用自己的密钥加密ƈ把这D密文发lB</p> <p>3. B用A的公钥对密文q行验证, 卛_认密文是否由A发出</p> <p> </p> <p>可以看出, 两种用法都是典型的非对称用法</p> <p>但PP助手却干了g奇的事?</p> <h1>非对U当对称法加解?/h1> <p>在PP SDK官方文档? 我们扑ֈ了PHP语言的验证方? Ҏ里用了q样一个API</p> <p><a >openssl_public_decrypt</a></p> <p>从官Ҏ档看得出q个使用openssl的算法库</p> <p> </p> <p>cM? q有Java, C++, Python语言的处理方?/p> <p>其中, C++也是用的openssl, Python则是需要预~译C库,在Ubuntu下需要手工patch M2Crypto的_ssl.c文g.</p> <p> </p> <p>先不说这些非正规的编?patchҎ会造成多大的问? 单就q个用公钥解密就很蛋?/p> <p>从之前的RSA法中了? 只有对公钥进行验证的Ҏ, 也就是只能得到是q是不是的结? 但PP的SDK则要求必ȝ公钥解密?/p> <p>解出的数据ؓ一Djson, 以对比是否有订单改.</p> <p> </p> <p>那么q种做法q效于, 用最单的异或+一个公钥进行订单加? 然后同样用这个公钥进行解?/p> <p>只不q用RSA感觉很高U?/p> <p>q种做法一旦公钥在PP助手服务器或者玩家的开发服务器, 甚至源代码泄? 那么马上有很大的伪造订单的危险</p> <p> </p> <p>我把q个做法发给朋友? 他们? 其实PP助手的开发者只用了RSA, 跟传输不是明文就好了, 至于什么信息安? 都是?</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/211993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2015-10-12 14:27 <a href="http://www.shnenglu.com/sunicdavy/archive/2015/10/12/211993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个诡异的Unity3D的网l问?/title><link>http://www.shnenglu.com/sunicdavy/archive/2015/07/06/211162.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Mon, 06 Jul 2015 08:11:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2015/07/06/211162.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/211162.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2015/07/06/211162.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/211162.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/211162.html</trackback:ping><description><![CDATA[<p>目? 我们使用Unity3D做客L开? 自己怺一套C#|络? 随着目的推q? 问题来了:</p> <h1>问题</h1> <p><strong>每次Unity3D~辑器打开? q接服务器都会有一定几率失? 需要反复关闭再打开~辑?~4ơ后, 才能正常接收到封?/strong></p> <p><font color="#ffffff">转蝲h? 战魂筑</font><a href="http://www.shnenglu.com/sunicdavy"><font color="#ffffff">http://www.shnenglu.com/sunicdavy</font></a></p> <h1><strong>探烦</strong></h1> <p>我们的网l库ZC#的Begin/Endpȝ异步Socket, q种socket更接qC++的asio模型, 撸v来特?</p> <p>1. Ҏl验, q个诡异问题多半跟多U程有关p? 复查代码, 无效. </p> <p>2. 扑֏人更换网l库, 换阻塞Socket实现和SocketAsyncEventArgsq种实现都试q? 仍然无法解决问题.</p> <p>3. 接下来还是对Begin/Endpȝ|络库进行日志追t? 发现, 发送会L成功, q接成功和接收封包有一定几率会断掉</p> <p>我们q没有单独开U程来处? 而是利用底层异步通知, 然后有线E安全队列切换到ȝE进行投? 因此底层的线E正常性是整个问题的焦?/p> <p>׃一直无法找到原? q个问题搁置?/p> <p><font color="#ffffff">转蝲h? 战魂筑</font><a href="http://www.shnenglu.com/sunicdavy"><font color="#ffffff">http://www.shnenglu.com/sunicdavy</font></a></p> <h1>解决Ҏ</h1> <p>直到有一个偶然的Z, 取过同事代码? H然发现W一ơ打开Unity3D~辑器可以直接登? 但之后又不行. 同事提醒, 会不会是优先度问? </p> <p>马上打开Edit->Project Settings->Script Execution Orders. <strong>提高了网l组Z先度</strong></p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/Unity3D_DF1C/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/Unity3D_DF1C/image_thumb.png" width="394" height="267"></a></p> <p>试, 通过, 问题解决</p> <p><font color="#ffffff">转蝲h? 战魂筑</font><a href="http://www.shnenglu.com/sunicdavy"><font color="#ffffff">http://www.shnenglu.com/sunicdavy</font></a></p> <h1>ȝ</h1> <p><font color="#ffffff">转蝲h? 战魂筑</font><a href="http://www.shnenglu.com/sunicdavy"><font color="#ffffff">http://www.shnenglu.com/sunicdavy</font></a></p> <p>一直怀疑这个问题跟Mono版本q老有关系, 但由?.2版本到年底才更新, 之前只能自己啃bug. </p> <p>在这个问题发生后解决? 我们q有一个相兌? 我们网l部分比较稳定的代码拆分攑ֈdll? 通过Unity3D的机制进行加?/p> <p>l果, |络无法初始? 估计也是跟这个问题有关系</p> <p>M, 有类似问题时, 可以试用脚本执行序大法q行试</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/211162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2015-07-06 16:11 <a href="http://www.shnenglu.com/sunicdavy/archive/2015/07/06/211162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏数据库选型mysql,mongo, redis, memcachedhttp://www.shnenglu.com/sunicdavy/archive/2015/06/19/210992.html战魂筑战魂筑Fri, 19 Jun 2015 08:23:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2015/06/19/210992.htmlhttp://www.shnenglu.com/sunicdavy/comments/210992.htmlhttp://www.shnenglu.com/sunicdavy/archive/2015/06/19/210992.html#Feedback5http://www.shnenglu.com/sunicdavy/comments/commentRss/210992.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/210992.html数据库选择历程

我们的项目一直用MySQL作ؓ数据? 无论是从C++的服务器, q是到Golang服务? 当年搞服务器? 看大部分人都是用SQL(MySQL/SQLServer), 而Mongo感觉像邪教一? 再加上服务器q是Linux比较正统, 所以果断选了MySQL.

刚开始感?游戏服务器的数据存储其实应该是蛮圣的过E? 那么多的数据, 需要按照MySQL一样分? 分字D存? Z查询, q要乖乖的学一下SQL的语?/p>

p么折腾了几年. 在云DB的蒙蔽下, 一直认为MySQL是做游戏服务器存储的专业技? 分布式和存储压力一定交l云DB来做. 直到真正试了下NoSQL在游戏服务器开发里的思\.

用了Golang, 才发现同步写逻辑是多么的优雅.

用了NoSQLpd的数据库, 才意识到: 游戏服务器的数据存储和游戏服务器的存盘两个概念差异其实蛮大的.

MySQL? 背包其实跟角色完全没有关p? 只是通过1个角色id映射q去, Zؓ的割裂了数据的关联? q硬生生的整Z概念叫结构化查询让你?/p>

NoSQL? 只是把数据库当成是存储点, 每个角色的数据是完整的一? 里面怎么存随你便. 每个角色通过id来查? 其他都没有了

于是? 游戏开发变得异常简? MySQL角色q门查询4~5ơ才能搞定要的数?而NoSQL一口气全查出来, 存盘也无需增量, 直接存盘可以了

所以现在觉? NoSQL的思\对于游戏服务器存储来说简直是完美?

转蝲h? 战魂筑http://www.shnenglu.com/sunicdavy

 

NoSQL数据库方案对?/h1>

NoSQL下实现方案很? 游戏常用的就q么3? mongo, redis, memcached

下面说下优缺?/p>

mongo

盘映射内存数据?/p>

value为documentcd, ZBSON的value序列?/p>

应用场景:

适合多写读, 例如日志和备?/p>

转蝲h? 战魂筑http://www.shnenglu.com/sunicdavy

 

redis

内存数据?/p>

单核

value限制512M

多种valuecd, 游戏用途用私有的序列化协?例如protobuf)

支持落地(bgsave)

用户: 新浪, 淘宝, Flickr, Github

应用场景: 适合d都很? 数据处理复杂{?/p>

转蝲h? 战魂筑http://www.shnenglu.com/sunicdavy

 

memcached

内存数据?/p>

多核

value限制1M

不支持落?持久?

用户: LiveJournal、hatena、Facebook、Vox

应用场景: 动态系l中的缓? 适合多读写

转蝲h? 战魂筑http://www.shnenglu.com/sunicdavy

个h评h

memcached 适合|页~冲, 游戏里很有使用. 目前只有腾讯云支持云memcached

redis非常适合游戏的内存数据库, 但是落地{略会比较复? 需要具体分? 可以参考后面的链接看下云风怎么处理q个问题

mongo数据库在早期q是非常不错的NoSQL的数据库. 工具比较方便, 可视? 但是随着q年来游戏的q发度越来越? 所以ؓ了一ơ到? 很多是选择了redis

下图参考自知乎问题. 链接在后面有提示, 若R权请联系删除

转蝲h? 战魂筑http://www.shnenglu.com/sunicdavy

image

参考链?

    谈谈陌陌争霸在数据库斚wt过的坑( Redis ?

http://blog.codingnow.com/2014/03/mmzb_redis.html

转蝲h? 战魂筑http://www.shnenglu.com/sunicdavy

Memcache,Redis,MongoDBQ数据缓存系l)ҎҎ与分?/p>

http://blog.csdn.net/suifeng3051/article/details/23739295

 

http://www.zhihu.com/question/31417262



战魂筑 2015-06-19 16:23 发表评论
]]>
C/C++服务器架构机制设计ȝhttp://www.shnenglu.com/sunicdavy/archive/2014/12/18/209225.html战魂筑战魂筑Thu, 18 Dec 2014 08:39:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2014/12/18/209225.htmlhttp://www.shnenglu.com/sunicdavy/comments/209225.htmlhttp://www.shnenglu.com/sunicdavy/archive/2014/12/18/209225.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/209225.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/209225.htmlq期在写Zgo的游戏服务器框架, 在全面脱C/C++? 需要对老架构进行一个ȝ

ZC/C++游戏服务器框架M设计的还是不错的, 兄弟们M使用效果都是好评. 因ؓ在技术上喜欢"h", 所以在很多设计? 都是力求? 高效(开发效?.

Zd的异步DB查询pȝ, 带多重异步的同步

代码CZ:

   1:   
   2:  void BatchQueryPlayerInfo( uint32 ClientID, const std::string& AccountName, int64 CharID )
   3:  {
   4:      GDBExecutor->Commit
   5:          (    
   6:          dynamic_cast<DBDataTask*>( (new DBQueryCharInfo(  ClientID, CharID ) ) 
   7:          ->LinkAtomTask( new DBQueryQuest( ClientID, CharID ) )
   8:          ->LinkAtomTask( new DBQuerySkill( ClientID, CharID ) )
   9:          ->LinkAtomTask( new DBQueryHero( ClientID, CharID ) )
  10:          ->LinkAtomTask( new DBQueryAccountInfo( ClientID, AccountName ) )
  11:          ->LinkAtomTask( new DBQueryEquip( ClientID, CharID ) )
  12:          ->LinkAtomTask( new DBQueryObject( ClientID ,CharID ) )
  13:          ->LinkAtomTask( new DBQueryLevel(ClientID, CharID))
  14:          ->LinkAtomTask( new DBQueryChapter(ClientID, CharID))
  15:          ->LinkAtomTask( new DBQueryActivity( ClientID, CharID ))
  16:          )
  17:          );
  18:   
  19:  }

q段主要处理玩家在登陆时, 需要从DB查询大量的不同分cȝ数据. Z保证效率, 我让每个Taskq行执行, 然后通过一个机? 让所有Q务完成后, 回调W一个Q务的一个函? q样无需手动实现很多_合代码, 避免了反复调试和错误

Zprotobuf反射机制的语句自动合?/strong>

   1:  DBUpdateCharInfo::DBUpdateCharInfo( int64 CharID, const std::string& Buffer )
   2:  {
   3:      char buffer[256];
   4:   
   5:      sprintf( buffer, "update tb_char set $FIELD$ where charid = %lld;", CharID );
   6:          
   7:      ExecuteCommand( buffer, Buffer, dbopr::FET_Equation );
   8:  }

q段是一个典型的DBd, 构造函数提供了CharID和一个由l构体序列化好的buffer, $FIELD$字段, 是通过反射ҎBuffer内容, 自动填充字段

q段例子? $FIELD$可以填充?hp=100, mp=100之类? 自动填充避免了因为添加字D늚到处d代码, q需要调? Ҏ搞错

 

配置pȝ概念

Z同一个配|系l? 分层实现不同的需? 更简单的? 解决?个实际问题是:

自己改了配置文g中的ip, 上传svn? 覆盖了别人的配置, 很多人的解决Ҏ都是, 本地配置不提? 但同旉题又来了:

当配|中有别人新加的pȝ配置, 怎么保证每个人都能更新到?

上线? 服务器交付运l? 他们会对配置有一定程度的修改, q个时候怎么合ƈE序配置和运l配|?

其实对于冲突的需? 只要对系l进行分层就可以解决问题,我的处理方式:

配置分ؓ:

全局配置: 所有服务的M配置

单服务配|? 本服务的配置, 涉及|络及逻辑

本地配置: q个配置每个Z? 不上传SVN

命o行配|? 格式和前面的一? q块可以通过q维q行配置

Ml构其实是OO的派生概? 下层可以覆盖, 修改上层的配|?/p>

 

服务器互联及识别框架

基本功能: Z一些简单的配置可以将多台服务? 同种cȝ不同服务器互相连接v? 断线自动重连.

服务器连接后, 所有服务器可知晓ƈ可自动按需q接

逻辑端也很方便的q行q播或者单独发送等

也就是说, 每个服务器的q接和接受端都是带识别名U或id?

后面觉得q套东西实在是做的复? 多整ZC心服务器来做. 但好Ҏ架稳定下来了, 也就好了.

 

Zlua的服务器web后台框架

思想是很不错?  C++ 配合lua本nl对是个p|

问题出在web处理,本n都是一个同步阻塞过E? 而这个后台框架是异步方式来做, 所以特别别?/p>

不过比v以前的本地GMpȝ, q块的设计是伟大的进?/p>

 

现在正在设计Zgolang的服务器框架, 基本框架已经完工, {待~写逻辑后的实战试

以上的很多思想在golang的服务器框架都有改进, 特别是golang本n做web也是优秀? 外加martiniq种牛X框架, 更是水到渠成

如果你对服务器框架设计有特别的认? 或者想撞思想, 可以加博客群 309800774或者我的qq: 20998333讨论



战魂筑 2014-12-18 16:39 发表评论
]]>
自定义TexturePacker插g导出自己的plist文ghttp://www.shnenglu.com/sunicdavy/archive/2014/02/06/205645.html战魂筑战魂筑Thu, 06 Feb 2014 07:23:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2014/02/06/205645.htmlhttp://www.shnenglu.com/sunicdavy/comments/205645.htmlhttp://www.shnenglu.com/sunicdavy/archive/2014/02/06/205645.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/205645.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/205645.htmlcocos2dx引擎使用plist文g, 一U特D的xml格式作ؓ其atlasU理的描q文? plist遵@Ҏ的xml中key-value的设计风?对于OC来说是合适的, 但xml本n性能低下, 垃圾内容q多, 也让plist对于高性能游戏引擎不再适合. 因此, 研究TexturePacker的导出插件技?/p>

TexturePacker的自定义插g目录位于其安装目录的bin\exporters\? 但有一些插件属于内建支? 例如cocos2dx的plist格式, 因此无法扑ֈ对应插g

本h参考shiva3d插g, 对应导出界面的DataFormat中的Shiva3D, 快速学会了如何导出

官方文档位于http://www.codeandweb.com/texturepacker/documentation/#customization

插g的基本格式及原理?

bin\exporters\下的某一目录下存在的一个名为exporter.xml文g作ؓ插g的描q?例如:

<exporter version="1.0">
    <!-- identifier of the exporter -->
    <name>shiva3d</name>
 
    <!-- display name of the exporter for the combo box -->
    <displayName>Shiva3D</displayName>
    
    <!-- description of the exporter -->
    <description>Exporter for Shiva3D.</description>
 
    <!-- exporter version -->
    <version>1.0</version>
    
    <!-- currently only one file allowed - more to come with update -->
    <files>
        <file>
            <!-- name of this file variable -->
            <name>xml</name>
 
            <!-- human readable name (for GUI) -->
            <displayName>XML</displayName>
 
            <!-- file extension for the file -->
            <fileExtension>xml</fileExtension>
 
            <!-- name of the template file -->
            <template>shiva.xml</template>
        </file>
    </files>
 
    <!-- target framework supports trimming -->
    <supportsTrimming>false</supportsTrimming>
 
    <!-- target framework supports rotated sprites -->
    <supportsRotation>true</supportsRotation>
 
    <!-- rotated sprites direction (cw/ccw) -->
    <rotationDirection>cw</rotationDirection>
 
    <!-- supports npot sizes -->
    <supportsNPOT>true</supportsNPOT>
 
    <!-- supports file name stripping (remove .png etc) -->
    <supportsTrimSpriteNames>yes</supportsTrimSpriteNames>
 
    <!-- supports texure subpath -->
    <supportsTextureSubPath>yes</supportsTextureSubPath>
 
</exporter>
 
 

 

在Template字段? 描述同目录的导出文g格式模板. TexturePacker使用一U叫Grantlee的模板引?cM于Python使用的Django模板引擎, 文档参见:Grantlee Documentation. 单的文本格式可以参考shiva.xml快速学?/p>

q里我们使用protobuf的文本格?极ؓcMjson)导出plist, 下面是导出模?/p>

 

{% for sprite in allSprites %}
Sprite {
    Name: "{{sprite.trimmedName}}"
    FrameX: {{sprite.frameRect.x}}
    FrameY: {{sprite.frameRect.y}}
    FrameWidth: {{sprite.frameRectWithoutRotation.width}}
    FrameHeight: {{sprite.frameRectWithoutRotation.height}}
    OffsetX: {{sprite.cornerOffset.x}}
    OffsetY: {{sprite.cornerOffset.y}}
    OriginalWidth: {{sprite.untrimmedSize.width}}
    OriginalHeight: {{sprite.untrimmedSize.height}}
    {% if sprite.rotated %}Rotated: true {% endif %}
}
{% endfor %}

导出的结果类g:

 
Sprite {
    Name: "car01"
    FrameX: 100
    FrameY: 129
    FrameWidth: 76
    FrameHeight: 47
    OffsetX: 0
    OffsetY: 0
    OriginalWidth: 76
    OriginalHeight: 47
    Rotated: true 
}
 
Sprite {
    Name: "car02"
    FrameX: 100
    FrameY: 51
    FrameWidth: 76
    FrameHeight: 47
    OffsetX: 0
    OffsetY: 0
    OriginalWidth: 76
    OriginalHeight: 47
    Rotated: true 
}

...

导出插gq支持js扩展, 具体内容Ll参考官Ҏ? 但对于简单的文本格式, q种方式已经_?/p>

Ҏplist? 发现plist中的垃圾信息极ؓ? 而且作ؓspriteframe的name居然带有扩展?..  因此qplist,~写自己的导出插件才是王?



战魂筑 2014-02-06 15:23 发表评论
]]>
使用HG(Mercurial)做分布式代码理的一些经?/title><link>http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 25 Oct 2013 14:51:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/203915.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/203915.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/203915.html</trackback:ping><description><![CDATA[<p>距离W一ơ用HG已经?,3q了?从第一ơ将HG用于自己的项目, 用U盘同步代? 到现在将HG应用于linux, 版本差异发布, 目内部多h的分布式开发,已经感觉非常熟练?/p> <p>我们的项目的客户端和服务器均由C++开发,׃HG设计的理忉|1个工E对?个库Q?因此我们的客L和服务器是分开的两个HG代码库。这U思想和SVN理的代码有很大不同。SVN时代的游戏工E大多是q样安排目录的:</p> <p>common <-客户端和服务器共享的?/p> <p>client<-客户端的代码</p> <p>server<-服务器的代码</p> <p>通过SVN强大的权限控制给不同的前后端赋予权限Q前后端E序获得不同的目录l合。SVN下的q种工程l织Ҏ能很好的解决单一语言跨工E的代码Q协议共享问题。虽然现在各UErlangQJava的服务器语言与as3,lua的不同客L脚本语言h的时代已l无所谓这U老式设计思想。但是对于我们纯C++的手游来_q是必须面对分布式代码管理工具下的代码跨库共享问题?/p> <p>我就q个问题与多q前被我推荐qHG的朋友讨v来,他们也存在我们这个问题,但是他们的解x法就是每个工E一个库。然后被我问刎ͼ“同步一ơ代码,一ơ次的打开不同的库Q他们客L+服务器一??个HG代码库)Q进行同步, 完成后, q要反向pullQ不累啊Q”, 朋友回答Q“习惯就好?/p> <p>随后Q我也翻查了git对多目的支持。得到的{案也是跟HG一LQ?q类分布式代码管理工hw的设计理念只有账号Q而无权限Q?本n是Z开源代码精设计的工具Q?如果分了权限Q岂不是q背开源精(q是我想?img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="微笑" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/09a081eb5d4c_13A7F/wlEmoticon-smile_2.png">Q。因此如果想理多个目代码Q?要么多库Q要么合库?/p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/203915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2013-10-25 22:51 <a href="http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google Protocolbuf 文本格式的解?/title><link>http://www.shnenglu.com/sunicdavy/archive/2013/07/09/201643.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Tue, 09 Jul 2013 10:29:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2013/07/09/201643.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/201643.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2013/07/09/201643.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/201643.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/201643.html</trackback:ping><description><![CDATA[<p>protobuf是为懒造的工具, 啥协? 啥配|文? l统定义proto, 解析ok, 非常方便</p> <p> </p> <p>文本格式的解析错误不能用捕获错误来获取, 因此,我们需要用自定义的错误收集器q行攉, 看代?</p> <div id="n1ltjj7" class="csharpcode"><pre class="alt">#include <google/protobuf/text_format.h></pre><pre>#include <google/protobuf/io/zero_copy_stream_impl_lite.h></pre><pre class="alt">#include <google/protobuf/io/tokenizer.h></pre><pre> </pre><pre class="alt"><span id="dbbtjzz" class="kwrd">class</span> PBTextErrorCollector : <span id="ffffffn" class="kwrd">public</span> google::protobuf::io::ErrorCollector</pre><pre>{</pre><pre class="alt"><span id="7zxx9rt" class="kwrd">public</span>:</pre><pre> PBTextErrorCollector( <span id="fzhj19h" class="kwrd">const</span> std::<span id="9jr7btr" class="kwrd">string</span>& FileName )</pre><pre class="alt"> : mFileName( FileName )</pre><pre> {</pre><pre class="alt"> </pre><pre> }</pre><pre class="alt"> </pre><pre> <span id="9f93dvd" class="kwrd">virtual</span> <span id="7bdbtrj" class="kwrd">void</span> AddError(<span id="99x9djt" class="kwrd">int</span> line, <span id="fnxff3p" class="kwrd">int</span> column, <span id="f33pxv9" class="kwrd">const</span> <span id="7tltlvb" class="kwrd">string</span>& message)</pre><pre class="alt"> {</pre><pre> CCLog(<span id="vn7xffl" class="str">"%s(%d:%d) %s "</span>, mFileName.c_str(), line, column, message.c_str() );</pre><pre class="alt"> }</pre><pre> </pre><pre class="alt"> <span id="9pxhzp7" class="kwrd">virtual</span> <span id="9p97phz" class="kwrd">void</span> AddWarning(<span id="lfn1fd9" class="kwrd">int</span> line, <span id="vhpppz3" class="kwrd">int</span> column, <span id="hhpn1tv" class="kwrd">const</span> <span id="vhp3b9x" class="kwrd">string</span>& message) </pre><pre> {</pre><pre class="alt"> CCLog(<span id="nzbbb1z" class="str">"%s(%d:%d) %s "</span>, mFileName.c_str(), line, column, message.c_str() );</pre><pre> }</pre><pre class="alt"> </pre><pre><span id="1vvldtv" class="kwrd">private</span>:</pre><pre class="alt"> std::<span id="7lvltt9" class="kwrd">string</span> mFileName;</pre><pre>};</pre><pre class="alt"> </pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p>解析代码</p> <div id="77p3hbz" class="csharpcode"><pre class="alt">google::protobuf::TextFormat::Parser P; </pre><pre> P.RecordErrorsTo( &PEC );</pre><pre class="alt"> P.Parse( &AIS, &AF );</pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p> </p> <p>另外: 文本格式的注释用unix shell风格: ?开?/p> <p>下面是我的文本格式的配置文g</p> <p> </p><pre class="csharpcode">AnchorPointX: 0.5 AnchorPointY: 0 SpriteScale: 2 ComponentName: <span id="jt9111d" class="str">"ActorActionManager"</span> ComponentName: <span id="fx9fnln" class="str">"ActorFrameEventDispatcher"</span> <span id="bdl7rp7" class="rem">#ComponentName: "SoundFXController"</span> ComponentName: <span id="z7d7dv9" class="str">"RoleDeltaMoveController"</span> ComponentName: <span id="rrjhhxz" class="str">"RoleBehaviorDirector"</span> InitAction: AA_Idle Animations { AnimationName: <span id="htt99ln" class="str">"mai_idle"</span> AnimationInterval: 0.067 } </pre> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style><img src ="http://www.shnenglu.com/sunicdavy/aggbug/201643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2013-07-09 18:29 <a href="http://www.shnenglu.com/sunicdavy/archive/2013/07/09/201643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]高效E序员的四十五个习惯http://www.shnenglu.com/sunicdavy/archive/2012/04/03/169958.html战魂筑战魂筑Tue, 03 Apr 2012 13:40:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2012/04/03/169958.htmlhttp://www.shnenglu.com/sunicdavy/comments/169958.htmlhttp://www.shnenglu.com/sunicdavy/archive/2012/04/03/169958.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/169958.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/169958.html用作团队~码标准很不?/p>

 

态度?br>1. 做实?br>不要抱怨,发牢骚,指责他hQ找出问题所在,惛_法解冟뀂对问题和错误,要勇于承担?br>2. Ʋ速则不达
用小聪明、权宜之计解决问题,求快而不代码质量,会给目留下要命的死角?br>3. 对事不对?br>׃ZQ明智、真诚、虚心地讨论问题Q提出创新方案?br>4. 排除万难Q奋勇前q?br>勇气往往是克服困隄唯一Ҏ?br>学习?br>5. 跟踪变化
新技术层ZIƈ不可怕。坚持学习新技术,MQ读技术杂志,参加技术活动,与h交流。要多理解新词背后的所以然Q把握技术大势Q将新技术用于品开发要谨慎?br>6. 对团队投?br>打造学习型团队Q不断提高兄弟们的^均水q?br>7. 懂得丢弃
老的套\和技术,该丢Q就得丢。不要固步自?br>8. 打破砂锅问到?br>不断q问Q真正搞懂问题的本质。ؓ什么?应该成ؓ你的口头?br>9. 把握开发节?br>控制好时_L好习惯,不要加班?/p>

开发流E篇
10. 让客户做军_
让用户在现场Q們֐他们的声韻I对业务最重要的决{应该让他们说了?br>11. 让设计指D不是操U开?br>设计是前q的地图Q它指引的是方向Q而不是目的本w。设计的详略E度应该适当?br>12. 合理C用技?br>Ҏ需要而不是其他因素选择技术。对各种技术方案进行严格地q问Q真诚面对各U问题?br>13. 让应用随旉可以发布
通过善用持箋集成和版本管理,你应该随旉能够~译、运行甚至部|应用?br>14. 提早集成Q频J集?br>集成有风险,要尽早尽量多地集成?br>15. 提早实现自动化部|?br>16. 使用演示获得频繁反馈
17. 使用短P代,增量发布
18. 固定h意味着背叛承诺
估算应该Z实际的工作不断变化?br>用户?br>19. 守护天
自动化单元测试是你的守护天?br>20. 先用它再实现?br>试驱动开发其实是一U设计工兗?br>21. 不同环境Q就有不同问?br>要重视多q_问题?br>22. 自动验收试
23. 度量真实的进?br>在工作量估算上,不要自欺Zh?br>24. 們֐用户的声?br>每一声抱怨都隐藏着宝贵的真理?

~程?br>25. 代码要清晰地表达意图

代码是给的,不要耍小聪明?br>26. 用代码沟?br>注释的艺术?br>27. 动态地q行取舍

CQ没有最佌x案。各U目标不可能面面俱到Q关注对用户重要的需求?br>28. 增量式编E?br>写一点代码就构徏、测试、重构、休息。让代码q净利落?br>29. 量?br>宁简勿繁。如果没有充的理由Q就不要使用什么模式、原则和特别的技术?br>30. ~写内聚的代?br>cdlg应该_,d单一?br>31. 告知Q不要询?br>多用消息传递,用函数调用?br>32. Ҏ契约q行替换
委托往往优于l承?

调试?br>33. 记录问题解决日志
不要在同一地方摔倒两ơ。错误是最宝贵的胦富?br>34. 警告是错误
忽视~译器的警告可能铸成大错?br>35. 寚w题各个击?br>分而治之是计算机科学中最重要的思想之一。但是,要从设计和原型阶D就考虑各部分应该能够很好地分离?br>36. 报告所有的异常
37. 提供有用的错误信?br>E微多花一点心思,出错的时候,给你带来极大便利?

团队协作?br>38. 定期安排会面旉
常开会,开短会?br>39. 架构师必d代码

不写代码的架构师不是好架构师。好的设计都来自实际~程。编E可以带来深入的理解?br>40. 实行代码集体所有制
让开发h员在pȝ不同区域中不同的模块和Q务之间轮岗?br>41. 成ؓ指导?br>教学盔R。分享能提高团队的M能力?br>42. 让大家自己想办法

指引方向Q而不是直接提供解x案。让每个人都有机会在q中学习?br>43. 准备好后再共享代?br>不要提交无法~译或者没有通过单元试的代码!
44. 做代码复?br>复查Ҏ高代码质量、减错误极为重要?br>45. 及时通报q展与问?

d通报Q不要让别h来问你?/p>

战魂筑 2012-04-03 21:40 发表评论
]]>
[转蝲]GameEngineArchitectureMW记(一)http://www.shnenglu.com/sunicdavy/archive/2011/04/10/143890.html战魂筑战魂筑Sun, 10 Apr 2011 13:41:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2011/04/10/143890.htmlhttp://www.shnenglu.com/sunicdavy/comments/143890.htmlhttp://www.shnenglu.com/sunicdavy/archive/2011/04/10/143890.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/143890.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/143890.html
  • Game Team
    • 国外AI和AudioE序员所占的角色q是很重要的, 而国内AI都是服务器在? Audio基本上没有h下多工?
    • 术的话TA来重? 3D游戏开发不~少
    • 另外, 目理也很重要, E序员没有那么多_֊d注这些事?/li>
  • Game Engine
    • 引擎的三个特? 数据驱动, 可复? 可扩?
      • W一人称
        • 写实效果, 对于技术要求最? 真实渲染, 高? 物理模拟, 动画和高AI, 多h游戏支持
      • W三人称
        • 卡通效? 丰富的动? 可交互场?/li>
      • 格斗游戏
        • 大量的动? 打击判定, 角色渲染, 皮肤/布料/毛发渲染
      • 竞速游?
      • x战略
        • 地Ş支持. 复杂AI
      • 多h在线
        • 服务? 囑Ş效果要求?/li>
      • 其他
    • 中间?
      • 游戏开发越来越多的使用C间g, 没有哪一个引擎能把所有的部分做到极致
      • 现在的引擎更像是一个容? 各种W三Ҏ件整合到一?
      • 国内现状来? 用商业引擎的一般会再买几个中间? 不然功能不全; 用自研引擎的要么扑ּ源的, 要么自己?
      • 典型的几个中间g:
        • Lighting: Beast/Enlighten
        • Physics: Havok/PhysX/Bullet
        • Animation: Granny/Havok/Edge
        • AI: Kynapse/Xaiment
        • UI: Scaleform/Iggy
        • Video: Bink
        • Audio: fmod/XACT/Miles
        • Network: RakNet
    • Gameplay
      • 很多引擎是缺这一层的, 可能OGRE的流行让大部分h觉得渲染引擎是游戏引擎?
      • 除了渲染, 像对象系l? 事gpȝ, 脚本pȝ, AI{也是一个游戏引擎不可缺的部分
    • Pipeline
      • q才是一个引擎具有竞争力的地? 因ؓ它直接关pd一个游戏的开发效?
      • 对于一个引擎来? 画面效果虽然重要, 但是pipeline比画面和效率更ؓ重要
      • 游戏开发是个不断P代的q程, 所以提高P代的速度也意味着降低成本
      • 一个引? 不管什么都是围l着"资源"来进行的
    • Tools
      • 版本理
        • 最开始接触的是SVN. 当然, 不可否认q是开源免费的最佳代? 用来理代码q是不错? 但是用它理术资源无疑是个效率很低的选择
        • Git/Hg, 相比SVN我觉得更好用一? TortoiseGit是我现在的首? TortoiseHg用了一D|? 跟TortoiseSVN的操作习惯差别太? 而且界面q是python? 不太习惯
        • Perforce, 商业解决Ҏ. 效率的确?特别是美术二q制资源), 插g(VS/Max/Maya/PS)也不? 从SVN转过来后老是对它某些l节有点不爽, 因ؓ它不会主动对比文件差? q也是它Z么速度快的原因-_-
      • Profiling
        • VTune/CodyAnalyst是两上程序用的工? 最q发现VS2010自代的也相当好用, 不做汇编U的分析的话完全够用?
        • PerfHUD/PIX/GPA: NV现在感觉对PerfHUD支持的少? PIX如果E序写法不标准会分析不了. GPA现在是越来越好用? 要是把PIX的一些功能也吸收q去更好了
  • 转蝲? 逍遥自在的CSDN博客 http://blog.csdn.net/xoyojank/archive/2011/04/10/6313422.aspx



    战魂筑 2011-04-10 21:41 发表评论
    ]]>
    VC的RTTIpȝ性能试http://www.shnenglu.com/sunicdavy/archive/2010/10/22/130893.html战魂筑战魂筑Fri, 22 Oct 2010 08:00:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2010/10/22/130893.htmlhttp://www.shnenglu.com/sunicdavy/comments/130893.htmlhttp://www.shnenglu.com/sunicdavy/archive/2010/10/22/130893.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/130893.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/130893.html试环境QVisual Studio 2008 SP1

    试对象QRTTI的dynamic_cast和自己实现的RTTIpȝQ代码如?/p>

            template<typename TClass>
            TClass* Cast( )
            {
                return IsKindOf( TClass::StaticGetClassInfo() ) ? (TClass*)this:null;
            }

     

        bool RTTIObject::IsKindOf( RTTIClass* ClassInfo )
        {
            RTTIClass* ThisClass = GetRTTIClass();
     
            if ( ThisClass == null )
                return false;
            
            return ThisClass->IsKindOf( ClassInfo );
        }

     

        bool RTTIClass::IsKindOf( RTTIClass* ClassInfo )
        {
            RTTIClass* ThisClass = this;
            while ( ThisClass != null )
            {
                if ( ClassInfo == ThisClass )
                    return true;
     
                ThisClass = ThisClass->mParentClass;
            }
     
            return false;
        }

     

    试代码Q?/p>

    class ClassA : public RTTIObject
    {
    public:
    DECLARE_RTTI_CLASS( ClassA )
    int a;
    private:
    };
    IMPLEMENT_RTTIROOT( ClassA )
     
    class ClassB: public ClassA
    {
        DECLARE_RTTI_CLASS( ClassB )
    public:
    int b;
    private:
    };
    IMPLEMENT_RTTI_CLASS( ClassB, ClassA )
     
    class ClassC : public ClassB
    {
        DECLARE_RTTI_CLASS( ClassC )
    public:
    int c;
    private:
    };
    IMPLEMENT_RTTI_CLASS( ClassC, ClassB )
     
    class ClassD: public ClassA
    {
        DECLARE_RTTI_CLASS( ClassD )
    public:
    int d;
    private:
    };

        ClassC c;
        ClassD d;
        
        ClassA* fakeC = &c;
        ClassA* fakeD = &d;
     
        const int TestTimes = 10000;
     
        float t1 = TimeSource::GetAppTime();
     
        for ( int i = 0;i<TestTimes;i++)
        {
            ClassC* realC = dynamic_cast<ClassC*>(fakeC);
            ClassD* realD = dynamic_cast<ClassD*>(fakeD);
        }
     
        float t2 = TimeSource::GetAppTime() - t1;
     
        for ( int i = 0;i<TestTimes;i++)
        {
            ClassC* realC = fakeC->Cast<ClassC>( );
            ClassD* realD = fakeD->Cast<ClassD>( );
        }
     
        float t3 = TimeSource::GetAppTime() - t2;
     
        SimpleLog log;
        log.Debug(L"%f  %f", t2, t3);

     

    10000ơ,单位:毫秒   dynamic_cast     Cast
            Debug 1.468590 5.173067
            Release 1.025950 0.702404

     

    可以看得出来Q没有优化过的Cast代码性能极差Q但是优化过的Cast性能越了系l的dynamic_cast,跟踪汇编发现pȝ有做个一些异常及bad_cast的处?/p>

    Q可以做一个宏Q在不支持RTTI的编译器及^C使用自己的Cast



    战魂筑 2010-10-22 16:00 发表评论
    ]]>
    在VC调试器中昄CEGUI 字符?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/05/14/115356.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 14 May 2010 04:01:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/05/14/115356.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/115356.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/05/14/115356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/115356.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/115356.html</trackback:ping><description><![CDATA[<p>CEGUI的字W串c设计的初衷是以32个字Wؓ分界? 低于32个字W用固定buffer, 高于才用栈分配内存存储字符? 不过因ؓCEGUI使用utf32,兼容性虽然很?但是在VC调试器里无法昄是个很大的问?</p> <p>q里参考了mybios博客中的<a href="http://www.shnenglu.com/mybios/archive/2009/11/10/28914.html">文章</a>,lCEGUI字符串做一个patch</p> <p>然后需要找到vs2008的autoexp.dat文g</p> <p>XP下位?C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\autoexp.dat</p> <p>用记事本{工h开, 在AutoExpandD中像这h?</p> <p>[AutoExpand]<br>; CEGUI String<br>CEGUI::String = str =<d_quickbuff,su> length =<d_cplength> <p>卛_在VC调试器中看到CEGUI字符串内? 不过中文q是暂时无法支持</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/115356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-05-14 12:01 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/05/14/115356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>增强骨骼动画pȝ的几个要?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/05/11/115080.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Tue, 11 May 2010 02:21:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/05/11/115080.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/115080.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/05/11/115080.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/115080.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/115080.html</trackback:ping><description><![CDATA[<p>要在游戏中用到强大而有扩展性的骨骼动画,有很多注意点.</p> <p>首先,我们得弃用CPU蒙皮, 虽然兼容性好,但是面对C多核但ƈ不提高单栔R率的情况下,GPUq是王道.而且GPU蒙皮代码可能更简?不过也有一点小~点, 对于引擎来?Shader必须l静态模型和骨骼动画模型写两?</p> <p>其次我们需要加Z个SubSkin的骨骼支持数? 骨骼动画上的每个SubSkin都是一ơDraw, 但是按照传统骨骼动画pȝ,每个骨头对应一个矩阵传?那么SM2.0保守计算只能支持50栚w? 不过在我前段旉?a href="http://www.shnenglu.com/sunicdavy/archive/2010/04/26/113578.html">文章</a>中有提到q个技?q且已经在我的骨骼动ȝl及OGRE中实?效果很好.</p> <p>术也许很反感一个h物做1个SubSkin, 他们更新好多个SubSkin,也就是说w体每个部分都是一个SubSkin, q样方便修改, 同时pȝ支持的骨骼数量还可以有一定量的上?不过我们q需要做一个烦引工? 传统的GPU骨骼动画中L在渲染SubSkin前传入所有这些SubSkin需要用到的骨骼矩阵. 但是每个SubSkinq不一定能用到所有的q些矩阵,q明显是一U浪? 因此在OGRE中做q一ơ烦引预处理,也就是将每个SubSkin用到的骨骼统计出? 在渲染这ơSubSkin时才重新传到GPU. 很明?q是用速度q空间和兼容? 如果在DX10以上,有ConstantBufferq好. DX9实在太慢?/p> <p>使用Marker点的换装pȝ很难处理例如贴n衣物q类物g换装. OGRE中有一U共享骨骼的技? 可以支持, 不过从代码分析看?q种技术对CPU端骨D量实在是大的惊? 因此我们军_整个SubSkin(也就是SubEntity)换掉,q样q术根据不同换装类型来衣服在MAX中直接绑定好后直接替换原始模型中的SubSkin卛_辑ֈ换装效果.可以说这是从动态计到静态预处理的{?效率提升很多.</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/115080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-05-11 10:21 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/05/11/115080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲|推荐] 非常的ARPG引擎LingEnginehttp://www.shnenglu.com/sunicdavy/archive/2010/05/07/114724.html战魂筑战魂筑Fri, 07 May 2010 02:12:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2010/05/07/114724.htmlhttp://www.shnenglu.com/sunicdavy/comments/114724.htmlhttp://www.shnenglu.com/sunicdavy/archive/2010/05/07/114724.html#Feedback2http://www.shnenglu.com/sunicdavy/comments/commentRss/114724.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/114724.html在?a >http://www.opengpu.org/index.php 时发C个优U的ARPG客户端引?a >LingEngine

    各位可以下蝲看下

     

    image

    从直观个人分析该引擎技术包?

    1. ZSlimDX?NET引擎

    2. JavaScript脚本

    3. 场景剔除效率q不?/p>

    4. 手感非常? 不亚于WOW

     

    ?a >博客里还有几关于保留模式引擎的讨论. 个h觉得q大概是以后的趋? 微Y的WPF首先当了炮灰, 庆幸.



    战魂筑 2010-05-07 10:12 发表评论
    ]]>
    [原创]提高Shader Model 2.0 蒙皮骨骼动画的骨骼限?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/04/26/113578.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Mon, 26 Apr 2010 05:31:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/04/26/113578.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/113578.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/04/26/113578.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/113578.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/113578.html</trackback:ping><description><![CDATA[<p>传统的蒙皮骨骼动L؜合方法易于理?但是在SM 2.0?56帔R限制?骨骼C守计最?0栚w?因此对美术的工作程以及模型渲染Ҏ造成了很大的障碍</p> <div id="tllllz7" class="csharpcode"><pre class="alt">float4x4 matBoneArray[40]; <span id="p7lvt79" class="rem">// q是传输的瓶?/span></pre><pre> </pre><pre class="alt">VS_OUTPUT vs_main( SkinnedVS_INPUT In )</pre><pre>{</pre><pre class="alt"> </pre><pre> VS_OUTPUT Out = (VS_OUTPUT)0;</pre><pre class="alt"> </pre><pre> float4x4 skinTransform = 0;</pre><pre class="alt"> </pre><pre> skinTransform += matBoneArray[In.BoneIndices.x] * In.BoneWeights.x;</pre><pre class="alt"> skinTransform += matBoneArray[In.BoneIndices.y] * In.BoneWeights.y;</pre><pre> skinTransform += matBoneArray[In.BoneIndices.z] * In.BoneWeights.z;</pre><pre class="alt"> skinTransform += matBoneArray[In.BoneIndices.w] * In.BoneWeights.w;</pre><pre> float4 localpos = mul(In.Position, skinTransform);</pre><pre class="alt"> </pre><pre> Out.Position = mul( localpos, matViewProj ); </pre><pre class="alt"> Out.TexCoord = In.TexCoord;</pre><pre> </pre><pre class="alt"> <span id="71p9h9l" class="kwrd">return</span> Out;</pre><pre>}</pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p>matBoneArrayq个数组是骨骼的LocalRot和LocalTranslation 通过以下函数build出来</p> <div id="vxp9zbh" class="csharpcode"><pre class="alt"> Matrix4& Matrix4::FromTranslationRotation( <span id="t7t7vl9" class="kwrd">const</span> Vector3& translation, <span id="dv93x7v" class="kwrd">const</span> Quaternion& rotation )</pre><pre> {</pre><pre class="alt"> <span id="nzrj79x" class="kwrd">float</span> xx = rotation.x * rotation.x * 2.0f, yy = rotation.y * rotation.y * 2.0f, zz = rotation.z * rotation.z * 2.0f;</pre><pre> <span id="lnv7jrt" class="kwrd">float</span> xy = rotation.x * rotation.y * 2.0f, zw = rotation.z * rotation.w * 2.0f, xz = rotation.x * rotation.z * 2.0f;</pre><pre class="alt"> <span id="ttbt7hh" class="kwrd">float</span> yw = rotation.y * rotation.w * 2.0f, yz = rotation.y * rotation.z * 2.0f, xw = rotation.x * rotation.w * 2.0f;</pre><pre> </pre><pre class="alt"> m[0][0] = 1.0f - yy - zz; m[0][1] = xy + zw; m[0][2] = xz - yw; m[0][3] = 0.0f;</pre><pre> m[1][0] = xy - zw; m[1][1] = 1.0f - xx - zz; m[1][2] = yz + xw; m[1][3] = 0.0f;</pre><pre class="alt"> m[2][0] = xz + yw; m[2][1] = yz - xw; m[2][2] = 1.0f - xx - yy; m[2][3] = 0.0f;</pre><pre> m[3][0] = translation.x; m[3][1] = translation.y; m[3][2] = translation.z; m[3][3] = 1.0f;</pre><pre class="alt"> </pre><pre> <span id="dnvlvf1" class="kwrd">return</span> *<span id="tvllj1h" class="kwrd">this</span>;</pre><pre class="alt"> }</pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p></p> <p>从这里你可以发现, 本来每根骨头只需?个float4 传递变换信息的,现在却需?个float4,也就是一个矩阉|传?矩阵中还有很多不使用的变量也被传输到GPU?q里是优化的点.</p> <p>重新调整后的Shader代码:</p> <div id="pb7ffn7" class="csharpcode"><pre class="alt">float4x4 BuildFromTransRot( float4 translation, float4 rot )</pre><pre>{</pre><pre class="alt"> float4 rotation = rot;</pre><pre> </pre><pre class="alt"> <span id="z1ddttd" class="kwrd">float</span> xx = rotation.x * rotation.x * 2.0f, yy = rotation.y * rotation.y * 2.0f, zz = rotation.z * rotation.z * 2.0f;</pre><pre> <span id="hbtrjjr" class="kwrd">float</span> xy = rotation.x * rotation.y * 2.0f, zw = rotation.z * rotation.w * 2.0f, xz = rotation.x * rotation.z * 2.0f;</pre><pre class="alt"> <span id="t3fff1j" class="kwrd">float</span> yw = rotation.y * rotation.w * 2.0f, yz = rotation.y * rotation.z * 2.0f, xw = rotation.x * rotation.w * 2.0f;</pre><pre> float4x4 m = { </pre><pre class="alt"> {1.0f - yy - zz, xy + zw, xz - yw, 0},</pre><pre> {xy - zw, 1.0f - xx - zz, yz + xw, 0},</pre><pre class="alt"> {xz + yw, yz - xw, 1.0f - xx - yy, 0},</pre><pre> {translation.x, translation.y, translation.z, 1}</pre><pre class="alt"> </pre><pre> };</pre><pre class="alt"> </pre><pre> <span id="vt9b999" class="kwrd">return</span> m;</pre><pre class="alt">}</pre><pre> </pre><pre class="alt">float4x4 GetBoneElement( <span id="979ltbp" class="kwrd">float</span> index )</pre><pre>{</pre><pre class="alt"> <span id="v939vlj" class="kwrd">return</span> BuildFromTransRot( vecBoneLocalTrans[index], vecBoneLocalRot[index] );</pre><pre>}</pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p></p> <div id="97x3fff" class="csharpcode"><pre class="alt">VS_OUTPUT vs_main( SkinnedVS_INPUT In )</pre><pre>{</pre><pre class="alt"> </pre><pre> VS_OUTPUT Out = (VS_OUTPUT)0;</pre><pre class="alt"> </pre><pre> float4x4 skinTransform = 0;</pre><pre class="alt"> </pre><pre> skinTransform += GetBoneElement(In.BoneIndices.x) * In.BoneWeights.x;</pre><pre class="alt"> skinTransform += GetBoneElement(In.BoneIndices.y) * In.BoneWeights.y;</pre><pre> skinTransform += GetBoneElement(In.BoneIndices.z) * In.BoneWeights.z;</pre><pre class="alt"> skinTransform += GetBoneElement(In.BoneIndices.w) * In.BoneWeights.w;</pre><pre> float4 localpos = mul(In.Position, skinTransform);</pre><pre class="alt"> </pre><pre> Out.Position = mul( localpos, matViewProj ); </pre><pre class="alt"> Out.TexCoord = In.TexCoord;</pre><pre> </pre><pre class="alt"> <span id="95tp9xv" class="kwrd">return</span> Out;</pre><pre>}</pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p>我们骨头的local旋{及偏UM递至GPU,然后在GPU内重l?虽然对GPU性能计算有部分损?但是骨骼数量p保守提高?00?</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/113578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-04-26 13:31 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/04/26/113578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏工程里的使用C++静态库与动态库http://www.shnenglu.com/sunicdavy/archive/2010/04/07/111859.html战魂筑战魂筑Wed, 07 Apr 2010 08:08:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2010/04/07/111859.htmlhttp://www.shnenglu.com/sunicdavy/comments/111859.htmlhttp://www.shnenglu.com/sunicdavy/archive/2010/04/07/111859.html#Feedback2http://www.shnenglu.com/sunicdavy/comments/commentRss/111859.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/111859.html假设我们?个工E及其工E类型:

    CORE              DLL

    ENGINE           DLL

    GAME             EXE

    D3DRENDER      DLL

    其中D3DRENDER是GAME动态蝲入的Q其需要链接CORE,ENGINE

    q是一个很常见的模式,但是不好的是Q因为CORE和ENGINE均是DLLQ代码中的Symbol都被导出才可使用。Q何h使用DEPENDENCE工具可以将DLL中引用的东西查看的清楚,虽然q不至于造成技术泄漏,但从速度和DLL大小来说都是不划的?/p>

    现在很多游戏主exe一般都?0M+甚至20M+的大exeQ这都是使用静态链接而成。但是对代码l构也必dZ定的调整。所有工E必都是静态库Q这h能保证像COREq样的静态库中的全局/静态变量不至于被链?份而造成内存D逻辑错误?/p>

    当然Q用全静态库q需要注意一点:所有的lib都是在最后的game工程里来做链接?/p>

    战魂筑 2010-04-07 16:08 发表评论
    ]]>
    [转]虚引擎UDK开发官方视频教E?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/04/07/111833.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Wed, 07 Apr 2010 02:36:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/04/07/111833.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/111833.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/04/07/111833.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/111833.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/111833.html</trackback:ping><description><![CDATA[<p>转蝲?<a >独立游戏中文论坛</a> <p>UDK是unrealengine develpoment kit 的羃写,单来说就是大名鼎鼎的虚Q引擎的免费商业版本Q不q虚q3毕竟q是Q年前的dx9的入门引擎Q在商业上取?br>巨大成功Q技术上也显得落后.目前Epicxq虚q3的最后一Ҏ力,于是q脆发布了这个免费版本.M人都可以用UQO开发游戏,但是如果游戏牟利的话每年q是要向<br>Epic交纳一定数量的技术授权费用的Q先不管q个Q还是来看看它的官方视频教程吧.<br>  [attach]44[/attach]<br>链接如下Q  <br><a >http://udn.epicgames.com/Three/VideoTutorials.html</a><br>一共5个教E 从引擎配|介l开始,到关卡和人物~辑器,以及最后一个完整的游戏的制作Q对于入门来说完全够了Q?br>视频说的q比较详l,听力不好的同学可以对照下开发文档 <a >http://www.udk.com/documentation</a> 里面基本说的很详l.<br>最后附上UQO的下载地址Q <a >March 2010 UDK Beta</a> (548 MB .exe) <br>好了QUQO对于初学者来说还是比较适合的.对于游戏的开发h员来说引擎的整体架构q是很值得学习的.希望你学的愉快.</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/111833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-04-07 10:36 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/04/07/111833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模拟OGRE的Compositorhttp://www.shnenglu.com/sunicdavy/archive/2010/04/01/111312.html战魂筑战魂筑Thu, 01 Apr 2010 10:56:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2010/04/01/111312.htmlhttp://www.shnenglu.com/sunicdavy/comments/111312.htmlhttp://www.shnenglu.com/sunicdavy/archive/2010/04/01/111312.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/111312.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/111312.htmlRenderTarget完成后,开始模拟OGRE的Compositor?/p>

    OGRE的Compositor其实是用于解决l制PostEffect的,单的_是一URenderTarget的流E控制脚?/p>

    q是OGRE compositor文g的片D?/p>

    compositor Bloom
    {
        technique
        {
            // Temporary textures
            texture rt_output target_width target_height PF_R8G8B8
            texture rt0 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
            texture rt1 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
     
            target rt_output
            {
                // Render output from previous compositor (or original scene)
                input previous
            }
     
            target rt0
            {
                // Start with clear texture
                input none
                // Horizontal blur pass
                pass render_quad
                {
                    // Renders a fullscreen quad with a material
                    material Ogre/Compositor/BrightPass2
                    input 0 rt_output
                }
            }
     
            target rt1
            {
                // Start with clear texture
                input none
                // Horizontal blur pass
                pass render_quad
                {
                    // Renders a fullscreen quad with a material
                    material Ogre/Compositor/BlurV
                    input 0 rt0
                }
            }
     
            target rt0
            {
                // Start with clear texture
                input none
                // Horizontal blur pass
                pass render_quad
                {
                    // Renders a fullscreen quad with a material
                    material Ogre/Compositor/BlurH
                    input 0 rt1
                }
            }
     
            target_output
            {
                // Start with clear output
                input none
                // Draw a fullscreen quad
                pass render_quad
                {
                    // Renders a fullscreen quad with a material
                    material Ogre/Compositor/BloomBlend2
                    input 0 rt_output
                    input 1 rt0
                }
            }
        }
    }

     

    大概我们知道Q一个Compositor分ؓ资源定义与绘制步骤(target xxxQ?/p>

    而一个绘制步骤又分别定义Q?/p>

    1. Q输入)l制的是什么东西?

    2. Q效果)l制成什么样子?

    3. Q输出)往哪里l制Q?/p>

    输出方式在这个例子有2U:U理QRTQ和屏幕

    输入方式?中:U理及场?/p>

    我们可以使用一个回调来对一个绘制步骤提供绘制输?/p>

    l制效果是一大堆的ShaderQ这些shader都是Z一个quad来做的,也就是一个矩形,使用变换后的点和一个纹理坐标作为顶点定?/p>

    不过q里是不需要做vertexshader的,仅仅ps矣?/p>

    l制的最后,是将前面l制的RTQ纹理)混合h

    当然Q如果步骤比较多和复杂时QRT之间跟寄存器一P可以反复使用

    YR7HEX8VAB[67GPOWLNPIBA

    昄茶壶法线的场景加?Blur 的PostEffect

    <?xml version="1.0" encoding="gb2312" ?>
    <Compositor name = "bloom" >
      <Resource>
        <RenderTarget name ="rt_source" size="screenquad" />
        <RenderTarget name ="rt0" size="screenquad" />
        <RenderTarget name ="rt1" size="screenquad" />
      </Resource>
      <Step target="rt_source">
        <Geometry type ="callback" callback = "rt_input"/>
      </Step>
      <Step target="rt0">
        <Geometry type = "screenquad"/>
        <Effect name ="material\blurH.xml">
          <Texture name ="mTexture" value ="rt_source" />
        </Effect>
      </Step>
      <Step target="rt1">
        <Geometry type = "screenquad"/>
        <Effect name ="material\blurV.xml">
          <Texture name ="mTexture" value ="rt_source" />
        </Effect>
      </Step>
      <Step>
        <Geometry type = "screenquad"/>
        <Effect name ="material\combine.xml">
          <Texture name ="mTexture1" value ="rt0" />
          <Texture name ="mTexture2" value ="rt1" />
        </Effect>
      </Step>
    </Compositor>
    q是我的引擎里的Compositor脚本Q还在慢慢加强功能,希望能有一天达到OGRE的Compositor功能

    战魂筑 2010-04-01 18:56 发表评论
    ]]>
    一套可扩充的游戏模型系l?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/03/12/109538.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 12 Mar 2010 08:13:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/03/12/109538.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/109538.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/03/12/109538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/109538.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/109538.html</trackback:ping><description><![CDATA[<p>本h的设计图可以方便在文本编辑器里查?>为派?+为包? <p>MAX插g导出的模型资源分QMesh/Skin, Skeleton, Animation <p>不同动作按照不同的动L件保?<p>  <p>ResourceHandle 包含基本id<br>        >NamedResourceHandle 带有名称资源Q包含hashA, hashBQ?使用暴雪hash函数生成<br>        >ModelHandle        <br>        >MeshHandle            <br>        >SkeletonHandle        <br>        >AnimationHandle <p>获取资源Q如果资源不存在Ӟ自动加蝲<br>ModelMaster.ManualCache( &ModelHandle ) <p>直接资源讉KQ?br>RawSkeleton = ModelMaster.ManualCache( &SkeletonHandle("a.skl") )<br>RawSkeleton->GetMarker(...) <p>异步资源加蝲Q异步id保存于ModelHandle中,在callback中根据id认<br>ModelMaster.AsyncCache( &ModelHandle ) <p>获取资源指针Q未加蝲Ӟq回I?br>ModelResource = ModelMaster.Fetch( &ModelHandle ) <p>模型资源加蝲?br>    在模型句柄中l定对应加蝲?br>    可以自行~写带换装的ModelLoaderQ通过d自己的配|文Ӟ自行加蝲资源后生成RawModel<br>ModelLoader<br>    ModelHandle         ---mapping--->    ModelLoader         ---generate--> RawModel<br>    MeshHandle          ---mapping--->    MeshLoader             ---generate--> RawMesh<br>    SkeletonHandle     ---mapping--->    SkeletonLoader      ---generate--> RawSkeleton<br>    AnimationHandle    ---mapping--->    AnimationLoader   ---generate--> RawAnimation <p>引用计数c?nbsp;   <br>ModelResource<br>    >RawModel<br>    >RawMesh<br>    >RawSkeleton<br>    >RawAnimation <p>RawModel中不保留HandleQ只保留指针<br>RawModel<br>    +MeshVB    从模型文件中直接d点格式Q包?静?GPU,CPUcd点<br>        +RawMesh<br>        +MeshIB        一ơ性填充IB<br>        >GPUMeshVB    一ơ性填充VB<br>        >CPUMeshVB    每计算<br>    +Animation            q行期数据(旉/帧)<br>        +RawAnimation    原始动画内容<br>    +Skeleton<br>        +RawSkeleton</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/109538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-03-12 16:13 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/03/12/109538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>枚D反射对象和结构体反射填充http://www.shnenglu.com/sunicdavy/archive/2010/02/26/108509.html战魂筑战魂筑Fri, 26 Feb 2010 09:58:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2010/02/26/108509.htmlhttp://www.shnenglu.com/sunicdavy/comments/108509.htmlhttp://www.shnenglu.com/sunicdavy/archive/2010/02/26/108509.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/108509.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/108509.html 

    最q在写D3D9模拟D3D10接口的渲染系l中到大量的渲染状态对象,不仅成员多,枚D也多的要命?/p>

     

        struct CORE_API RasterizerState : ResourceHandle            
        {
            eFillMode            mFillMode;        
            eCullMode            mCullMode;
            bool                mFrontFaceCCW;
            float                mDepthBias;
            float                mSlopeScaledDepthBias;
            bool                mDepthClipEnable;
            bool                mScissorEnable;
            bool                mMultisampleEnable;
    
            RasterizerState();
        };
    

    而要从配|文件中d数据q填充到q个l构体,对于C++来说完全是吃力不讨好的Q写出来的代码也是极E,修改和扩展极为麻烦的?/p>

    因此军_使用反射的方法来填充数据Q先ȝ一下我的C++反射pȝ

    class RTTIObject // 动态类型识别对象基c,对象通过一些宏后可以很方便的通过字符串创建出cd例,q且可以查询注册时的cd和其他绑定信?/span>
    class NameRef  // 名字表,cM于虚qM的FNameQ可以定义Const和普通NameQ比较和拯只是一个dword耗费的时?/span>
    value_parseQvalue_tostringQvalue_typename // 一pdcd模板函数Q提供对cd的ToStringQParse及类型名查询

     

    首先需要处理的是枚举查询,q里枚N过宏做成一个个枚D对象Qƈ可以通过名字创徏实例

    #define DECLARE_ENUMOBJECT( TEnum ) \
        struct EnumObject_##TEnum : EnumObject\
        {\
        DECLARE_RTTIOBJECT( EnumObject_##TEnum );\
        EnumObject_##TEnum( );\
        };
    
    
    #define IMPLEMENT_ENUMOBJECT_BEGIN( TEnum, TEnum_prefixoffset, TMember_prefixoffset ) \
        IMPLEMENT_RTTIOBJECT_STRING( EnumObject_##TEnum, #TEnum + TEnum_prefixoffset, #TEnum + TEnum_prefixoffset, "EnumObject" )\
        EnumObject_##TEnum::EnumObject_##TEnum(){ const int member_prefixoffset = TMember_prefixoffset;
    
    #define ENUMOBJECT_ADD( enumkey ) AddMember( #enumkey + member_prefixoffset, (dword)enumkey );
    
    #define IMPLEMENT_ENUMOBJECT_END }
    
    #define ENUMOBJECT_STATICINIT( TEnum ) EnumObject_##TEnum::StaticInit();
    

    EnumObject 中通过宏将枚D的名U和g存在q个对象?/p>

    IMPLEMENT_ENUMOBJECT_BEGIN( eFillMode, 1, 3 )  // q里?Q?是将eFillMode及FM_Point转成字符串后L前缀
        ENUMOBJECT_ADD( FM_Point )
        ENUMOBJECT_ADD( FM_Line )
        ENUMOBJECT_ADD( FM_Fill )
    IMPLEMENT_ENUMOBJECT_END
    
    // 注册到RTTIObjectpȝ
    
    ENUMOBJECT_STATICINIT( eFillMode )
    

     

    // 通过枚D对象可以查找到字W串对应的?/span>
    dword v;
    EnumObject::GetEnumValue( "FillMode", "Point", v )
    
    
    
    

    下一步是结构体成员信息记录

        void SettingObject::BindMember( const NameRef& objname, void* instancePtr, void* dataPtr, SettingProxy* proxy )
        {
            proxy->mOffset = dword(dataPtr) - dword(instancePtr);
    
            MemberList& memberlist = mSettingMap[ objname ];
            memberlist[ proxy->mName ] = proxy;
        }

    q里记录的是l构体成员的内存偏移

    使用大量的宏Q可以让l构体绑定变得漂?/p>

    #define BIND_SETTINGOBJECT_BEGIN( TClass ) \
        { const NameRef& soname = TClass::StaticGetClassInfo()->mClassName;TClass soobj;
    
    #define BIND_SO_MEMBER( TMemberType, TMember ) \
        so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(#TMember + 1 ) );
    
    #define BIND_SO_MEMBER_NAME( TMemberType, TMember, TName ) \
        so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(TName) );
    
    #define BIND_SO_ENUM( TEnumType, TMember ) \
        so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(#TMember + 1, #TEnumType + 1) );
    
    #define BIND_SO_ENUM_NAME( TEnumType, TMember, TName ) \
        so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(TName, #TEnumType + 1) );
    
    #define BIND_SETTINGOBJECT_END }

    l定代码如下

            BIND_SETTINGOBJECT_BEGIN( RasterizerState )
                BIND_SO_ENUM    ( eFillMode    , mFillMode )
                BIND_SO_ENUM    ( eCullMode    , mCullMode )
                BIND_SO_MEMBER    ( bool        , mFrontFaceCCW )
                BIND_SO_MEMBER    ( float        , mDepthBias )
                BIND_SO_MEMBER    ( float        , mSlopeScaledDepthBias)
                BIND_SO_MEMBER    ( bool        , mDepthClipEnable)
                BIND_SO_MEMBER    ( bool        , mScissorEnable)
                BIND_SO_MEMBER    ( bool        , mMultisampleEnable)
            BIND_SETTINGOBJECT_END

     

    所有结构体的信息被记录在SettingObject中,d配置文g填充l构体的d变得异常的单了

        SettingObject settings;
    // 所有的l构体信息记?/span>
        InitRenderStateObjectSetting( settings );
    
        const NameRef& rzname = DepthStencilState::StaticGetClassInfo()->mClassName;
    
        DepthStencilState a;
     // q里是配|文件的信息填充到结构体
        settings.SetMember( rzname, &a, "BackFace.StencilFunc", "Equal" );
     


    战魂筑 2010-02-26 17:58 发表评论
    ]]>
    LemonComposer 2D游戏动画开发工?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/02/05/107257.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 05 Feb 2010 06:58:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/02/05/107257.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/107257.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/02/05/107257.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/107257.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/107257.html</trackback:ping><description><![CDATA[<p>Lemon是本人开发的一套适用?D游戏动画和高U游戏框架及配套~辑器(LemonComposerQ?/p> <blockquote> <p>LemonpȝҎ:</p> <p>1. 支持 Canvas,Sprite,ImageSetQ图片存储于一张图片,{大)</p> <p>2. ImageSetExQ自由摆攄囄帧于一张图片)*</p> <p>3. 支持对象无关键时用静态属性进行设|,cM于HGE里的_</p> <p>4. 每个对象均可成ؓContainerQƈ拥有Child Node</p> <p>5. 动画关键帧类型支持:~放Q旋转,位移Q颜Ԍ动画帧,锚点Q音?</p> <p>6. 支持拑֏</p> <p>7. ZXML存储的文件格?/p> <p>8. Z<a >Squirrel</a>N脚本的高速面向对象脚?</p> <p>9. 囑ŞpȝGraphics抽象Q适用于Q何渲染设?/p> <p>10. 控gpȝ*</p> <p>11. 视频回放*</p> <p>所有对象均由RTTI创徏Q枚丑֝有NamePool+HashQƈ׃PropertySet的反系l?/p> <p> </p></blockquote> <blockquote> <p>LemonComposer~辑器特?/p> <p>界面Z我去q开发的<a href="http://www.shnenglu.com/sunicdavy/archive/2009/07/24/91059.html">MotionUI</a>Qlua</p> <p>8+1控制点点对象调节属?/p> <p>cAdobe Flash的~辑?/p> <p>c?DS Max的分轨道关键帧编辑,有助于优化art assert</p> <p>自由调节对象层及父子关p?/p> <p>全功能无限制自由Redo,Undo</p> <p> </p></blockquote> <p>*在未来版本支持</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/image_thumb.png" width="483" height="300"></a> </p> <p> </p> <p> </p> <blockquote> <p>2D游戏是独立游戏的LQ也是创意,投入比最的一个维度。但是基?D的大多是一些类gHGEQIndieLib{开源免?D引擎。但是面Ҏ戏中大量的动画而言Q开发者大多是使用囄帧来制作Q虽然效果很好,但是讑֤资源好用和制作难度也是很难控制的?/p></blockquote> <blockquote> <p>行于去q的植物对僵和2004q发行的<a >RO Offline</a>l过资源分析Q就是用类gLemonpȝQ或者说Flash的系l制作而成Q因此效果和扩展性非常好?/p> <p>q就是Lemon存在的理由?/p> <p>Flash面向的是GDI+WebQ那么Lemon是针对游戏专有的,Zg加速的游戏框架</p> <p>Flash Action Script 对应的就是Lemon?a >Squirrel</a>脚本</p> <p>FlashIDE 对应的就是Lemon Composer</p> <p>Lemon的目标就是让2D游戏开发更单,让游戏中充满更多的动? 让游戏开发难度降?/p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/farming-gold-in-pvz%5B1%5D_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="farming-gold-in-pvz[1]" border="0" alt="farming-gold-in-pvz[1]" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/farming-gold-in-pvz%5B1%5D_thumb.jpg" width="244" height="196"></a></p></blockquote><img src ="http://www.shnenglu.com/sunicdavy/aggbug/107257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-02-05 14:58 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/02/05/107257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Render Target中的Alpha通道l制问题http://www.shnenglu.com/sunicdavy/archive/2010/01/20/106072.html战魂筑战魂筑Wed, 20 Jan 2010 08:56:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2010/01/20/106072.htmlhttp://www.shnenglu.com/sunicdavy/comments/106072.htmlhttp://www.shnenglu.com/sunicdavy/archive/2010/01/20/106072.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/106072.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/106072.html前段旉曄到qRTU理l制出来旉要透明的问题。当时也Google了一下,但是很少有h提vq这个问题。昨天看剑孤寒的I间的Galaxy2D引擎中用RT的透明l制Q文章在q里。发现这个特性居焉要显卡支持,马上查过DX9SDK文档Q发现这样一?a >文章Q已l告诉我们怎么做了Q?/p>

    Render Target Alpha (Direct3D 9)

    The frame buffer blender can now blend alpha channels independent from color-channel blending on render targets. This control is enabled with a new render state, D3DRS_SEPARATEALPHABLENDENABLE.

    When D3DRS_SEPARATEALPHABLENDENABLE is set to FALSE (which is the default condition), the render-target blending factors and operations applied to alpha are the same as those defined for blending color channels. A driver needs to set the D3DPMISCCAPS_SEPARATEALPHABLEND cap to indicate that it can support render-target alpha blending. Be sure to enable D3DRS_ALPHABLEND to tell the pipeline that alpha blending is needed.

    To control the factors in the alpha channel of the render-target blenders, two new render states are defined as follows:

    D3DRS_SRCBLENDALPHA 
    D3DRS_DESTBLENDALPHA 
    

    Like the D3DRS_SRCBLEND and D3DRS_DESTBLEND, these can be set to one of the values in the D3DBLEND enumeration. The source and destination blend settings can be combined in several ways, depending on the settings in the SrcBlendCaps and DestBlendCaps members of D3DCAPS9.

    The alpha blending is done as follows:

    renderTargetAlpha = (alphain* srcBlendOp) BlendOp (alphart* destBlendOp) 
    

    Where:

    • alphain is the input alpha value.
    • srcBlendOp is one of the blend factors in D3DBLEND.
    • BlendOp is one of the blend factors in D3DBLENDOP.
    • alphart is the render-target alpha value.
    • destBlendOp is one of the blend factors in D3DBLEND.
    • renderTargetAlpha is the final blended alpha value.

     

    译如下Q?/p>

       使用 D3DRS_SEPARATEALPHABLENDENABLE渲染状态可以让Frame Buffer 混合器将RT中的Alpha通道与颜色通道分开混合?/p>

    当D3DRS_SEPARATEALPHABLENDENABLE 讄?FALSEQ默认)QRT渲染参数和操作会跟颜色通道一栯应用到Alpha通道?q项Ҏ需要显卡支持D3DPMISCCAPS_SEPARATEALPHABLEND Ҏ。记住,在之前设|D3DRS_ALPHABLEND以便打开Alpha混合?/p>

       RT混合器的Alpha通道混合因子渲染状态如下:

    D3DRS_SRCBLENDALPHA

    D3DRS_DESTBLENDALPHA

    其被定义?a >D3DBLEND枚D中,D3DRS_SRCBLEND 和D3DRS_DESTBLEND也是q样定义的。来源色与目标颜色将会有很多l合方式Q主要依赖于D3DCAPS9中的SrcBlendCaps 和DestBlendCaps

    Alpha混合公式如下Q?/p>

    renderTargetAlpha = (alphain* srcBlendOp) BlendOp (alphart* destBlendOp)

    其中Q?/p>

        alphain入alpha?/p>

        srcBlendOp是D3DBLEND中的一个؜合因?/p>

        BlendOp?D3DBLENDOP中的一个؜合因?/p>

        alphart是RT的alpha?/p>

        destBlendOp是D3DBLEND中的一个؜合因?/p>

        renderTargetAlpha是最后؜合后的alpha?/p>

    战魂筑 2010-01-20 16:56 发表评论
    ]]>
    判断点在凸四边Ş?/title><link>http://www.shnenglu.com/sunicdavy/archive/2010/01/08/105136.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 08 Jan 2010 02:29:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2010/01/08/105136.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/105136.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2010/01/08/105136.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/105136.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/105136.html</trackback:ping><description><![CDATA[<p>前几天需要做一个鼠标点d定,具体是判断一个点是否在某个凸四边形中?/p> <p>最单的Ҏ莫过于判断鼠标点是否?个三角Ş中。但是很多判定方法都是有问题的,比如?/p> <p> </p> <p>copy自IndieLib</p><pre class="csharpcode"><span id="hhxvndn" class="kwrd">bool</span> Triangle2D::Inside2( <span id="rpx7trz" class="kwrd">const</span> Vector2& p ) { Vector2 v0 = mP3 - mP1; Vector2 v1 = mP2 - mP1; Vector2 v2 = p - mP1; <span id="bzhhf79" class="rem">// Compute dot products</span> <span id="vdll1lj" class="kwrd">float</span> dot00 = Vector2::DotProduct( v0, v0 ); <span id="nltllvn" class="kwrd">float</span> dot01 = Vector2::DotProduct( v0, v1 ); <span id="jzpxf97" class="kwrd">float</span> dot02 = Vector2::DotProduct( v0, v2 ); <span id="tl3hj7x" class="kwrd">float</span> dot11 = Vector2::DotProduct( v1, v1 ); <span id="hn9blb1" class="kwrd">float</span> dot12 = Vector2::DotProduct( v1, v2 ); <span id="fvvvvpx" class="rem">// Compute barycentric coordinates</span> <span id="d7rjr13" class="kwrd">float</span> invDenom = 1 / (dot00 * dot11 - dot01 * dot01); <span id="nlndv3x" class="kwrd">float</span> u = (dot11 * dot02 - dot01 * dot12) * invDenom; <span id="vnvlvdl" class="kwrd">float</span> v = (dot00 * dot12 - dot01 * dot02) * invDenom; <span id="vv3bbzb" class="rem">// Check if point is in triangle</span> <span id="ltbbbvb" class="kwrd">return</span> (u > 0) && (v > 0) && (u + v < 1); } </pre> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p>Google出的某h代码 <pre class="csharpcode"><span id="bzzzr9n" class="kwrd">float</span> Triangle2D::CrossProduct3(<span id="7bd3vdl" class="kwrd">const</span> Vector2& p1,<span id="bdljzbb" class="kwrd">const</span> Vector2& p2, <span id="lrb9fnv" class="kwrd">const</span> Vector2& p0 ) { <span id="p79dtll" class="kwrd">return</span> (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } <span id="dtb7jj9" class="kwrd">bool</span> Triangle2D::Inside( <span id="jhzp7p7" class="kwrd">const</span> Vector2& p ) { <span id="z9ppfdv" class="kwrd">return</span> (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)<0) && (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)<0) && (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)<0); } </pre> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p>  <p>q?个方法都有缺P当点在三角Ş边上Ӟ无法得出。当用在一个正方Ş判断Ӟ正方形中心点判定ؓ没有在其内部Q显然是一个错误? <p>  <p>之后Q又Google出某几个大侠的算法和思想Q考虑了下Q判定点与四边Ş重心点的U段是否与四边Ş4条边怺Q相交时Q其在四边Ş外部Q反之亦然?<pre class="csharpcode"><span id="fvlvbrj" class="kwrd">bool</span> Quadrangle::Inside2( <span id="pvlttlb" class="kwrd">const</span> Vector2& p ) { Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); <span id="17fp9tj" class="kwrd">return</span> !(Segement2D::Intersect( mP1, mP2, c, p) || Segement2D::Intersect( mP2, mP3, c, p) || Segement2D::Intersect( mP3, mP4, c, p) || Segement2D::Intersect( mP4, mP1, c, p) ); } <span id="1pp9933" class="kwrd">bool</span> Segement2D::Intersect( <span id="7blj7ff" class="kwrd">const</span> Vector2& p1, <span id="9rhhhxp" class="kwrd">const</span> Vector2& p2,<span id="x7bl9fx" class="kwrd">const</span> Vector2& p3, <span id="r7xffnt" class="kwrd">const</span> Vector2& p4 ) { <span id="dtbttvl" class="kwrd">float</span> gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; <span id="1dll1rt" class="rem">// In order to avoid divisions by zero</span> <span id="brjrbz9" class="rem">//if (mP1.y == mP2.y)</span> <span id="n13v99d" class="rem">// mP2.y += 0.0001f; </span> <span id="j7x9b9n" class="rem">//if (mP1.x == mP2.x)</span> <span id="rd9tljt" class="rem">// mP2.x += 0.0001f; </span> <span id="zjjhffz" class="rem">//if (seg.mP1.y == seg.mP2.y)</span> <span id="97ph3dn" class="rem">// seg.mP2.y += 0.0001f; </span> <span id="hzh7fdl" class="rem">//if (seg.mP1.x == seg.mP2.x)</span> <span id="b131lrb" class="rem">// seg.mP2.x += 0.0001f; </span> <span id="fx7199l" class="rem">// Calculates the intersection between the two lines</span> gradab = (p1.y - p2.y) / (p1.x - p2.x); gradcd = (p3.y - p4.y) / (p3.x - p4.x); ycptab = p1.y - p1.x * gradab; ycptcd = p3.y - p3.x * gradcd; interceptX = (ycptab - ycptcd) / (gradcd - gradab); intercepty = (ycptab - (gradab * ycptcd) / gradcd) / (1 - gradab / gradcd); <span id="ptbphzx" class="rem">// Checking in the intersection is inside the segment</span> <span id="vtt7fpd" class="kwrd">if</span> (!((interceptX >= p1.x && interceptX <= p2.x) || (interceptX >= p2.x && interceptX <= p1.x))) <span id="hzh9xtb" class="kwrd">return</span> 0; <span id="r3ppxnl" class="kwrd">if</span> (!((intercepty >= p1.y && intercepty <= p2.y) || (intercepty >= p2.y && intercepty <= p1.y))) <span id="hzhnlv1" class="kwrd">return</span> 0; <span id="3753ltd" class="kwrd">if</span> (!((interceptX >= p3.x && interceptX <= p4.x) || (interceptX >= p4.x && interceptX <= p3.x))) <span id="97rrh7v" class="kwrd">return</span> 0; <span id="71zrz9r" class="kwrd">if</span> (!((intercepty >= p3.y && intercepty <= p4.y) || (intercepty >= p4.y && intercepty <= p3.y))) <span id="7b9d7jl" class="kwrd">return</span> 0; <span id="x13fx9x" class="kwrd">return</span> 1; } Vector2 Segement2D::GetCrossPoint(<span id="l1f397x" class="kwrd">const</span> Vector2& p1, <span id="9x3jjbr" class="kwrd">const</span> Vector2& p2, <span id="btjtr1n" class="kwrd">const</span> Vector2& q1, <span id="j3vltjb" class="kwrd">const</span> Vector2& q2) { <span id="tlt1z9x" class="rem">//必须怺求出的才是线D늚交点Q但是下面的E序D|通用?</span> <span id="3vfd7zz" class="rem">/*Ҏ两点式化为标准式Q进而求U性方E组*/</span> Vector2 crossPoint; <span id="hz719l9" class="rem">//求x坐标</span> <span id="hl3jrhp" class="kwrd">float</span> tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y); <span id="pnfnfxn" class="kwrd">float</span> tempRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x); crossPoint.x = tempRight / tempLeft; <span id="hzj7ln1" class="rem">//求y坐标</span> tempLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x); tempRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y); crossPoint.y = tempRight / tempLeft; <span id="tbrjbtz" class="kwrd">return</span> crossPoint; } </pre> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <p>q个法效率q不是很高,但对于设计器来说无所谓了Q如果有好的准确法Q可以讨?/p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/105136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2010-01-08 10:29 <a href="http://www.shnenglu.com/sunicdavy/archive/2010/01/08/105136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.more1.cn" target="_blank">˾þþƷһ</a>| <a href="http://www.indmc.cn" target="_blank">ŷƷþþþþþο</a>| <a href="http://www.huishou399.cn" target="_blank">þþþþúݺݶ</a>| <a href="http://www.zhangqiu114.cn" target="_blank">Ʒ99þ99þþ</a>| <a href="http://www.nancanxie.cn" target="_blank">þóۺɫۺ</a>| <a href="http://www.17wgame.cn" target="_blank">99þþƷѾƷһ</a>| <a href="http://www.whoimi.cn" target="_blank">99þɫĻ</a>| <a href="http://www.blog91.cn" target="_blank">þWWW˳ɡƬ</a>| <a href="http://www.yangshuohappy.cn" target="_blank">ѾƷþþþþĻ</a>| <a href="http://www.eberan.cn" target="_blank">ƷþþþþþþӰԺ</a>| <a href="http://www.269sihu.cn" target="_blank">77777ҹþö</a>| <a href="http://www.impark.cn" target="_blank">þõӰ2021</a>| <a href="http://www.168zw.cn" target="_blank">߾þþƷĹ </a>| <a href="http://www.hxstone.com.cn" target="_blank">ɫ͵͵͵þ˴ý</a>| <a href="http://www.ypiu.cn" target="_blank">þ˽˹Ʒ</a>| <a href="http://www.zhhhtch.cn" target="_blank">Ʒþùһ㽶 </a>| <a href="http://www.zjjhart.cn" target="_blank">þۺŷ</a>| <a href="http://www.xspree.cn" target="_blank"> þۺϺݺۺϾþü </a>| <a href="http://www.xiangxiangren.cn" target="_blank">þþþþҹƷƷ </a>| <a href="http://www.taoxh.cn" target="_blank">AVһȾþ </a>| <a href="http://www.shdad.cn" target="_blank">ҹþþþþþþþ</a>| <a href="http://www.52cxw.cn" target="_blank">ԭ1769þѲ</a>| <a href="http://www.sjpeixun.cn" target="_blank">þҹҹݺ2022</a>| <a href="http://www.828wlp.cn" target="_blank">þþƷӰѿ</a>| <a href="http://www.hotdee.com.cn" target="_blank">ҹþþþþþþþ</a>| <a href="http://www.movie38.cn" target="_blank">þþþó˾Ʒ</a>| <a href="http://www.kuruishanghai.cn" target="_blank">Ʒþþþþô</a>| <a href="http://www.wtx123.cn" target="_blank">þһѵ</a>| <a href="http://www.jingxuan001.cn" target="_blank">˾Ʒþ޸岻</a>| <a href="http://www.dfpt.net.cn" target="_blank">ŷ޾ƷþþavӰ </a>| <a href="http://www.guwanwei.cn" target="_blank">þѿaëƬ</a>| <a href="http://www.gongnian.cn" target="_blank">ƷžžþƵ </a>| <a href="http://www.wlka6.cn" target="_blank">þþþþëƬѿ</a>| <a href="http://www.santoncc.cn" target="_blank">99þþƷձһ</a>| <a href="http://www.ptrjmfv.cn" target="_blank">þþƷһWWW</a>| <a href="http://www.ceovod.cn" target="_blank">þɫ</a>| <a href="http://www.um258.cn" target="_blank">ۺϾþһ</a>| <a href="http://www.r7831.cn" target="_blank">þۺɫ</a>| <a href="http://www.366509.cn" target="_blank">޹˾Ʒ91þþ</a>| <a href="http://www.lshwn.cn" target="_blank">þó18վ</a>| <a href="http://www.buniaowan.cn" target="_blank">˾þþƷ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>