Làm cách nào để tôi dừng việc kéo dài trong khi kích thước lại cửa sổ trong XNA?


8

Trong trò chơi XNA ở chế độ cửa sổ của tôi khi người dùng thay đổi kích thước cửa sổ, trò chơi dừng cập nhật cửa sổ và khung hình cuối cùng được kéo dài và biến dạng cho đến khi người dùng nhả chuột và thay đổi kích thước hoàn tất.

Có cách nào để trò chơi tiếp tục chạy "bình thường", cập nhật khung hình và vẽ lại màn hình, trong sự kiện thay đổi kích thước không?

Tôi nhận ra rằng việc duy trì vòng lặp kết xuất trong khi thay đổi kích thước có thể là không thể hoặc được khuyến nghị do các tài nguyên được quản lý phần cứng liên tục được tạo và phá hủy, nhưng có cách nào để ngăn chặn việc kéo dài xấu xí không? Lý tưởng nhất là để khung hình hiện tại không bị che khuất ở phía trên bên trái hoặc với màn hình đen nếu điều đó là không thể.


Đăng ký một sự kiện cho cửa sổ thay đổi kích thước và cập nhật độ phân giải GraphicsDevice. Điều này có thể cập nhật tỷ lệ khung hình và sửa chữa kéo dài.
Gustavo Maciel

Tôi không biết về C # / XNA, nhưng trong C ++ / D3D tôi chỉ có vòng lặp kết xuất chạy trong một luồng riêng biệt từ luồng chính với vòng lặp thông báo. Chuỗi chính thực hiện thay đổi kích thước bộ đệm khi xảy ra sự kiện thay đổi kích thước, được đồng bộ hóa thông qua một mutex.

1
Gustavo, tôi đã xử lý sự kiện đó cho các mục đích khác trong trò chơi. Thật không may, nó không kích hoạt cho đến khi người dùng nhả chuột khi kích thước lại hoàn tất.
Bradley Uffner

Cặp câu hỏi / câu trả lời này có thể hữu ích. Nó cho bạn biết làm thế nào để tiếp tục kết xuất (mặc dù nó không sửa lỗi kéo dài).
Andrew Russell

Câu trả lời:


3

Có ít nhất 3 tin nhắn mà bạn có thể theo dõi.

  • WM_SIZE- thay đổi kích thước cửa sổ, mini / tối đa hóa, chuyển đổi toàn màn hình / cửa sổ. Bạn sẽ đọc vào wParam để tìm hiểu chính xác những gì đã xảy ra và lParam cho kích thước hiện tại.
  • WM_ENTERSIZEMOVE - bắt đầu thay đổi kích thước cửa sổ ở chế độ cửa sổ
  • WM_EXITSIZEMOVE - thay đổi kích thước cửa sổ ở chế độ cửa sổ

Thông thường, bạn sẽ không muốn thay đổi kích thước ứng dụng của mình mọi khung hình giữa WM_ENTERSIZEMOVE và WM_EXITSIZEMISE vì nó quá chậm và xấu. Nhưng hãy thử xem, nó chắc chắn độc đáo hơn là kéo dài, có thể bạn sẽ thích nó =)

case WM_SIZE:
    // Save the new client area dimensions.
    m_ptViewportSize.x  = LOWORD(lParam);
    m_ptViewportSize.y = HIWORD(lParam);
    if( wParam == SIZE_MINIMIZED )
    {
        m_bAppSuspended = true;
        m_bMinimized = true;
        m_bMaximized = false;
    }
    else if( wParam == SIZE_MAXIMIZED )
    {
        m_bAppSuspended = false;
        m_bMinimized = false;
        m_bMaximized = true;
        OnResize();
    }
    else if( wParam == SIZE_RESTORED )
    {
        // Restoring from minimized state
        if( m_bMinimized )
        {
            m_bAppSuspended = false;
            m_bMinimized = false;
            OnResize();
        }
        // Restoring from maximized state
        else if( m_bMaximized )
        {
            m_bAppSuspended = false;
            m_bMaximized = false;
            OnResize();
        }
        else if( m_bResizing )
        {
            // Resizing in processs
            // You woldn't wanto to handle a massive stream of
            // WM_SIZE here because buffers resizing is very slow
        }
        else
        {
            // Resizing finished and you can handle it. For ex. with 
            // m_SwapChain->SetFullscreenState
            OnResize();
        }

    }
    return 0;

// WM_EXITSIZEMOVE is sent when the user grabs the resize bars.
case WM_ENTERSIZEMOVE:
    m_bAppSuspended = true;
    m_bResizing  = true;
    g_pTimer->Stop();
    return 0;
// WM_EXITSIZEMOVE is sent when the user releases the resize bars.
// Here we reset everything based on the new window dimensions.
case WM_EXITSIZEMOVE:
    m_bAppSuspended = false;
    m_bResizing  = false;
    g_pTimer->Start();
    OnResize();
    return 0;

1
Xử lý các thông báo windows trong .NET liên quan đến ghi đè System.Windows.Forms.Form.WndProc(). Khi làm việc trong XNA, bạn không có quyền truy cập trực tiếp vàoForm để ghi đè phương thức đó. Mặc dù có thể làm được nhưng đó không phải là một công việc tầm thường và sẽ phải phá vỡ thiết kế của XNA.
Cypher

Nếu ai đó chọn đi theo con đường này, danh sách các hằng số wm_ * sẽ chứng minh là hữu ích: pinvoke.net/default.aspx/Constants/WM.html
Cypher

Giống như những người khác đã nói, tôi vẫn sẽ cần một cách để đoản mạch "động cơ" XNA và khiến nó rút lại trong các sự kiện chính xác. Từ những gì tôi có thể nói với XNA về loại "đi ngủ" trong quy trình thay đổi kích thước.
Bradley Uffner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.