• OpenGL ES纹理尺寸限制的处理方法

    大家都知道,OpenGL ES对纹理的尺寸有限制,就是长和宽都必须是2的整数次幂。(实际上OpenGL都有此限制,但有一些扩展可以解决此问题)。因此处理方案有两种:


    1. 将纹理尺寸限制为2的整数次幂。比如,我有一个480×320的背景图案,我可以用Photoshop将画布设置为512×512,在纹理映射时只使用480×320部分。当然我也可以将多个图案合成在一个纹理中,在纹理映射时根据图案的位置进行映射。
    2. 仍然使用正常的图像尺寸,但在使用时进行转换。下面是源代码:


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
            // 首先调整纹理的长和宽为2的整数次幂        
            if( (_width != 1) && (_width & (_width - 1)) )
            {
                    i = 1;
                    while((sizeToFit ? 2 * i : i) < _width)
                            i *= 2;
                    _width = i;
            }

            if( (_height != 1) && (_height & (_height - 1)) )
            {
                    i = 1;
                    while((sizeToFit ? 2 * i : i) < _height)
                            i *= 2;
                    _height = i;
            }

            // 如果调整后的图像尺寸大于最大纹理尺寸(1024),那么需要缩小
            while((_width &gt; kMaxTextureSize) || (_height &gt; kMaxTextureSize))
            {
                _width /= 2;
                _height /= 2;
                transform = CGAffineTransformScale(transform, 0.5, 0.5);
                imageSize.x *= 0.5;
                imageSize.y *= 0.5;
            }
     
  • OpenGL ES 3D物体加载示例

    前几天有位朋友向我询问有关3D物体加载的示例,记得以前看到过一个示例,就找来出来与大家分享:


    iPhone Wavefront Obj Loader


     
  • Apple禁止越狱者访问App Store?

    据称部分越狱者在“越狱”iPhone OS 3.1.3后,出现以下问题:

     

    image

     

    是否Apple开始了“反越狱”行动,目前还不得而知。不过要是无法使用“越狱”的iPhone,我相信iPhone的使用者将大幅度地减少,你认为呢?

     

    参见:http://www.examiner.com/x-8134-SF-Gadgets-Examiner~y2010m2d15-Apple-might-be-banning-iPhone-hackers
     
  • iPad/iPhone与多任务

    最近很忙再加上新年,所以很久没有更新博客了,抱歉。

     

    苹果即将推出的iPad到底具有哪些功能,可谓是众说纷纭。我最为关心的问题是到底iPad是否支持多任务,种种迹象表明答案是否定的。这让许多开发者包括我自己十分失望。缺乏多任务支持使得许多简单的功能都无法实现。记得一位朋友问过我关于在iPhone上实现闹钟功能的问题,这实在是一个简单的程序,可是在没有破解的iPhone上却没办法实现。(准确地说,是无法完美实现。你当然可以写一个运行于前台的闹钟程序,不再运行其它程序,可是它有多实用呢?另外还可以用Push Notification技术,不过这实在有点“大炮打蚊子”了。)

     

    实际上,iPhone OS(iPad也采用iPhone OS)本身是支持多任务的。苹果的的官方解释是CPU,内存的限制以及安全性的考量,所以只支持单任务。但对我而言,这些解释是站不住脚的。举个可能不恰当的比喻,尽管大部分人在大部分时候都不能一心两用,但谁规定了人在看书写文章时就不能同时听音乐,就不能做运动,如果是这样,上帝造人时干脆弄个开关,让人只能做一件事情算了。说道安全性就更不靠谱,上网或运行别人的程序当然有风险,但与我得到的好处相比,我宁愿承担风险,或者说我宁愿自己进行风险评估。更何况App Store不就是用来帮助人们对安装程序进行检查以降低风险的吗?如果这点风险都不愿承受的话,那么人最好不要吃药甚至不用吃东西,因为再好的药物都有可能带来副作用,食物可能包含对人体有害的物质。

     

    下图是一些移动平台有关多任务的对比,其优劣大家自己判断:

     

    image

     

    不过,iPad还会提供一个新的机制可以有限度地支持多任务,那就是支持Dashboard widgets。或许我们可以编写一些运行在后台的widget,谁知道呢?

     
  • 新春快乐!

    新年将近,祝各位新春快乐,身体健康,万事如意!


    2008520211942659_2

     
  • iPhone不是Mac Pro

    本文是关于通过Objective C++的强大功能提高iPhone程序的性能。通过讨论现实世界中Savoy的Spots应用程序遇到的问题,本文展示了通过3个步骤对程序进行优化使其顺利运行的过程。


    Spots


    读文章 »

     
  • iPhone是个“大嘴巴”

    newton-virus-objectsq

    TaranFx上有一篇文章介绍了一个名为SpyPhone的新的开源程序,它将当前iPhone SDK的“信息脆弱点”都完全曝光。下面是该文章的链接:


    SpyPhone程序从所有iPhone数据


    大家可能都听说过越狱iPhone用户可能遇到的一些问题。没有SDK的限制,许多用户的手机都被恶意程序通过默认的root密码劫持了。不像我们听说过的其它一些程序,SpyPhone仅利用公共API获取它显示的信息。它显示了:

    1. Email账户
    2. Wi-Fi 网络
    3. 电话使用信息及历史信息
    4. 位置信息
    5. Safari 搜索
    6. YouTube 搜索,历史和书签
    7. 照片
    8. 地址簿数据
    9. 键盘缓存


    在这里我们的目的并不是向大家大声抱怨安全,隐私问题,而是要看看到底该程序是怎样做的。SpyPhone的源代码可以在 git hub 下载,你可以自己看看到底它是怎样完成这些工作的。快速浏览了一下它的源代码,我们发现iPhone像 Macintosh电脑一样都包括一些文件夹,比如“Applications”, “Library”, “Root”等等。如果你安装了SDK,那么你可以在iPhone模拟器上找到这些文件夹。它们在:

    ~/Library/Application Support/iPhone Simulator/User


    这就是iPhone保存所有数据的地方。再看下SpyPhone的源代码,它的秘密就是利用这些文件夹和它们包含的文件。如果你再进一步,你会在iPhone模拟器的文件夹下发现:

    ~/Library/Application Support/iPhone Simulator/User/Library/Preferences/


    这里有许多 com.apple.SOMETHING.plist 文件。这些文件就是SpyPhone获取大部分数据的源头(其它数据可以通过SDK的其他部分,如地址簿访问,照片服务等)。它使用下面代码获取数据:

    
    NSString *path = @"/Library/Preferences/SystemConfiguration/com.apple.wifi.plist";
     
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
     
    if(!dict) return;
     
    NSArray *a = [dict valueForKey:@"List of known networks"];
     
    if(!a) return;

    NSString *path = @”/Library/Preferences/SystemConfiguration/com.apple.wifi.plist”;
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
    if(!dict) return;
    NSArray *a = [dict valueForKey:@"List of known networks"];

    if(!a) return;


    上面的代码获取程序运行其上的电话的网络信息,它包括在一个数组中。尽管有些担忧,但我认为它还并不是罪恶滔天。首先我知道Apple会拒绝这样的程序出现在App Store上。Apple对SDK可谓是了如指掌,所有它可以叫停所有的滥用其SDK的程序。


    但是该程序为神秘的App Store批准过程提出了一个挑战。令人难以置信的是获取进入世界上发展最快的软件市场的入场卷是如此的神秘。像SpyPhone这样截取“敏感”信息的代码随时可能发生而用户并不知情。虽然Apple可以监视对PLIST的访问,但我很容易就可以想像到某些程序具有绕过Apple检查的能力直到某天我们知道它出现在App Store上。


    例如,我有一个在线 XML 文档指定是否要运行截取用户信息的方法,在App Store审核期间将其设为NO而在获取批准后设为YES,开始收集用户数据。所以尽管Apple有很好的方法来防止恶意程序,但我确信有许多方法可以逃过Apple的检查。所以我产生了最后一个问题,大家是否宁愿程序不具有使用这些信息的能力?没有照片,没有地址簿,没有wifi侦测,程序mail限制。大部分这些使iPhone变得精彩的程序都被“安全隐患”包围着。大家怎么看?是否Apple应该至少关闭系统PLIST的访问?


    原文见:The iPhone is Bad at Keeping Secrets
     
  • 使用UIImagePickerController从iPhone照片库或照相机获取图像

    本文讲述使用3.0的方法怎样从iPhone的照片库或照相机获取图像。


    我们将创建一个应用程序从图片库或照相机获取图像并显示与屏幕之上。下面是截图:


    photo 2

    读文章 »

     
  • iPhone程序的文档目录

    最近实在太忙,手头上的事情还没有完成,因此正在进行的几篇有关OpenGL ES的文章只能推后了。


    今天介绍一下怎样获得iPhone程序的文档目录(通常用来存储用户数据),方法一:


    1
    2
    NSString* documentsDirectory  = [NSHomeDirectory()
            stringByAppendingPathComponent:@"Documents"];


    方法二:


    1
    2
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
     
  • iPad到底是什么?

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


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


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