我正在为Android构建一个Unity应用程序,它可以动态加载大量的大纹理(所有图像的大小都超过6MB).这些纹理可以来自Amazon S3服务器,在这种情况下它们以流的形式出现,或者来自用户的设备本身.
在这两种情况下,我都可以异步地保持原始数据或纹理而不会出现问题.在第一个我查询服务器并获得带有数据流的回调,在第二个我使用WWW类来获取使用"file://"协议的纹理.
一旦我想将这些数据复制到Texture2D到我可以使用的某个地方,例如在Texture2D私有成员上,问题就会发生.
使用流我将其转换为byte []并尝试调用LoadImage(),而使用WWW类我只需尝试使用myTexture = www.texture进行复制.在纹理加载或复制时,我都会得到一个巨大的帧.我想彻底根除这个框架,因为App简直无法发布.
using (var stream = responseStream)
{
byte[] myBinary = ToByteArray(stream);
m_myTexture.LoadImage(myBinary); // Commenting this line removes frame out
}
...
WWW www = new WWW("file://" + filePath);
yield return www;
m_myTexture = www.texture; // Commenting this line removes frame out
Run Code Online (Sandbox Code Playgroud)
不幸的是,Unity似乎不喜欢在主线程的单独线程上运行这些操作,并在我尝试时抛出异常.
有没有什么方法可以将这些操作分块,以便需要多个帧?或者做一些不会拖延主线程的快速memcopy操作?
提前致谢!
PS:我在以下回购中创建了一个问题的工作示例:https://github.com/NeoSouldier/Texture2DTest/
我对C++的有限理解意味着我不知道如何正确地执行以下操作:
#include "Platform.h"
#include "Global.h"
SDL_Surface *ms_pSmall (Global::sharedGlobal()->loadImage(RESOURCE_SMALL_PLATFORM) );
SDL_Surface *ms_pMedium(Global::sharedGlobal()->loadImage(RESOURCE_MEDIUM_PLATFORM));
SDL_Surface *ms_pLarge (Global::sharedGlobal()->loadImage(RESOURCE_LARGE_PLATFORM) );
//Initialise platform variables
Platform::Platform()
{
int imgSize = rand() % 3;
switch (imgSize)
{
case 2:
m_pImage = ms_pSmall;
break;
case 1:
m_pImage = ms_pMedium;
break;
case 0:
m_pImage = ms_pLarge;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
其中ms_pSmall等是静态指针,Global是具有以下函数声明的单例:
static Global* sharedGlobal();
SDL_Surface* loadImage(const std::string& filename) const;
Run Code Online (Sandbox Code Playgroud)
代码似乎正确编译但链接器抱怨:
Undefined symbols for architecture i386:"Platform::ms_pMedium", referenced from:
Platform::Platform() in Platform.o "Platform::ms_pLarge", referenced from:
Platform::Platform() in Platform.o "Platform::ms_pSmall", referenced from:
Platform::Platform() in …Run Code Online (Sandbox Code Playgroud) 我正在 Unity 中构建一个客户端 Android 应用程序,当它从 AWS S3 服务器下载 jpg 时,结果会以 System.IO.Stream 的形式返回。
然而,我对 Mono 和 .Net 的了解有限,这意味着我正在努力弄清楚如何将这个 System.IO.Stream 数据块转换为 Unity 中的纹理,然后我可以将其设置在场景中的四边形上。
我在网上看到了一些有前途的代码示例,例如:var img = Bitmap.FromStream(stream);
据我所知,Unity for Android 不支持 System.Drawing.Bitmap - 有人有什么建议吗?
提前致谢!
(我用来从 AWS S3 下载的确切示例代码是 GetObject() 函数,可以在此处找到http://docs.aws.amazon.com/mobile/sdkforunity/developerguide/s3.html,但在其例如,他们使用 System.IO.StreamReader ,它仅适用于读取文本而不是图像的字节数据)
我正在尝试在 Android 应用程序的一些本机 C++ 代码中调用 OpenGL ES 2 函数,该代码是通过带有 Gradle 的 Android Studio 构建的。
但是,在调用任何单个 OpenGL 函数时,我都会遇到链接器错误,并且没有找到原因。
感觉它应该像以某种方式配置 Gradle 一样简单,但它只是不清楚如何这样做(特别是因为我几乎没有使用 Gradle 的经验)。
我在以下 Github 位置为我的问题创建了一个非常简单的测试用例:https : //github.com/NeoSouldier/GLESTest。
使用 Android Studio 打开项目,您将在“native-lib.cpp”文件中看到无法链接的代码。
如果有人能够正确获得此建筑物/链接,请告诉我我错过了什么!
谢谢!