C# 二维沙盒地形生成的优化问题

C# 二维沙盒地形生成的优化问题,c#,unity3d,2d,lag,terrain,C#,Unity3d,2d,Lag,Terrain,我的游戏: 每个块都有一个在更新时不运行任何东西的类,并且有一个200 x 10的块跨度。稍后我将实现随机地形生成,这就是我想要做的 块代码:(在每个块中,我应该优化吗?还是以不同的方式进行优化?) 使用UnityEngine; 使用系统集合; 公共类scr_区块机制:单一行为{ //#可编辑变量 公共字符串块\块类型; 私人喷灌工; 公共布尔是可数的{get;set;} 公共布尔是随机生成的{get;set;} 公共bool isWall{get;set;} //#静态变量 游戏对象obj_

我的游戏:

每个块都有一个在更新时不运行任何东西的类,并且有一个200 x 10的块跨度。稍后我将实现随机地形生成,这就是我想要做的

块代码:(在每个块中,我应该优化吗?还是以不同的方式进行优化?)

使用UnityEngine;
使用系统集合;
公共类scr_区块机制:单一行为{
//#可编辑变量
公共字符串块\块类型;
私人喷灌工;
公共布尔是可数的{get;set;}
公共布尔是随机生成的{get;set;}
公共bool isWall{get;set;}
//#静态变量
游戏对象obj_区块项目;
//#开始
无效开始(){
obj_blockItem=GameObject.Find(“main_blockItem”);
spriteender=GetComponent();
如果(isRandomlyGenerated==false){
isMineable=假;
}
//#创建墙
/*如果(isRandomlyGenerated==true&&isWall==false){
//#TODO创建墙!
GameObject obj_blockWall=(GameObject)实例化(GameObject,transform.localPosition,Quaternion.identity);
obj_blockWall.name=obj_blockWall.name+“墙”;
obj_blockWall.transform.localPosition=新矢量3(
obj_blockWall.transform.localPosition.x,
obj_blockWall.transform.localPosition.y,
5);
已碰撞的R2D obj_blockWall_collider=obj_blockWall.GetComponent();
obj_blockWall_collider.enabled=false;
Color obj_blockWall_Color=Color.grey;//新矢量4(64,64,64,1);
spritterender spritterender_wall=obj_blockWall.GetComponent();
spriteRenderer_wall.color=对象_blockWall_color;
scr_blockMechanics blockMechanics_wall=obj_blockWall.GetComponent();
blockMechanics_wall.isRandomlyGenerated=true;
blockMechanics_wall.isMineable=false;//#TODO:还不可挖掘,因为它是一堵墙。
blockMechanics_wall.isWall=真;
obj_blockWall.name=块力学_wall.block_blockType+“墙”;
}*/
}
//#创建项目
void createItem(int-uid){
GameObject obj_blockItemNew=(GameObject)实例化(obj_blockItem,transform.localPosition,Quaternion.identity);
obj_blockItemNew.rigidbody2D.IsKinetic=false;
obj_blockItemNew.name=gameObject.name+“项目”;
}
//#破坏块
void-block(){
//打印(“'”+transform.name+“'已被销毁!”);
//spriteRenderer.color=color.red;
createItem(0);
销毁(转换游戏对象);
}
//#更新
无效更新(){
if(renderer.IsVisibleFrom(Camera.main)=true){
renderer.enabled=true;//gameObject.SetActive(true);
}
if(renderer.IsVisibleFrom(Camera.main)=false){
renderer.enabled=false;
}
}
}
“随机”地形生成

using UnityEngine;
using System.Collections;

public class scr_randomGen : MonoBehaviour {


    private SpriteRenderer spriteRenderer;
    private string[] block_blockTypes = new string[]{
        "DIRT",        //#UID 0
        "STONE",       //#UID 1
        "STONE_BRICK", //#UID 2
    };

    void GENERATE(){
        //#DEFAULTS
        GameObject obj_block = GameObject.Find("main_block");
        int pos_startingPosX = -100;
        int pos_endingPosX = 100;

        int pos_startingPosY = 0;
        int pos_endingPosY = 10;

        float X = 0;
        float Y = 0;
        //#TERRAIN GENERATION
        for(X=pos_startingPosX;X<pos_endingPosX;X=X+1){
            GameObject obj_blockNew = (GameObject)Instantiate(obj_block, new Vector3(0 + (1*X),0,0), Quaternion.identity);
            scr_blockMechanics blockMechanics = obj_blockNew.GetComponent<scr_blockMechanics>();

            blockMechanics.isMineable = true;
            blockMechanics.isRandomlyGenerated = true;
            blockMechanics.block_blockType = block_blockTypes[2];

            obj_blockNew.name = blockMechanics.block_blockType+" "+X+", "+Y;

            for(Y=pos_startingPosY;Y<pos_endingPosY;Y=Y+1){
                obj_blockNew = (GameObject)Instantiate(obj_block, new Vector3(X,1 + (1*Y),0), Quaternion.identity);
                blockMechanics = obj_blockNew.GetComponent<scr_blockMechanics>();

                blockMechanics.isMineable = true;
                blockMechanics.isRandomlyGenerated = true;
                blockMechanics.block_blockType = block_blockTypes[2];

                obj_blockNew.name = blockMechanics.block_blockType+" "+X+", "+Y;
            }
        }
    }

    void Start () {
        GENERATE();
    }

    void Update () {

    }
}
使用UnityEngine;
使用系统集合;
公共类scr_randomGen:单一行为{
私人喷灌工;
私有字符串[]块\块类型=新字符串[]{
“污垢”/#UID 0
“石头”,UID 1
“石砖”,UID 2
};
void生成(){
//#默认值
GameObject obj_块=GameObject.Find(“主_块”);
int pos_startingPosX=-100;
int pos_endingPosX=100;
int pos_startingPosY=0;
int pos_endingPosY=10;
浮动X=0;
浮动Y=0;
//#地形生成

对于(x= POSY StestPosix),席对每一个统一体都不太熟悉,但是看起来你好像在渲染所有的屏幕对象。为什么你不尝试等待交互来更新?“我得到130fPS(这仍然是我的观点)”——考虑到需要一个G-Salc监视器(你可以一手计算)。对于144 Hz,130 FPS真的很好(在非G-SYNC监视器上关闭VSYNC时过高的帧速率不算在内).2000对象并不多,但是我想知道您是否不应该更改渲染器。如果您知道自上一帧以来每个对象都没有更改,则为每一帧的每个对象启用
。此外,我会查看砖块的边界框,并将其与视图窗口进行比较,而不是始终使用摄影机反向投影“我也看过《人民报》的帖子,上面说在Unity中创造一款类似Terarria的游戏是可能的,但它总是很落后"-也许吧,但游戏看起来像是2D平台的合理实现,环境可破坏,它是用Unity 3D制作的。啊!我发现,每个区块都有一个脚本是减慢游戏速度的原因。如果它们不在相机的视野中,我就禁用了它们,现在我用数千个区块loa获得了200+FPS的速度我现在唯一的问题是,每当你破坏一个块,它就会减慢“主线程”下降2毫秒。我现在会想办法解决它。游戏运行平稳,除了一个错误,主线程变慢。我想这是因为它在摧毁一个区块后更新了整个游戏,可能很容易修复。建议?更新:抱歉所有的评论。但我修复了它。只有当它没有在游戏中最大化时,它才是滞后的。它是odd,但不管怎样。我对Unity不太熟悉,但似乎你每帧都在渲染所有屏幕对象。你为什么不尝试等待交互更新?“我得到130fps(在我看来仍然很低)”-考虑到需要一个G-SYNC监视器(你可以单手计算)对于144 Hz,130 FPS真的很好(在非G-SYNC监视器上关闭VSYNC时过高的帧速率不算在内).2000对象并不多,但我想知道您是否不应该更改渲染器。如果您知道自上一帧以来每个对象都没有更改,则为每个帧的每个对象启用了渲染器。此外,我还将查看砖块和圆片的边界框
using UnityEngine;
using System.Collections;

public class scr_randomGen : MonoBehaviour {


    private SpriteRenderer spriteRenderer;
    private string[] block_blockTypes = new string[]{
        "DIRT",        //#UID 0
        "STONE",       //#UID 1
        "STONE_BRICK", //#UID 2
    };

    void GENERATE(){
        //#DEFAULTS
        GameObject obj_block = GameObject.Find("main_block");
        int pos_startingPosX = -100;
        int pos_endingPosX = 100;

        int pos_startingPosY = 0;
        int pos_endingPosY = 10;

        float X = 0;
        float Y = 0;
        //#TERRAIN GENERATION
        for(X=pos_startingPosX;X<pos_endingPosX;X=X+1){
            GameObject obj_blockNew = (GameObject)Instantiate(obj_block, new Vector3(0 + (1*X),0,0), Quaternion.identity);
            scr_blockMechanics blockMechanics = obj_blockNew.GetComponent<scr_blockMechanics>();

            blockMechanics.isMineable = true;
            blockMechanics.isRandomlyGenerated = true;
            blockMechanics.block_blockType = block_blockTypes[2];

            obj_blockNew.name = blockMechanics.block_blockType+" "+X+", "+Y;

            for(Y=pos_startingPosY;Y<pos_endingPosY;Y=Y+1){
                obj_blockNew = (GameObject)Instantiate(obj_block, new Vector3(X,1 + (1*Y),0), Quaternion.identity);
                blockMechanics = obj_blockNew.GetComponent<scr_blockMechanics>();

                blockMechanics.isMineable = true;
                blockMechanics.isRandomlyGenerated = true;
                blockMechanics.block_blockType = block_blockTypes[2];

                obj_blockNew.name = blockMechanics.block_blockType+" "+X+", "+Y;
            }
        }
    }

    void Start () {
        GENERATE();
    }

    void Update () {

    }
}