>

XNA를 사용하여 픽셀 단위로 화면에 그리려고하지만 리소스에 문제가 있습니다. 가장 좋은 방법은 모든 프레임을 업데이트하는 1 개의 텍스처를 갖는 것이라고 생각했지만 업데이트하는 데 문제가 있습니다. 테스트로 지금까지 얻은 내용은 다음과 같습니다.

Texture2D canvas;
Rectangle tracedSize;
UInt32[] pixels;
protected override void Initialize()
    {
        tracedSize = GraphicsDevice.PresentationParameters.Bounds;
        canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color);
        pixels = new UInt32[tracedSize.Width * tracedSize.Height];               
        base.Initialize();
    }
protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        pixels[100] = 0xFF00FF00;
        canvas.SetData<UInt32>(pixels, 0, tracedSize.Width * tracedSize.Height);
        spriteBatch.Begin();
        spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), Color.White);
        spriteBatch.End();
        base.Draw(gameTime);
    }

두 번째로 Draw ()를 호출하면 다음 오류가 발생합니다.

"작업이 중단되었습니다. 장치에 설정된 리소스 나 바둑판 식 대괄호 안에 사용한 리소스는 수정할 수 없습니다."

Draw ()에서 새로운 Texture2D를 만들려고하면 메모리 부족 오류가 빨리 발생합니다. Windows Phone 용입니다. 잘못된 방법으로 시도하고있는 것 같습니다. 다른 옵션을 사용하려면 어떻게해야합니까?


  • 답변 # 1

    GraphicsDevice.Textures[0] = null 설정 시도  SetData를 호출하기 전에 성능이 더 우수한 방법이있을 수있는 효과에 따라 Silverlights WriteableBitmap을 고려할 수도 있습니다.

    편집 : 이것은 에뮬레이터에서 테스트 한 코드입니다.

    Texture2D canvas;
    Rectangle tracedSize;
    UInt32[] pixels;
    protected override void Initialize()
    {
        tracedSize = GraphicsDevice.PresentationParameters.Bounds;
        canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color);
        pixels = new UInt32[tracedSize.Width * tracedSize.Height];
        base.Initialize();
    }
    Random rnd = new Random();
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        GraphicsDevice.Textures[0] = null;
        pixels[rnd.Next(pixels.Length)] = 0xFF00FF00;
        canvas.SetData<UInt32>(pixels, 0, tracedSize.Width * tracedSize.Height);
        spriteBatch.Begin();
        spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), Color.White);
        spriteBatch.End();
        base.Draw(gameTime);
    }
    
    

  • 답변 # 2

    기본적으로 예외에서 요구하는대로해야합니다 :

    그래픽 장치에서 텍스처가 설정되지 않도록하려면 Draw 끝에 놓습니다. :

    GraphicsDevice.Textures[0] = null;
    
    

    타일링 브래킷 내부를 그리지 않도록하려면 SetData 를 사용하지 마십시오.  와이즈 비즈 내부  조금도. 통화를 Draw 로 이동   SetData 로 .

    <시간>

    보너스 정보 : 메모리 부족 오류는 관리되지 않는 리소스를 해제하지 않았기 때문입니다.  할당 (가비지 수집기에서 추적 할 수 없으므로 메모리가 부족하다는 것을 알 수 없음) Update 에 전화해야합니다  질감에. 그러나 각 프레임마다 새로운 질감을 만드는 것은 나쁜 생각입니다 (성능과 메모리 조각화 문제를 피할 수있는 방법은 없습니다).

    Texture2D

  • 이전 CouchDB와 Python으로 기계 학습을 사용하여 '이상한 행동'을 감지합니까?
  • 다음 php - Imagemagick 애니메이션 GIF 크기 최적화