基于Adreno GPU SDK开发APK总结

一、APK简介
本文将介绍基于Adreno GPU SDK开发Smoke Model过程遇到的一些问题及解决办法。APK最终的效果为,当在搭载骁龙GPU的Android手机上运行Smoke APK时,将可以看到一个烟雾模型的效果,同时也可以在屏幕的四个角落分别显示APK的名字、FPS以及Logo等信息。

二、开发流程及问题解决
基于Adreno GPU SDK开发APK时,需要准备好开发环境,之后再基于SDK的Framework进行Scene编写,最后执行编译命令。这部分内容在我前面的博客中大家可以看到,其中描述了从环境搭建一直到编译运行的所有步骤。
本次开发过程中,我们将关于Smoke的源码都写在了fluid.cpp中,它对外提供的函数接口有Initialize、Update和Render。按照SDK的Framework定义,在scene.cpp文件中的Initialize下调用fluid.cpp中的初始化函数,在Render下调用fluid.cpp中的Update和Render函数,即可完成PC端到手机端的移植。
对于scene.cpp中上面提到的几个函数,大家可以搜索Adreno SDK,即可找到大量描述SDK Framework的内容,里面对几个主要函数的功能和使用进行了较为详尽的介绍。如果大家是要自己动手开发而非简单的阅读理解,则需要进SDK提供的框架中进行学习,下面为框架中FrmApplication_Platform.cpp中的Run():
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
CFrmAppContainer appContainer;
return (INT32)appContainer.Run();
}

BOOL CFrmAppContainer::Run()
{
m_pApplication = FrmCreateApplicationInstance();
if( NULL == m_pApplication )
return FALSE;
// Create the application window
if( FALSE == CreateNativeWindow( &m_hWindow, &m_hDisplay ) )
return FALSE;
// Create the render context
if( FALSE == m_pApplication->CreateRenderContext( m_hWindow, m_hDisplay ) )
{
MessageBox( NULL, L"Application failed to create render context!\n"
L"\n"
L"Please debug accordingly.",
NULL, MB_ICONERROR );
return FALSE;
}
if( ( FALSE == m_pApplication->Initialize() ) ||
( FALSE == m_pApplication->Resize() ) )
{
MessageBox( NULL, L"Application failed during scene initialization!\n"
L"\n"
L"Please debug accordingly.",
NULL, MB_ICONERROR );
return FALSE;
}
// Re-register the VK_SNAPSHOT hotkey so we can trap the PrtScn key for screen captures
UnregisterHotKey( GetParent( (HWND)m_hWindow ), IDHOT_SNAPWINDOW );
RegisterHotKey( GetParent( (HWND)m_hWindow ), IDHOT_SNAPWINDOW, 0, VK_SNAPSHOT );
// Show the parent window
ShowWindow( GetParent( (HWND)m_hWindow ), TRUE );
ShowWindow( (HWND)m_hWindow, SW_SHOW );
SetForegroundWindow( (HWND)m_hWindow );
SetFocus( (HWND)m_hWindow );
// Run the main loop
while( HandleEvents() )
{
// Update and render the application
m_pApplication->Update();
m_pApplication->Render();
// Present the scene
m_pApplication->SwapDrawBuffers();
}
return TRUE;
}
这里就指明了函数的调用流程,同时结合框架的介绍,相信大家对此也有了简单的认识。

问题描述及解决:
在按照上述流程走下来的时候,我们编译生成的APK只能显示屏幕四个角落的FPS和Logo等信息,中间部分为黑色。
1、接下来在解决问题的过程中,我们用到了log输出的方法,对函数调用过程中的关键部分抓取log,并将其输出到Android手机的指定目录下,这里抓取的log包括scene.cpp构造入口函数传入参数和fluid.cpp中所有的fluid.cpp中与OpenGL相关的gl函数。最终发现所有的流程都没有问题。
2、因为在PC上已经完美的实现了效果渲染,因此我们对fluid.cpp中Render函数关于背景部分,将其设为红色,再次进行编译运行,结果同最初一样,只是中间本来需要显示烟雾模型处变为了红色。最后把问题缩小到了fluid.cpp中的update函数里。
3、从上面的FrmApplication_Platform.cpp中可以看到scene.cpp中函数的调用流程,当我们把fluid.cpp中的Initialize、Update和Render都放在scene.cpp中的Initialize下并编译运行时,发现闪出了一帧图像,4~5s后APK闪退。通过这个效果可以看到是可以成功渲染的,只是由于框架里面什么东西导致了fluid.cpp中的buffer无法刷新到手机屏幕上面。
4、我们将关于屏幕四个角落显示的代码注释掉之后,发现Smoke Model成功渲染,成功将问题缩小到了fluid.cpp中Update函数里的Buffer中。
5、我们在Update函数里加入了“glBindVertexArray(QuadVao);”,并释放在scene.cpp中被注释掉的关于FPS和Logo相关代码,进行编译并执行。在Android手机上成功运行。
最后,因为算法部分原因,我们在Android手机上运行时,Smoke Model并没有如PC上一般显示,它会向屏幕的右半部分偏移。

三、总结
好了,以上就是本篇文章中所要分享的内容,大家有兴趣的话,可以查看我往期的博客,相信你一定会有所收获。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值