8的软件 开发经验总结
                        -- 移植黄金岛斗地主的经验分享
  by houss  2009.08.02

移植黄金岛斗地主到m8手机 ,是我第一次给wince平台写程序,过程中遇到了各种各样的问题 ,也走了很多的弯路;
  我想写这篇文章,可以使更多的人更快速的进入m8的开发队伍;

对于一些基础问题,请遵循这样的步骤去解决 :阅读m8的SDK 头文件 和帮助文档/使用msdn的帮助文档/网上搜索/论坛 问/qq群问;

一:图像显示接口
   给m8写程序,可以使用标准的wince窗口系统 和利用GDI来绘图;所以我用几天时间就让斗地主图形界面 在m8上跑起来了(当然问题还有很多); 这部分代码在WIN32的环境下也可以编译运行,说明兼容性很不错;  (当然程序也可以直接继承自CMzApp/CMzWnd,代码可以简单很多);
   用GDI遇到了些性能问题;游戏 使用BitBlt全屏最快只能跑到6帧;就开始尝试使用DDraw来解决; 这里我建议 不要使用flip模式,兼容性不好; 也不要lock住主表面直接往里面写,这也会遇到兼容性问题;而是将游戏画面都先绘制到一个后备表面,然后->Blt到主表面;这样就能兼容所有已经公布的固件 了! (成功绕过所有固件驱动bug)
   DDraw表面好像只支持RGB16(r5g6b5)模式,而不能成功启用24位或32位模式(GDI下也只能支持16位色),然而m8的屏幕 是支持24位颜色数的! 如果我们的软件不去支持就有点浪费了; 我们可以使用DDraw的覆盖面(Overlay)技术来启用24位色深显示! m8的SDK为我们包装了一个简单易用的类MzDDrawOverlay,使用它就可以实现了;
   在使用DDraw和覆盖图的时候,键盘输入会是个问题:软键盘弹出来了但看不见; 我的解决办法是键盘弹出的时候切换显示到GDI模式;

二:声音 播放 接口
  我原来的声音播放有一套基于DirectSound技术的实现;但在m8的wince平台上却没有该组件;在网上下载 了一个开源的DirectSound组件的替代实现,但播放还是有问题(乱响),没有找到原因; 最后干脆重写了声音播放模块,基于wavOut来实现了; 为了支持同时播放多个声音,需要启动不同的线程来打开(waveOutOpen)声音设备;
  游戏中m8上的声音控制键能够控制耳机 的 音量,但不能控制外放的音量;  m8上一直都保持一个全局的最大音量值, IMixer接口控制的是全局音量,调节该值可以控制音量,waveOutSetVolume也可以,在程序退出的时候,记得把它恢复成最大值;  其实 我不建议这样做;因为万一程序出现崩溃,系统音量就得不到恢复了,影响面太广给用户带来麻烦; 我的方法是自己控制传递给wavOut的pcm数据(乘以一个系数),从而达到控制音量的目的; 用waveOutSetVolume加打开的wavOut句柄做参数应该也可以更简单的做到;

三:网络
  网络我用的TCP/IP协议的socket,
  #include <Winsock2.h>
  #pragma comment (lib, "ws2.lib")
  然后使用标准的socket那套函数,win平台使用前需要WSAStartup;
  m8上,联网前可以用QueryNetWorkStatus来查询网络链接支持情况,如果没有网络链接可以用Dial_StartGprsConnect2来打开GPRS (或EDGE)网络;
  要支持cmwap联网,需要走有代理的http协议,我就没有那么多资源 来支持了;
  注意: wince上不支持recv函数的MSG_PEEK方式;

四:文件系统
  我用的c运行库那一套,fopen等等;

五:时间
  获得当前时间GetLocalTime;   启动计时器SetTimer  但他们的精度都太低了,只到秒;
获得系统重启动到现在运行了的时间GetTickCount,精度还不错;
  我建议使用mmtime那套高精度计时器: timeGetTime timeSetEvent   #pragma comment (lib, "mmTimer.lib")

六:多线程
  用的CreateThread那套函数,临界区用的CriticalSection; 都是win32标准的;

七:cab包
  0.9.0.4及以下固件不支持带压缩格式 的cab安装包;
  现在用得最多的0.9.0.5固件不支持包里面含有同名文件(当然是不同文件夹);我试过先改名再利用cab的重命名安装命令也没有绕过这个 bug(更高版本的固件试了可以安装);估计系统安装的时候先把所有文件解压到一个文件夹(这时重名的文件就被覆盖了);再移动到目的目录;  我的重名 文件非常多,没有办法只能自己写了一个简单的文件系统: 将所有文件合并成一个文件,并保存好文件路径和其起始位置; 所有的文件读取请求都先从这个总文件里找;

八: 其他:
   ansi字符串和unicode字符串的转换可以用这组函数:MultiByteToWideChar/WideCharToMultiByte

启动执行其他程序可以用ShellExecuteEx;  用"open"方式,我用它来调用浏览器打开一个网页

旋转屏幕用ChangeDisplaySettingsEx:  
bool rotateScreen(unsigned long dwRotaion,unsigned long& old_dwRotaion){//0 1 2 4
        DEVMODE settings;
    memset(&settings, 0, sizeof(DEVMODE));
    settings.dmSize = sizeof(DEVMODE);

settings.dmFields = DM_DISPLAYORIENTATION;
    ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL);
    old_dwRotaion = settings.dmDisplayOrientation;
        if (dwRotaion<0) return true;
    if (dwRotaion == old_dwRotaion)
        return true;

settings.dmDisplayOrientation = dwRotaion;
   return (DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &settings, NULL, 0, NULL));
}
  横屏代码: rotateScreen(0);

另外,我不建议程序修改CPU的自动节能;感觉作用不大,还是让它自己管理吧;

程序可能需要针对不同的固件进行不同的处理,但我没有找到访问固件版本号的接口,而且很多不同的固件使用了相同的版本号;
在没有找到通用的解决办法之前,我用了一段时间判断alarm.dll的md5值来确认固件版本的;

(如果在我移植斗地主之前有这样的一篇文章,我肯定能节省至少一半的时间)
本文章做了一些修正  请参看31楼 DreamMiniOne 的一些纠正和补充

大侠的文章对大家帮助很多啊,不过小弟有几点想补充一下:
一:图像显示接口
如果是DIB位图的话,BitBlt确实会比较慢,如果楼主用的是SDK中的ImagingHelper,即使在GDI模式下,速度应该也是不错的。一般的兼容位图480x780,在竖屏下作一次BitBlt大概只需要6ms。

二:声音播放接口
不需要把音频数据乘以系数来调整音量,waveOutSetVolume可以针对每一个打开的音频handle独立的调节音量的大小,并且不影响系统的总 音量。waveOutSetVolume的参数有点讲究,是一个32位的DWORD值,低16位代表左声道的音量,高16位代表右声道的音量,音量取值范 围是0 ~ 0xFFFF,但这个数值的单位貌似是db数,所以人耳听起来音量是非线性调节的,我用的简易公式是这样的,输入参数取值范围是0~100

void SetVolume(DWORD volume)
{
        if (hWaveOut != 0)
        {
                DWORD volumeToSet = (volume <= 0) ? 0 : (0x7FFFU + (volume * (0xFFFFU - 0x7FFFU) / 100));
                MMRESULT ret = waveOutSetVolume(hWaveOut, (volumeToSet & 0xFFFF) | ((volumeToSet & 0xFFFF) << 16));
        }
}

三:网络
如果要使用CMWAP访问网络
那么socket在connect的时候,连的地址的端口就要是代理的地址和端口
然后在第一次发送请求时,返回的数据要全部照收,然后抛弃掉,再重新发送一次,返回来的数据才是正确的。我是广东的移动卡测试的,发送的是http请求。

五:时间
GetTickCount的精度是10ms,其实够用了。

M8软件开发经验总结:移植黄金岛斗地主的经验分享相关推荐

  1. 【转】M8软件开发经验总结:移植黄金岛斗地主的经验分享

    by houss  2009.08.02 移植黄金岛斗地主到m8手机,是我第一次给wince平台写程序,过程中遇到了各种各样的问题,也走了很多的弯路; 我想写这篇文章,可以使更多的人更快速的进入m8的 ...

  2. unity许可证不可用_不可思议之梦蝶从PC版移植到Nintendo Switch经验分享(上)

    本文将分享队友游戏制作人李喆Unite 2019上的技术演讲-<不可思议之梦蝶>从PC版移植到Nintendo Switch经验分享. 受篇幅限制,本次演讲将分享二篇内容.本文将分享:需要 ...

  3. 关于软考(全国计算机技术与软件专业技术资格水平考试)经验分享

    关于软考(全国计算机技术与软件专业技术资格水平考试) 一.软考官方网址 http://www.ruankao.org/ 用百度搜索的话,会出现好多广告,十分烦人.这里就直接把官方网址贴上来,方便大家直 ...

  4. 从零开始学网安:Day1 部分基本软件、vm虚拟机、靶场安装经验分享

      本人目前"加里敦"大学大五,在准备今年计算机考研同时学习网络安全内容.本科智能科学与技术,传统网络安全小白一枚.这栏博客用以记载学习内容,不定期更新,希望能多多与大家交流,共同 ...

  5. 浅谈 4 款写作软件,让写作变得简单 | 经验分享

    每个人都需要写作.以写作为生的人便是作者. 感谢互联网的今天,可以让写作者一边创作,一边变现.这种方式减轻了写作者的生存压力,也增加了与读者交流的机会.但是通往职业作家的大门是敞开的,但却是狭窄的. ...

  6. 思迈特软件Smartbi数据可视化大屏设计经验分享

    大数据时代,我们最常听到的一句话就是"用数据说话".但数据本身是冰冷的数字,它很难直接告诉我们哪些数据是有价值的信息.只有通过合适的可视化工具来进行数据的展示表达,才可以使传递给使 ...

  7. 假防病毒软件从电脑移植到了 Android 平台

    以前有位女研究生点击网络钓鱼的链接.随即出现实时扫毒画面的方式,接着呈现了扫毒结果,跑出十余笔病毒数据,记录了被感染的计算机的具体位置,并提示她必须更新防病毒软件,而她在付费两千元后收到"防 ...

  8. BOA软件服务的移植和BOA服务的配置

    一.下载解压原码 创建sources目录用于存储未修改的原码 mkdir sources 进入目录并将boa-0.94.13.tar.gz文件(这个文件可以去网上搜索)放入该文件夹,并解压文件到上级目 ...

  9. 软件开发经验总结(容错性)

    20180206 软件开发经验总结(容错性) 容错性: 容错性是指软件检测应用程序所运行的软件或硬件中发生的错误并从错误中恢复的能力,通常可以从系统的可靠性.可用性可测性等几个方面来衡量. 可靠性对于 ...

最新文章

  1. python词云改颜色_使用Python创建一个与图像颜色匹配的词云
  2. 修改centos等linux的hostname-永久生效
  3. AIgorand的相关学习参考链接
  4. centos7安装csvn
  5. day34-2 类和对象(重点)
  6. 我今天学习的技术,明天会不会一钱不值
  7. Ubuntu server配置远程VNC服务
  8. C语言练习-[1008]成绩评定
  9. 计算机控制系统——数字控制器设计之模拟控制器的离散化(Chapter 5)
  10. Tews Technologies TPMC871 PCMCIA PMC 接口模块
  11. WEB自动化测试学习进度
  12. OCCT示例学习笔记3--Modeling项目
  13. 第三周项目4 穷举法
  14. 计算机组成原理 模拟机,面向计算机组成原理数学的MML模拟器
  15. 火影忍者ol HTML5,火影忍者OL-官方网站-腾讯游戏
  16. uva10158(并查集)
  17. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)
  18. 从Mpx资源构建优化看splitChunks代码分割
  19. Chapter7 机器人导航仿真(Ⅰ)----导航实现
  20. python中arcsec_如何使用Python将Gaia天体测量数据绘制成TESS图像?

热门文章

  1. 秒开IPTV服务器 互联网时代新享受
  2. 前端CSS的引用方式以及的CSS样式
  3. EDW项目中ODS源接口表清单维护方案
  4. 独立后台修复登录在线答题微信小程序源码下载
  5. java判断无线网卡,判断无线网卡是否支持5GHz频段
  6. /deep/与<<<
  7. Python之路 | 骰子游戏和最大数
  8. overflow:hidden作用
  9. 数据宝藏“淘金热”,腾讯云大数据愿做“卖铲人”
  10. 通知:清明节放假通知