Я пишу власний клон Minecraft (також написаний на Java). Зараз він чудово працює. З відстані в огляді 40 метрів я можу легко отримати 60 FPS на своєму MacBook Pro 8,1. (Intel i5 + Intel HD Graphics 3000). Але якщо я поставлю відстань огляду на 70 метрів, я досягну лише 15-25 FPS. У реальному Minecraft я можу без проблем поставити відстань перегляду далеко (= 256 м). Отже, моє запитання - що мені робити, щоб покращити гру?
Впроваджені нами оптимізації:
- Зберігайте лише локальні шматки пам’яті (залежно від відстані перегляду гравця)
- Знищення фрустуму (спочатку на шматки, потім на блоки)
- Лише малювання дійсно видимих граней блоків
- Використання списків на шматок, які містять видимі блоки. Шматки, які стануть видимими, додадуть себе до цього списку. Якщо вони стають невидимими, їх автоматично видаляють із цього списку. Блоки стають видимими, будуючи або руйнуючи сусідній блок.
- Використання списків на шматок, які містять блоки оновлення. Той самий механізм, що і у списках видимих блоків.
- Не використовуйте майже жодних
new
заяв всередині ігрового циклу. (Моя гра триває близько 20 секунд, поки не буде викликано збирач сміття) - Наразі я використовую списки викликів OpenGL. (
glNewList()
,glEndList()
,glCallList()
) Для кожної сторони свого роду блоку.
В даний час я навіть не використовую жодної системи освітлення. Я вже чув про VBO. Але я точно не знаю, що це таке. Однак я зроблю деякі дослідження щодо них. Чи поліпшать вони результати? Перш ніж реалізувати VBO, я хочу спробувати використати glCallLists()
та передати список списків дзвінків. Замість цього використовуйте тисячу разів glCallList()
. (Я хочу спробувати це, тому що я думаю, що справжній MineCraft не використовує VBO. Правильно?)
Чи є інші хитрощі для підвищення продуктивності?
Профілювання VisualVM показало мені це (профілювання лише 33 кадрів, відстань перегляду 70 метрів):
Профілювання з 40 метрів (246 кадрів):
Примітка. Я синхронізую безліч методів і блоків коду, тому що я генерую фрагменти в іншій потоці. Я думаю, що придбання блокування для об'єкта є проблемою продуктивності, коли ви робите це багато в ігровому циклі (звичайно, я говорю про час, коли є лише цикл гри і нові шматки не генеруються). Чи це правильно?
Редагування: Після видалення деяких synchronised
блоків та деяких інших невеликих удосконалень. Продуктивність вже набагато краща. Ось мої нові результати профілювання на 70 метрів:
Я думаю, що цілком зрозуміло, що selectVisibleBlocks
тут проблема.
Спасибі заздалегідь!
Мартійн
Оновлення : Після деяких додаткових вдосконалень (наприклад, використання циклів замість кожної, буферизація змінних зовнішніх циклів тощо), тепер я можу пройти відстань перегляду 60 досить добре.
Я думаю, що я збираюся впровадити VBO якнайшвидше.
PS: Весь вихідний код доступний на GitHub:
https://github.com/mcourteaux/CraftMania