我目前正在编写一个游戏,现在遇到了一个问题。
在我的游戏中,如果我在自定义 SurfaceView 类上覆盖框架布局,我的帧速率将根据 Framwlayout 中放置的视图控件数量而下降。
我正在使用框架布局来放置一些游戏控件和文本视图以进行点显示。
我想过直接在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 小部件在 SurfaceView 顶部(覆盖)的大小,则不会发生 FPS 的滞后和下降,这让我认为问题与渲染无关......
没有简单的解决方案。为了确保我首先使用 TraceView 来检查性能瓶颈的真正位置。现在,如果这个瓶颈确实与Android Widgets有关(很可能是因为将SurfaceViews与Android Widgets相结合是昂贵的),你可以尝试这样做。
getWindow().setFormat(PixelFormat.RGB_565);
holder.setFormat(PixelFormat.RGB_565);
这可能有助于提高表面合成的性能,但您将失去 Alpha。还要确保你的精灵具有相同的格式。如果这没有帮助,您要么需要使用更少的小部件,要么开始在画布上绘制您自己的小部件。但一定要看看像AndEngine这样的游戏引擎。无需为基本任务重新发明轮子:-)
另一个想法:您是否在所有设备上或仅在平板电脑上看到性能问题?根据我的个人经验,平板电脑对性能问题更加敏感,因为与GPU功率相比,它们的像素数更高。那么,您是否在清单.xml中激活了硬件加速?