2012-04-14 123 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