0

私は現在ゲームを書いていますが、問題が発生しました。

私のゲームでは、フレーム レイアウトをカスタム サーフェス ビュー クラスに重ねると、フレーム レイアウトに配置されたビュー ウィジェットの数に応じてフレーム レートが低下します。

フレームレイアウトを使用して、ポイント表示用のゲーム コントロールとテキストビューを配置しています。

ゲームループのサーフェスビューにコントロールを直接実装することを考えましたが、それは基本的に 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のラグとドロップは発生しないため、問題はレンダリングに関連していないと思います....

4

1 に答える 1

1

簡単な解決策はないと思います。念のため、最初に TraceView を使用して、パフォーマンスのボトルネックが実際にどこにあるかを確認します。このボトルネックが実際に Android ウィジェットに関連している場合 (おそらく、SurfaceView と Android ウィジェットを組み合わせるとコストがかかることが知られているため)、これを試すことができます。

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

これはサーフェスの合成のパフォーマンスに役立つ可能性がありますが、アルファが失われます。また、スプライトが同じフォーマットであることを確認してください。これで問題が解決しない場合は、使用するウィジェットを減らすか、キャンバス上に独自のウィジェットを描画し始める必要があります。ただし、 AndEngineなどのゲーム エンジンを確認してください。基本的なタスクのために車輪を再発明する必要はありません:-)

別のアイデア: パフォーマンスの問題はすべてのデバイスで見られますか、それともタブレットでのみ見られますか? 私の個人的な経験では、タブレットは GPU パワーに比べてピクセル数が多いため、パフォーマンスの問題に対してはるかに敏感です。manifest.xml でハードウェア アクセラレーションを有効にしましたか?

于 2012-04-14T15:20:14.953 に答える