基于SDL2的Android游戏开发手记 S1

0001 最近开始搞Android上的游戏开发,动力是几个月前拿着自己的游戏小作品和魏铮老湿讨教。魏老湿问我干啥不做移动平台,市场大。我说那个底层设计的太不成熟了(事实证明也真是这样),老湿就反问:“你是愿意做没有前途的,成熟的平台,还是愿意做有前途的,不成熟的平台?”“一个平台该怎么成熟起来?”

0002 于是开始各种SDK NDK的折腾。NDK虽说有for win的,但是要cygwin才可以用,新版已经不再支持MinGW MSYS。然而cygwin极为蛋痛,所以要开发Android NDK应用,最好就别用Windows,改用Linux较新的发行版:注意是较新的,也就是不要用CentOS和Debain,哪怕他们真的很稳定。如果不想和Ubuntu发生关系,可以学我用Fedora。

0003 如果你是要开发一个APK作为产品,素材的发布是个大问题:NDK无法直接访问APK包中的任何素材。网上通行的做法是用JNI框架传递assets/目录下数据,但是这样的性能开销不用我说太大了!正确的方法应是在Java程序中保存assets到SD卡上一个位置(判断如果没有保存过),然后在NDK中读出来,这样代价最小,在素材包发展到很大也不会很慢。

0004 保存到哪里呢?Android其实给每个程序提供了一个目录:/data/data/<apk name>/files。用标准的Java文件流读写没有目录的文件名时实际读写的就是这个目录。这个目录现在即便是root了的手机也会访问不了,网上说法大多已过时。在adb shell中访问data目录的正确方法是使用run-as命令:

脚本启动于 2014年08月01日 星期五 12时57分12秒
[coleman@localhost org.sdl.testdrawchessboard]$ adb shell
shell@android:/ $ run-as org.sdl.testdrawchessboard                          
shell@android:/data/data/org.sdl.testdrawchessboard $ ls files
a.txt
bg.bmp
shell@android:/data/data/org.sdl.testdrawchessboard $ cat files/a.txt
Hello everybody!
shell@android:/data/data/org.sdl.testdrawchessboard $ exit
shell@android:/ $ exit
[coleman@localhost org.sdl.testdrawchessboard]$ exit
exit

0005 哪里可以看出Android不成熟呢?就是网络上很多人的说法都是有问题的,他们能给你提供思路,也会给你带来麻烦,例如Assets的读写,网上的代码里居然有写成static方法的。下面我贴一下java的转储asset的方法实现:

    public void writeFile(String fileName, byte [] bytes) throws IOException
    {
        FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);
        fout.write(bytes);   
        fout.flush();   
        fout.close();
    }
    public byte[] getAssetContents(String path) throws IOException
    {
        InputStream is = getAssets().open(path, AssetManager.ACCESS_BUFFER);
        byte buffer[] = new byte[is.available()];
        is.read(buffer);
        return buffer;
    }
    public void dumpAsset(String name)
    {
        try
        {
            writeFile(name, getAssetContents(name));
        } catch(IOException e)
        {
            e.printStackTrace();
        }
    }


你可能感兴趣的:(基于SDL2的Android游戏开发手记 S1)