Câu trả lời:
Lớp Camera chứa một đối tượng Frustum với phương thức công khai pointInFrustum (điểm Vector3) trả về giá trị true nếu sprite của bạn nằm trong sự thất vọng của máy ảnh. Bạn cũng có thể xem wiki người dùng để biết các kỹ thuật loại bỏ khác. http://code.google.com.vn/p/libgdx-users/wiki/Culling
Nếu bạn đang tạo một trò chơi 2D với các ô xếp, bạn có thể dễ dàng thực hiện loại bỏ riêng của mình, nó rẻ hơn rất nhiều vì bạn chỉ lặp lại chính xác những gì bạn cần trong mảng gạch của mình.
Những điều bạn nên biết:
Bây giờ chúng ta có thể tính toán nên vẽ bao nhiêu gạch.
viewport.width / tileWidth
viewport.height / tileHeight
Toán học phụ thuộc vào cách mọi thứ được thiết lập nhưng rất đơn giản. Ví dụ, nó tạo ra sự khác biệt nếu trung tâm của màn hình là vị trí camera, phía trên bên trái hoặc dưới cùng bên trái.
Bạn nên kết thúc với một cái gì đó như thế này:
int startX = cameraWorldPosX / tileWidth;
int startY = cameraWorldPosY / tileHeight;
//When you have the position of the camera in the center of the screen you do something like this:
int startX = (cameraWorldPosX - viewport.width / 2) / tileWidth;
int startY = (cameraWorldPosY - viewport.height / 2) / tileHeight;
for (int y = startY; y < startY + viewportWidth / tileWidth; y++)
{
for (int x = startX; x < startX + viewportHeight / tileHeight; x++)
{
//Draw logic
}
}
Lợi ích của việc này là kiểm tra xem một điểm có nằm trong sự bực bội của bạn hay không là với điểm sau bạn cần lặp lại qua từng điểm thay vì sử dụng một mảng đơn giản trong đó bạn luôn lặp lại một lượng gạch tương đương với số lượng gạch ngang * gạch dọc mà thực sự cần phải vẽ. Bằng cách này bạn có thể có bản đồ khổng lồ và vẫn có tốc độ khung hình tốt. Thật không may, điều này trở nên khó khăn và phức tạp hơn khi sử dụng 3D nhưng lại khó hơn theo cấp số nhân với sự tự do của người dùng với máy ảnh. Bạn có thể tưởng tượng một camera phối cảnh cố định di chuyển với nhân vật chỉ cần một vài biến số được mã hóa cứng để thực hiện các thủ thuật tương tự trên một mảng các lưới thể hiện bản đồ của bạn.
Chỉ cần sử dụng kiểm tra hình cầu giới hạn. (Bạn có thể tính bán kính bằng pythagoras) Nó nhanh như địa ngục và cũng hoạt động với xoay vòng. Nó không hoàn hảo nhưng không bao giờ gây ra sự loại bỏ sai.
Đối với phiên bản tối ưu hóa ad hoc Intersector có một số hình chữ nhật chứa các phương thức chỉnh lưu, chúng cũng có thể hoạt động. Nhưng bạn cần phải tính toán hình chữ nhật cho máy ảnh tự làm phiền mình.
Hàm này kiểm tra nếu một diễn viên có thể nhìn thấy (chỉ hoạt động cho 2D). Hoạt động trong mọi tình huống, ví dụ như khi diễn viên ở trong một nhóm.
/**
* Returns if the actor is visible or not. Useful to implement 2D culling.
**/
public static boolean actorIsVisible(Actor actor) {
Vector2 actorStagePos = actor.localToStageCoordinates(new Vector2(0,0));
Vector2 actorStagePosTl = actor.localToStageCoordinates(new Vector2(
actor.getWidth(),
actor.getHeight()));
Vector3 actorPixelPos = new Vector3(actorStagePos.x, actorStagePos.y, 0);
Vector3 actorPixelPosTl = new Vector3(actorStagePosTl.x, actorStagePosTl.y, 0);
actorPixelPos = actor.getStage().getCamera().project(actorPixelPos);
actorPixelPosTl = actor.getStage().getCamera().project(actorPixelPosTl);
return !(actorPixelPosTl.x < 0 ||
actorPixelPos.x > Gdx.graphics.getWidth() ||
actorPixelPosTl.y < 0 ||
actorPixelPos.y > Gdx.graphics.getHeight()
);
}