2015-08-03 14 views
5

Tôi có một cấu trúc như thếCalling nhiều phương pháp của nhiều đối tượng nhiều lần mỗi giây

abstract Class Entity { 
    //some variables... 
    //some methods ... 
    public abstract void render(Graphics g); 
    } 

Thats phụ huynh ..Now Tôi có 3 đứa con ..

Class A extends Entity{} 
Class B extends Entity{} 
Class C extends Entity{} 

Mỗi lớp có một số khác nhau công cụ làm render .One là ví dụ vẽ vòng tròn màu vàng, văn bản màu xanh lá cây thứ hai và thứ ba là hiển thị hình ảnh.

Nhưng ... có một điều.

Class A have List<B>... 
Class B have List<C>... 

Một Entity có ví dụ 10 Bs ... và mỗi B đã 20 Cs ... Vì vậy, bây giờ .. Tôi có một phương pháp và việc này là làm cho 60x mỗi giây .. Và tôi phải gọi mỗi làm phương pháp từ mọi đối tượng.

Vì vậy, tôi có một cái gì đó như thế này

for(A a : listOfAs){ 
    for(B b : listOfBs){ 
     for(C c : listOfCs){ 
     c.render(g); 
     }b.render(g); 
    }a.render(g); 
} 

Bây giờ nếu bạn tưởng tượng tôi có nhiều đối tượng như thế và tôi gọi phương thức 60x này mỗi giây ... Tôi thấy thực hành thực sự ... thực sự tồi tệ này. Tôi không biết làm thế nào để giải quyết điều này tốt hơn hay như vậy ... Tôi không nghĩ rằng điều này cho mỗi vòng lặp thực sự là giải pháp tốt nhất hay không. Bất cứ ai có ý tưởng?

Tôi đã suy nghĩ về việc thực hiện các con như thế:

Entity x = new A(); ... 
Entity y = new B(); ... 

và như vậy nhưng một số các lớp học có phương pháp khác mà phải được looped như thế và tôi không thể gọi họ là từ cha mẹ.

Đối với phương thức hiển thị ... Chỉ cần thực tế là bạn phải lặp lại nhiều thứ nhiều lần trong một khoảng thời gian ngắn trong một thời gian dài.

Tôi không thể tiến bộ thông qua việc này ... Tôi bị kẹt ở đây một thời gian dài và tôi không chắc chắn cách giải quyết vấn đề này.

+1

Tôi cảm thấy như Lambdas sẽ nhanh hơn ở đây để lặp lại vì vòng lặp forested lồng nhau sẽ xảy ra 'listOfAs.count' *' listOfBs.count' * 'listOfCs.count' lần trong khi lambda được thực hiện đúng với một số dạng hashjoin hoặc bên trong tham gia có thể làm điều đó trong 'listOfAs.count' +' listOfBs.count' + 'listOfCs.count' lần. Tôi sẽ viết bằng chứng của nó nhưng điều đó sẽ không trả lời câu hỏi của bạn. – Adam

+2

Điều này nghe có vẻ giống như một trường hợp để lần đầu tiên hiển thị các thực thể của bạn thành một hình ảnh tạm thời, sau đó tô màu sơn/paintComponent ... Ngoài ra, bạn thực sự không cần phải hiển thị 60x giây; của mắt chỉ tốt cho khoảng 24x – ControlAltDel

+0

@ Adam Tôi không chắc chắn những gì bạn đang đề cập đến, nhưng tôi không thuyết phục mà không có một lời giải thích tốt tôi sợ! Có một số đối tượng để lặp qua; không có số lượng tham gia có thể làm giảm số lượng đó, chắc chắn? Bản năng của tôi sẽ thay vào đó để suy nghĩ về việc sử dụng đồng thời. Một tối ưu hóa khác có thể là để tìm ra các điểm ảnh nào sẽ được vẽ lại và chỉ vẽ giá trị cuối cùng, mặc dù chi phí có thể sẽ vượt quá lợi ích. – Oly

Trả lời

1

Vì mối quan tâm chính của bạn dường như đang hiển thị hoặc không hiển thị các thực thể nhất định, bất kể họ là thực thể con, bạn nên thực hiện một số nghiên cứu về tối ưu hóa và thủ thuật lập trình đồ họa chung. Một lợi ích lớn trong hiệu suất trong công cụ dựng hình không phải là làm công việc đó là không cần thiết.

Một đã được đề cập, đó là để xác định thực sự thay đổi trạng thái và chỉ hiển thị chúng. Một cách khác là kiểm tra các giới hạn của chế độ xem của bạn dựa vào giới hạn của từng thực thể trên canvas đồ họa và chỉ hiển thị những thứ nằm trong giới hạn. Cho dù bạn có 2D hay 3D, bạn có thể có nhiều thứ chồng lên nhau, vì vậy bạn có thể xác định những thực thể nào bị chặn và tránh hiển thị chúng. Nếu thực thể con của bạn nằm trong giới hạn của cha mẹ, thì bạn có thể tránh vẽ toàn bộ cây của biểu đồ đối tượng và tránh lặp lại nhiều phần tử.

Ngoài ra, những điều này có thể được thực hiện trong partials bằng cách kiểm tra một phần của một thực thể phải được trả lại, một phần không bị tắc nghẽn, v.v. Điều này có thể yêu cầu một số thay đổi đối với API của bạn để vượt qua giới hạn các thực thể được dự kiến ​​sẽ hiển thị thay vì toàn bộ bối cảnh đồ họa cho mỗi mục.

Nếu bạn không biết bất kỳ điều gì khác về bất kỳ đối tượng có thể hiển thị nào của bạn, chẳng hạn như trạng thái hoặc giới hạn dơ bẩn, thì bạn bị kẹt với việc lặp lại tất cả và triệu gọi từng đối tượng.

0

Tôi không chắc mình có tuân theo ... Nhưng bạn có đang tạo ra một thực thể bao gồm một số thực thể khác không? Cho dù bạn nghĩ thế nào đi nữa, bạn sẽ luôn phải ghé thăm từng thực thể một lần. Nó không thực sự quan trọng bạn chọn loại vòng lặp nào.

Tuy nhiên, nếu bạn có một Thực thể bao gồm một loạt các sprites, tôi sẽ khuyên bạn nên tạo một kết cấu mới và hiển thị các họa tiết đó lên kết cấu đó một lần. Sau đó, bạn chỉ cần render texture đó mỗi frame. Có ý nghĩa?

0

Tôi đang tìm một người bạn tại nơi làm việc đã xem xét và giúp tôi ổn định nó. Cảm ơn tất cả vì lời khuyên và trợ giúp của bạn. Tôi không nghĩ rằng lambdas có thể giúp đỡ rất nhiều ở đây.

Thật khó để giải thích những gì tôi đang làm trong dự án này. Nó không phải là một trò chơi ở tất cả .. Đó là một cái gì đó khác nhau. Tôi nhận được kết xuất gấp đôi vì vậy nó thực sự là 2 * 30 lần mỗi giây. Tôi chỉ đang chơi với tải các đối tượng mà sau này tôi có thể sử dụng trong động cơ của mình. Nhưng vấn đề này khiến tôi bị mắc kẹt trong một thời gian khá lớn.

Một lần nữa. Cảm ơn tất cả .

Các vấn đề liên quan