• iPad到底是什么?

    恕我孤陋寡闻,一直对Apple的平板电脑没有过多的关注,以为就是一台带触摸屏的Macbook。在我的Macbook Pro被盗后,还准备买一台进行iPhone的开发工作。但随着iPad新闻的发布,我发现iPad不过就是一台大号的iPod Touch。我觉得有下列弱点:


    • 不支持后台运行 – 这无疑是iPad的致命弱点。如果说iPod Touch和iPhone不支持多任务是为了最优化的用户体验,我还可以理解。但作为一台拥有如此先进的OS的电脑,我不知为何Apple一直抱定这个设计理念。简直让人觉得回到了DOS时代。
    • 不支持Flash – 仍然无法像使用普通浏览器一样访问Flash支持的网站。使其网络浏览功能大打折扣。
    • 不带摄像头 – 在视频聊天如此流行的今天,在这样一个高端的设备上,加上一个前置摄像头应该是必备的选择吧? 
    • 大尺寸的屏幕 – 这也是缺点?没错。虽然我觉得大屏幕确实有许多好处(特别是看电子书),但是如果它具有Laptop或Tablet的尺寸而仅仅具有掌上电脑的功能,这应该是缺点多过优点了。另外,试想一下,拿着这么个大家伙在地铁上摇头晃脑地玩着保龄或赛车游戏,是不是有那么点脑残?


    总而言之,我觉得iPad的设计理念互相矛盾,定位不明确,它不过是苹果公司另一个噱头,它的出现无非是进一步利用其极其成功的App Store模式,最大地获取利润的一种方式罢了,因此我并不看好它的前景,大家觉得呢?


     
  • “完美”安装雪豹,Windows 7双系统再续 – 开启QE/CI

    经过一天一夜的奋斗,终于搞定QE/CI的启动。在这里必须要感谢一下Insanelymac的riws朋友,从他那里学到了不少东西。下面介绍一下我的步骤,希望对大家有所提示和帮助。


    几个关键


    1. DSDT – 先前试过许多方法都没有效果,于是试一下DSDT方法。安装在/Extra下。此DSDT.aml使用了MSD 和 DTGP方法(请别问我,我也不太懂)。此dsdt.aml仅包括与显示有关的部分,其他部分已删除,使用GMA950(27a2)的用户尽管放心使用。(记住移除EFI String)
    2. 使用原版驱动,安装在/System/Library/Extensions下。将所有与显卡有关的驱动从/Extra/Extensions中删除。安装1.6.6驱动。修复权限后,重启。
    3. 不幸的是,虽然分辨率可调了,但QE/CI仍然没有如愿开启。使用kextstat命令,发现AppleIntelGMA950.kext并没有加载。使用 sudo kextutil /System/Library/Extensions/AppleIntelGMA950.kext 命令手动加载驱动,发现权限错误。使用下列命令:

      sudo su
      chmod -R 755 /System/Library/Extensions/*
      chown -R root:wheel /System/Library/Extensions/*

    4. 重启后,使用-f,但发现AppleIntelGMA950.kext仍没有自动加载。但使用kextutil加载kext时没有错误发生。再次使用kextstat,发现系统同时加载了AppleHDA和VoodooHDA(0.2.53),这两者是有冲突的。所有我删除了AppleHDA.kext后,重启。
    5. 一切正常,什么截屏,看图,水波纹,应有尽有了。有一个简易的方法测试是否QE/CI已经开启,使用OpenMark测试。


    虽然我的无线网卡还不能使用,但通过网卡上网没有问题。现在开始,我又可以开始iPhone的开发工作了。

     
  • “完美”安装雪豹,Windows 7双系统续 – GMA950显卡驱动研究

    我在“完美”安装雪豹,Windows 7双系统一文中提到所谓“完美”的安装是不存在的。昨天,我准备写一篇有关iPhone编程的文章时就发现了问题 – 无法截屏。上网搜了一下,问题的根源在于我的QE/CI没有开启。


    QE指Quartz Extreme,是利用显卡GPU的界面加速引擎。CI是Core Image,指利用显卡GPU的图片处理引擎,它也担任绘制OSX中3D效果的任务(比如水波纹,3D Cube))。至于QE/CI没有开启的后果是什么,除无法截屏外,我目前还不太清楚。(OpenGL ES功能完全正常,我已经测试过了,可能那些使用QE或CI的程序不能正常工作了吧)。


    经过大量的测试,目前我仍然没有找到解决的办法,不过测试的结果可能会对大家有所帮助。先介绍一下我的显卡:

    GPU:         GMA 950
    VRAM:        64MB of Shared System Memory
    
    Device ID:    0x27a2
    Vendor ID:    Intel (0x8086)
    Revision ID:  0x0003
    Resolution:   1440x900
    Depth:        32 Bits Color (ARGB8888)


     测试结果:(全部在32位下测试,我是用安装在Windows 7下的变色龙2.0 rc4启动)

    1. 使用原始驱动1.6.6.25,启动后黑屏,外接显示器能工作但分辨率不对
    2. 移除AppleIntelIntegratedFramebuffer.kext后,能正常启动,但分辨率固定在1024×768,QE/CI未开启
    3. 使用修改后1.4.20.28版AppleIntelIntegratedFramebuffer.kext,出现“五国”,无法进入系统
    4. 将修改后1.4.20.28版AppleIntelIntegratedFramebuffer.kext移动到/Extra/Extensions下后,正常启动,令人惊奇的是分辨率可以修改了,但QE/CI仍然无法开启。
    5. 有人介绍说使用EFI String可以启动QE/CI,于是修改了/Extra下的com.apple.Boot.plist,加入了GMA 950的EFI String,再次进行以上测试,但结果完全一样。


    我的结论:

    • 要正常启动,修改分辨率的关键是AppleIntelIntegratedFramebuffer.kext
    • 是否使用EFI String对开启QE/CI毫无影响


    不知各位朋友,有无在雪豹上成功开启GMA 950的QE/CI的经验?望分享。

     



     
  • 怎样编写Apple Push Notification服务器

    iPhone OS 3.0一个引入注目的新特性是push notifications(推送通知),它允许向已安装相关应用程序的各设备直接发送消息。苹果在新闻提示或IM应用中展示了此特性,它也十分完美地适合于我们的服务器监视服务程序Server Density


    Server monitoring iPhone application alert view

    读文章 »

     
  • “完美”安装雪豹,Windows 7双系统

    我的两台笔记本电脑被偷,其中就包括我用来开发iPhone程序的Macbook Pro。一想起来就有些气愤,实在不想再掏钱去买一台。好在我还有一台闲置的Dell 640m,于是决定装雪豹和Windows 7双系统。


    先看看我的配置:

    CPU:          Intel 酷睿双核 T2300 1.66GHZ
    芯片组:    945GM
    内存:       DDR2 1.5G
    集成显卡:  GMA950 (id 27a2)
    硬盘:       SATA 5400rmp
     

    读文章 »

     
  • 开始学习iphone编程之六 – 简单示例代码

    下面有一些iPhone OS 3.0的范例代码。这些代码都是没有使用Interface Builder的。作为初学者,用这种方法可以更清晰的知道程序是怎样创建用户接口的。

    读文章 »

     
  • 跨平台游戏引擎开发实录之一 – 设计文档

    我目前正在开发一个跨平台游戏引擎,我准备将整个开发过程通过博客记录下来。欢迎各位朋友提出宝贵意见。


    下面是我的设计文档初稿。


    项目名称

    Portable Game Engine (PGE )


    目标

    • 跨平台,希望能支持Windows,Linux,Mac OSX,iPhone,WinCE, Android, Blackberry, Symbian phone 等
    • 简单,尽量简化编程接口
    • 2D和3D
    • 组件可选,以减小目标代码
    • 支持Unicode


    组件

    • 核心:游戏主循环,线程,垃圾收集,插件等
    • 图形系统(采用OpenGL或OpenGL ES):图像(纹理),动画,字体
    • 声音系统(采用OpenAL):音效,音乐,乐器
    • 资源管理器:压缩/解压,加密/解密
    • 输入:键盘,鼠标及触摸屏(重力感应)
    • 网络:Tcp/ip,Http, UDP
    • GUI(用户接口):菜单,文本,按钮,列表框,下拉框,选择框
    • 游戏AI
    • 游戏Physics


    开发按阶段进行。第一阶段开发Windows下的OpenGL 2D引擎,然后移植到iPhone下。

     
  • 抢钱系列之二 – iPhone App Store还能赚到钱吗?

    (注:本文与第一篇文章的观点相反。不过我有些疑惑,我的游戏也持续几周排在二十五名前,可是赚的钱远远少过此数。)

     

    App Store的空前成功毫无疑问地造就了一些诸如iShoot和Trism之类的神话故事(这两个游戏我都喜欢)。同时,最近Apple宣布App Store中有逾25,000个程序而且有超过50,000付费的SDK开发者。看到这组数字,许多人可能想知道是否日益增加的竞争会导致成功的障碍。首先,我们定义一下“成功”的概念。对“名”而言,获得许多人的关注和认可就是成功。但是我在这里聚焦在“利”上。我们会问:是否大部分App Store中的程序都是消遣,或者在其背后都有一个生意实体存在?这些人们关注的问题我们都有答案。根据我们的数据,还有大量的机会通过iPhone程序,特别是游戏获取利润。然而像大部分视频游戏,电影和音乐产业一样,iPhone程序市场是“由命中率驱动的产业“,它意味着整个市场的利润集中在少数几个大赢家手里。也就是说,App Store中存在着更多的中产阶级;或者说许多公司还是能够获取可观的利润。通过iPhone程序与传统电信公司像Verizon 和 Sprint之类提供的游戏和程序的利润发布比较,这显得尤为可信。这是由于Apple在他们的App store中提供了大量的免费试用,更好的页面导航,社区评分以及更高级的搜索技术。对于开发者这意味着如果他们的软件具有很新颖的概念和实在的产品价值 – 即使没有很响亮的商标 – 只有做好宣传,他们就能获得足够的命中率而赚钱。但是,多少钱?一次点击价值多少?三个星期$750,000怎么样?它还不足以达到U2期望的新专辑(No Line on the Horizon – 消失的地平线)的利润,但已经接近了。我们用一个发布了免费和付费版本的解题游戏作为演示。两个版本都在它们各自的分类中排在前25名。

     

    App Store Hit - Installs over 3 week period

     

    三个星期之内,这个游戏获得了超过两百万下载,产生了大约 $750,000销售额。然而存在一个更大的疑惑,为什么这个程序可以赚怎么多钱,而其他25,000个程序没有?通过研究,答案就在:出色的概念,很好的用户体验,严密的市场分析以及聪明的发布计划。这些因素帮助它成为了畅销软件之一。然后订单就源源不断的到来。我们都知道App Store成长很快,点击率不断增加。要获得成功,开发者需要认真考虑定价以及怎样更有效地进行市场宣传。好消息就是,还是有利可图的,现在正是发布你的游戏的时候了。

     

    原文见:Can Developers Still Make Money in the iPhone App Store?

     
  • 从零开始学习OpenGL ES之五补遗 – setupView重写

    我在从零开始学习OpenGL ES之四 – 光效 一文中使用了一个普通GLfloat数组。由于它没有使用任何非OpenGL定义的数据结构,所以是最为普通和方便的方式。

     

    但在此我使用在第一部分定义的Vertex3D, Vector3DColor3D数据结构重写了 setupView:方法。并不是这种方法“更好”,但是它是一种不同的方式。当我第一次学习OpenGL时,我发现使用顶点,颜色和三角形的术语比可变长度浮点数组更容易理解。如果你和我一样,那么你会发现这个版本更容易理解。

     

    除了使用自定义数据结构外,我还减少了环境光元素的数量并将光源向右移动了一点。然后使用Vector3DMakeWithStartAndEndPoints()将移动的光源指向二十面体。这样做使得光效更为生动一点。

    -(void)setupView:(GLView*)view
    {
        const GLfloat zNear = 0.01, zFar = 1000.0, fieldOfView = 45.0;
        GLfloat size;
        glEnable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);
        size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
        CGRect rect = view.bounds;
        glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size /
                   (rect.size.width / rect.size.height), zNear, zFar);
        glViewport(0, 0, rect.size.width, rect.size.height);
        glMatrixMode(GL_MODELVIEW);
    
        // Enable lighting
        glEnable(GL_LIGHTING);
    
        // Turn the first light on
        glEnable(GL_LIGHT0);
    
        // Define the ambient component of the first light
        static const Color3D light0Ambient[] = {{0.05, 0.05, 0.05, 1.0}};
        glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient);
    
        // Define the diffuse component of the first light
        static const Color3D light0Diffuse[] = {{0.4, 0.4, 0.4, 1.0}};
        glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse);
    
        // Define the specular component and shininess of the first light
        static const Color3D light0Specular[] = {{0.7, 0.7, 0.7, 1.0}};
        glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat *)light0Specular);
        glLightf(GL_LIGHT0, GL_SHININESS, 0.4);
    
        // Define the position of the first light
       // const GLfloat light0Position[] = {10.0, 10.0, 10.0};
        static const Vertex3D light0Position[] = {{10.0, 10.0, 10.0}};
        glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position); 
    
        // Calculate light vector so it points at the object
        static const Vertex3D objectPoint[] = {{0.0, 0.0, -3.0}};
        const Vertex3D lightVector = Vector3DMakeWithStartAndEndPoints(light0Position[0], objectPoint[0]);
        glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector);
    
        // Define a cutoff angle. This defines a 50° field of vision, since the cutoff
        // is number of degrees to each side of an imaginary line drawn from the light's
        // position along the vector supplied in GL_SPOT_DIRECTION above
        glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 25.0);
    
        glLoadIdentity();
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

     

    你可以随意调整光的属性,增加额外的光源或二十面体,体验一下这些调整会为场景带来什么样的变化。这些东西是很难体验出来的,所以不要指望一晚上就理解了所有东西。

     

    原文见:setupView: from Part IV Rewritten

     
  • 从零开始学习OpenGL ES之六 – 纹理及纹理映射

    在OpenGL ES中另一种为多边形定义颜色创建材质的方法是将纹理映射到多边形。这是一种很实用的方法,它可以产生很漂亮的外观并节省大量的处理器时间。比如说,你想在游戏中造一个砖墙。你当然可以创建一个具有几千个顶点的复杂物体来定义每块砖以及砖之间的泥灰。

     

    或者你可以创建一个由两个三角形构成的方块(四个顶点),然后将砖的照片映射上去。简单的几何体通过纹理映射的方法比使用材质的复杂几何体的渲染快得多。

     

    读文章 »