Unity3d 如何在2D纹理上重新绘制像素而不闪烁

Unity3d 如何在2D纹理上重新绘制像素而不闪烁,unity3d,rendering,Unity3d,Rendering,我想在统一中的二维纹理上画一条线。这在编辑器中运行良好。但是,在编译的构建中,它将闪烁,因为它用清晰的颜色填充纹理的像素,然后重新绘制线条 这是我的拖拉代码: public void DrawLineWithMouse (Vector2 _middleVector) { tex.SetPixels(fillPixels); // Fills texture with an array of clear pixels Vector3 newMousePos = Input.mous

我想在统一中的二维纹理上画一条线。这在编辑器中运行良好。但是,在编译的构建中,它将闪烁,因为它用清晰的颜色填充纹理的像素,然后重新绘制线条

这是我的拖拉代码:

public void DrawLineWithMouse (Vector2 _middleVector)
{
    tex.SetPixels(fillPixels); // Fills texture with an array of clear pixels
    Vector3 newMousePos = Input.mousePosition;
    newMousePos.z = 0;
    int x0 = ((int)newMousePos.x)/RenderingManager.pixelSize  / thickness; //Screen.width-
    int y0 = ((int)newMousePos.y)/RenderingManager.pixelSize  / thickness; //Screen.height-
    int x1 =  (int)_middleVector.x - (x0 - (int)_middleVector.x );
    int y1 =  (int)_middleVector.y - (y0 - (int)_middleVector.y );
    DrawLineHelper(tex, x0, y0, x1, y1, Color.yellow); // redraws the line

    tex.Apply();
}
当我创建一个新的纹理然后应用它时,我不会闪烁。然而,这是非常非常昂贵的,并且仅用于测试目的

    public void DrawLineWithMouse (Vector2 _middleVector)
{
    tex = new Texture2D(Screen.width/RenderingManager.pixelSize / thickness, Screen.height/RenderingManager.pixelSize / thickness);
    tex.SetPixels(fillPixels);
    tex.SetPixels(fillPixels);
    tex.filterMode = FilterMode.Point;



    Vector3 newMousePos = Input.mousePosition;
    newMousePos.z = 0;
    int x0 = ((int)newMousePos.x)/RenderingManager.pixelSize  / thickness; //Screen.width-
    int y0 = ((int)newMousePos.y)/RenderingManager.pixelSize  / thickness; //Screen.height-
    int x1 =  (int)_middleVector.x - (x0 - (int)_middleVector.x );
    int y1 =  (int)_middleVector.y - (y0 - (int)_middleVector.y );
    DrawLineHelper(tex, x0, y0, x1, y1, Color.yellow);
    GetComponent<Renderer>().material.mainTexture = tex;
public void DrawLineWithMouse(Vector2\u middleVector)
{
tex=新纹理2d(Screen.width/RenderingManager.pixelSize/thickness,Screen.height/RenderingManager.pixelSize/thickness);
tex.SetPixels(fillPixels);
tex.SetPixels(fillPixels);
tex.filterMode=filterMode.Point;
Vector3 newMousePos=Input.mousePosition;
newMousePos.z=0;
int x0=((int)newMousePos.x)/RenderingManager.pixelSize/thickness;//Screen.width-
int y0=((int)newMousePos.y)/RenderingManager.pixelSize/thickness;//Screen.height-
intx1=(int)_middleVector.x-(x0-(int)_middleVector.x);
int y1=(int)_middleVector.y-(y0-(int)_middleVector.y);
DrawLineHelper(tex、x0、y0、x1、y1,颜色为黄色);
GetComponent().material.mainTexture=tex;

由于应用是一项昂贵的操作,所以它会被轻弹。状态:

这是一个潜在的昂贵操作,因此您需要在应用调用之间更改尽可能多的像素

你必须找到一种方法,用鼠标来减少对
绘图线的调用。什么是最好的解决方案,这取决于你自己,取决于你在做什么

一种方法是累积鼠标移动的增量并在x毫秒后绘制。另一种方法是在纹理顶部绘制网格,而不是更改纹理,然后仅在必要时(如果有)更改纹理(请注意,您可以在此处使用RenderTexture在纹理中轻松绘制网格)


最后,降低纹理的分辨率会使
Apply
运行得更快。

因为Apply是一个昂贵的操作,所以它会进行翻转。状态:

这是一个潜在的昂贵操作,因此您需要在应用调用之间更改尽可能多的像素

你必须找到一种方法,用鼠标来减少对
绘图线的调用。什么是最好的解决方案,这取决于你自己,取决于你在做什么

一种方法是累积鼠标移动的增量并在x毫秒后绘制。另一种方法是在纹理顶部绘制网格,而不是更改纹理,然后仅在必要时(如果有)更改纹理(请注意,您可以在此处使用RenderTexture在纹理中轻松绘制网格)


最后,降低纹理的分辨率会使
Apply
运行得更快。

对如何调用
DrawLineWithMouse()
感到好奇。您是在
Update
中调用它还是在
FixedUpdate
中调用它?
如果(Input.GetMouseButton(0)){drawLineUtility.DrawLineWithMouse(startMousePointInPixels);}
在Update中详细说明如何调用
DrawLineWithMouse()
。是否在
Update
FixeUpdate
中调用它?
if(Input.GetMouseButton(0)){drawLineUtility.DrawLineWithMouse(startMousePointInPixels);}
在更新中询问您的答案,但这是不正确的。这是因为我是
tex.SetPixels(fillPixels)
Fill pixels是一个清晰像素数组。然后它会重新绘制线条。我会更新我的问题,使其清晰。我仍然不明白为什么你必须调用
SetPixels
并清除所有内容,而不是调用
SetPixel
逐像素绘制,只是改变你想要的。等等……这是正确的答案吗?@Jim didney你开始工作了吗?你看到我的消息了吗?谢谢你跟踪Roberto。遗憾的是没有。谢谢你的回答,但这是不正确的。因为我是
tex.SetPixels(fillPixels)
Fill pixels是一个清晰像素数组。然后它会重新绘制线条。我会更新我的问题,使其清晰。我仍然不明白为什么你必须调用
SetPixels
并清除所有内容,而不是调用
SetPixel
逐像素绘制,只是改变你想要的。等等……这是正确的答案吗?@Jim didney你开始工作了吗?你看到我的留言了吗?谢谢你跟踪罗伯托。遗憾的是没有。