2010-02-17 86 views
20

我正在创建一个游戏使用irrlicht c + + 3D图形引擎端口到android平台。图形引擎是用C++编写的。我需要能够从C++代码加载网格和纹理等。我目前的计划是将所有游戏资源文件放在res/raw目录或资产目录中,然后在启动时将这些文件复制到SD卡中,以便它们可以从irrlicht C++代码访问。 这是使游戏媒体文件可从C++访问的最佳方式吗?Android:如何使游戏资产文件可读取使用ndk

回答

9

有几种方法可以做到这一点...他们每个人都有自己的限制,所以如果不了解更多关于您的情况,我不能给出好的建议。这里有一些链接,与一些建议的讨论,可以帮助您解决:

http://groups.google.com/group/android-ndk/browse_thread/thread/842ca9d7d82995b0

http://groups.google.com/group/android-ndk/browse_thread/thread/4e25a5dfd46f8fea/1269bcd10bdb066d?lnk=gst&q=apk+compressed#1269bcd10bdb066d

我可以给你更具体的建议,如果我知道一)有多少资源需要访问B)您将遇到的最大资源的大小,更具体地说,是您的所有资源<未压缩的大小为1MB?

+0

那些是我以前没有找到的好线索。这里是另一个我发现有用http://thedevelopersinfo.com/2010/01/13/working-with-sdcards-filesystem-in-android/ 游戏还没有很好的定义,但这里有一些appoximations 的文件,我会需要访问C++ 约8个约400k大小的网格(3.2MB) 约8个大约50k大小的纹理(0.4MB) 约20个大小约为20K的纹理(0.4MB) 1个质感193K(0.193MB) 总计大约4.2MB 另外一个视频249K和一些声音效果306K,但这些将在res/raw文件夹中并在Android媒体播放器中播放 – slytron 2010-02-18 01:46:27

+1

好的,我问的原因是似乎有1MB的未压缩文件大小限制每个资源,并且似乎也有一个最大资源数为512.因为它看起来像你是联合国对于这两者,您可以将所有资源放在“/ assets”文件夹中,然后使用AssetManager类访问它们。如果您的APK是zipaligned,那么AssetManager会为您提供内存映射文件,这将大大提高速度。 – cjserio 2010-02-18 13:18:09

+0

谢谢。我相信我有我需要做的。 – slytron 2010-02-18 13:29:15

1

理论上,您可以将InputStream传递给本机C++代码并让它调用它的方法。你甚至可以在这些之上实现一个istream。不过,我认为这不是你想要的。

请记住,APK中的资产文件不会作为文件存储。他们被压缩并存档 - APK实际上是一个重命名的ZIP文件。所以我建议将资源从Java内部复制到数据文件夹中,然后将该副本的文件名传递给C++。

顺便说一句,这完全排除了写入这些资产。