2012-04-14 92 views
0

我目前正在写一个游戏,现在遇到了一个问题。android游戏surfaceview与framelayout慢

在我的游戏中,如果我在我的自定义surfaceview类上覆盖framelayout,根据在framwlayout中放置多少个视图窗口小部件,帧速率将下降。

我使用FrameLayout里放置一些游戏控制和点显示textviews ..

我想过直接在gameloop的surfaceview实施控制,但基本上摧毁Android的UI组件的目的加必须移动XML才容易得多。

如何解决这个问题?

这里是我的代码: XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/FrameLayout1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<com.sora.game.npc.Panel 
    android:id="@+id/myview1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

<GridLayout 
    android:layout_width="wrap_content" 
    android:layout_height="179dp" 
    android:columnCount="8" 
    android:rowCount="5" android:layout_gravity="bottom|left" android:visibility="visible"> 

    <Button 
     android:id="@+id/upleft" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_column="0" 
     android:layout_gravity="bottom|right" 
     android:layout_row="0" 
     android:text="↖" /> 

    <Button 
     android:id="@+id/up" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_column="1" 
     android:layout_gravity="bottom" 
     android:layout_row="0" 
     android:text="↑" /> 

    <Button 
     android:id="@+id/upright" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_column="2" 
     android:layout_columnSpan="4" 
     android:layout_gravity="bottom" 
     android:layout_row="0" 
     android:text="↗" /> 

    <Button 
     android:id="@+id/left" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_column="0" 
     android:layout_gravity="bottom" 
     android:layout_row="1" 
     android:text="←" /> 

    <Button 
     android:id="@+id/vdp" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_column="1" 
     android:layout_gravity="bottom" 
     android:layout_row="1" 
     android:text="⥁" /> 

    <Button 
     android:id="@+id/right" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_column="2" 
     android:layout_columnSpan="4" 
     android:layout_gravity="left" 
     android:layout_row="1" 
     android:text="→" /> 

    <Button 
     android:id="@+id/downleft" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_column="0" 
     android:layout_gravity="right" 
     android:layout_row="2" 
     android:text="↙" /> 

    <Button 
     android:id="@+id/down" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_column="1" 
     android:layout_gravity="left" 
     android:layout_row="2" 
     android:text="↓" /> 

    <Button 
     android:id="@+id/downright" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_column="2" 
     android:layout_columnSpan="4" 
     android:layout_gravity="left" 
     android:layout_row="2" 
     android:text="↘" /> 

    <Space 
     android:layout_width="1dp" 
     android:layout_height="47dp" 
     android:layout_column="0" 
     android:layout_gravity="fill_horizontal" 
     android:layout_row="1" /> 

    <Space 
     android:layout_width="61dp" 
     android:layout_height="1dp" 
     android:layout_column="1" 
     android:layout_gravity="fill_horizontal" 
     android:layout_row="0" /> 

    <Space 
     android:layout_width="30dp" 
     android:layout_height="1dp" 
     android:layout_column="2" 
     android:layout_gravity="fill_horizontal" 
     android:layout_row="0" /> 
</GridLayout> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:drawingCacheQuality="high" 
    android:visibility="visible" > 

    <TextView 
     android:id="@+id/life" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Life" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/score" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:text="Score" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/npcqt" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="NPC quantity" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <Button 
     android:id="@+id/strike" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/score" 
     android:layout_marginTop="67dp" 
     android:text="strike" /> 

    <Button 
     android:id="@+id/fire" 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:text="----Fire!----"/> 

    <Button 
     android:id="@+id/cycle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/strike" 
     android:text="cycle" /> 

</RelativeLayout> 

</FrameLayout> 

编辑:我做了一些实验:

,如果我扩大我的自定义视图面的大小,没有UI部件都在上面(覆盖)表面视图,FPS的滞后和下降不会发生,这使我认为问题是没有渲染相关....

回答

1

我不认为有一个简单的解决方案。 只要确定我会首先使用TraceView来检查性能瓶颈究竟在哪里。 现在,如果这个瓶颈确实与Android Widgets有关(它最有可能是因为将SurfaceViews与Android Widgets结合起来已知代价高昂),您可以尝试执行此操作。

getWindow().setFormat(PixelFormat.RGB_565); 
    holder.setFormat(PixelFormat.RGB_565); 

这可能有助于表面合成的性能,但是会失去alpha。还要确保你的精灵有相同的格式。 如果这不起作用,您可能需要使用较少的小部件或在画布上开始绘制您自己的小部件。但一定要看看游戏引擎像AndEngine。不需要重新开始基本任务:-)

另一个想法: 您是否看到所有设备或仅在平板电脑上出现性能问题? 在我的个人体验中,平板电脑对性能问题更为敏感,因为它们的像素数量与其GPU性能相比要高一些。那么你是否在manifest.xml中激活了硬件加速?

+0

“这很可能是因为将SurfaceViews与Android Widgets结合在一起被称为是昂贵的”真的吗?我以前不知道! – tom91136 2012-04-14 15:32:53

+0

我编辑了我的问题;我会马上尝试硬件加速! – tom91136 2012-04-14 15:36:01

+0

不,硬件加速不起作用,它什么都不做 – tom91136 2012-04-14 15:37:11