//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// UI的渲染:
// flipcode@msn.com
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
一。批次渲染:
1. 在界面上的3d模型渲染及特效需要每帧渲染到贴图上再当UI来画,否则将会打乱渲染状态
2. 控件及文字按渲染顺序生成z值,然后将不透明的按贴图打包,先批次画不透明的控件和文字,再关掉z write按排序画非透明控件和文字.
优化方案:
由于透明的控件和文字很可能没法批次画(除非它们顺序画时都在同一贴图上),所以约定所有控件和文字只用alpha test方式
而不能用alpha blend方式,也就是说控件和文字只能用colorkey(为了效率忍痛去掉类freetype用alpha blend产生的一些自然过渡的效果)
并且尽量让所有控件所用图片都作成一两张图上。(文字则是程序为每种字体创建大概两张贴图cache, 并先缓存一些最常用的字)
二。去掉UI重叠部份的渲染:
1. 合并所有控件矩形ui_rect为一个全局多边形集g_merge_rgn(并集)
2. 从上往下顺序将所有控件矩形ui_rect与g_merge_rgn分别作交集测试, 成功则将交集存回UI控件ui_render_rect_rgn,
并且如果控件为非透明(控件已在上述“批次渲染”约定为非透明但可有colorkey)时将全局g_merge_rgn减去该ui_render_rect_rgn交集
3. 从下往上顺序遍历所有所有控件并用控件自己的矩形ui_render_rect_rgn画出控件
三。脏矩形渲染:
有了上述的"去掉UI重叠部份的渲染", 这步就容易了,只要在渲染时判断一下该控件是否更新过, 如果更新过则将更新过的rect与该ui_render_rect_rgn交集出新的rgn来画.
四。关于渲染可能出现的边线问题:
一般是纹理在缩放过渡时使用linear采样方式而控件使用UV寻址贴图中小格子块产生的(可在作图时将格子块象素外扩一圈,或者程序将UV内缩一圈来处理)
五。最后提下,要先渲染UI,再渲染场景,这样来避免无效的ps, 另外UI固定部分在渲染场景时可用viewport去掉。
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// 关于汉字输入相关:
// flipcode@msn.com
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
一。创建dialog模式设备:
为了不用自己渲染输入法框,也只好牺牲点性能,使用这种非真正独占的模式的设备。
二。接收输入汉字
1。可以直接使用windows消息的WM_CHAR,汉字高位是大于127的(有符号char<0)自己处理判断组合一下即可。
2。也可以使用IME的来处理
三。汉字长度
汉字有等宽字和非等宽字(普遍),非等宽字计算长度比较麻烦,需从头遍历。。。
四。非unicode汉字的截断处理
这个也比较麻烦,需从头遍历,如果使用unicode就没这个问题
五。汉字的显示
需要贴图缓存,再批次显示
六。表情符号混显:
关于表符号混显问题主要有两点,一个是排版(具体处理就略过了),一个是表情动画处理
表情动画可以简单的使用cximage读取解开各帧再整合到一张纹理上,按帧播放显示。
七。输入法定位:
由于输入法的处理一般是在消息回调函数里得到目标wnd句柄,然后定位到这个wnd位置上,如果游戏中不使用windows控件的话,输入法没法自动定位到自定义的。只能靠用户自己拖动。有一个简单的处理是创建一个不用于显示的假控件在对应位置让输入法得以定位。。。(魔域这个网游真的很邪恶,里面全部使用mfc控件,只是渲染使用directx来接管。。。)
八。输入法充许与关闭:
估计很多人会碰到这个问题,就是只在输入框打开时才充许有输入法,如下处理
m_hImc = ImmAssociateContext(hWnd, NULL); 来关闭,再使用ImmAssociateContext(hWnd, m_hImc); 来打开
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flipcode/archive/2009/06/22/4287894.aspx
posted on 2010-11-03 23:15
flipcode 阅读(250)
评论(0) 编辑 收藏 引用