проблеми с изобразяването на html и скоростта

Аз съм в ранен етап на разработка на игра. Използвам изображения, за да създавам анимации, като рисувам част от по-голямо изображение върху повърхност. Ето примерен код:

void drawNextFrame() {
    //surf.canvas().clear();
    surf.clear();
    float startX = entity.flipH ? entity.width : 0;
    float endX = entity.flipH ? -entity.width : entity.width;
    float width = entity.width;
    float height = entity.height;
    //surf.canvas().drawImage(image, 0, 0,
    surf.drawImage(image, 0, 0,
            width, height, 
            (width * curFrame) + startX, 0, 
            endX, height);
}

surf е повърхността на SurfaceLayer, а image е Image актив. Java версията на тази игра работи чудесно, тя е гладка и отзивчива и не изпуска никакви рамки или има проблеми с изобразяването. Имам обаче проблеми с HTML версията, изглежда бавна и изпуска много кадри в анимацията. Например имам анимация за изпълнение за плейъра, която се повтаря, изглежда, че HTML версията възпроизвежда анимацията само веднъж, преди плейърът да стане празен. Прескачането или задействането на друга анимация го коригира, така че мога да пусна отново анимацията за бягане, но тя все още няма да се възпроизведе след една итерация на анимационния цикъл, преди да превърне знака празен. Също така имам проблеми с последователното задействане на surf.clear() и понякога кадрите се натрупват един върху друг.

Направих всякакви видове отстраняване на грешки, за да се уверя, че не рисувам кадри твърде бързо. Не докосвам метода paint(). Опитах да изключа SurfaceLayer за CanvasLayer и въпреки че изглеждаше, че това промени малко поведението по отношение на видовете проблеми с изобразяването, които имах и кога се случваха, това все още беше много невъзможно изживяване. Освен това не успя да създаде огледални изображения на моите изображения, когато например играчът е обърнат назад. Включих коментирания код за версията на Canvas по-горе - в този случай surf е екземпляр на CanvasImage. Използвам Box2D в допълнение към рисуването на тези анимации, ако това има значение.

Моят въпрос е: това нормално ли е? Само аз ли имам този тип проблеми и някой намерил ли е заобиколно решение? Просто искам да съм сигурен, че не правя нещо погрешно и подходите, които прилагам, са валидни.

Тествам с Chrome на доста модерна машина с клона 1.2 на PlayN. Създавам и тествам HTML версията на моя проект от командния ред чрез Maven със следните команди:

mvn clean
mvn install
mvn test -Ptest-html

И след това разглеждам http://localhost:8080 с Chrome.

Допълнителен проблем, с който се сблъсквам е, че опресняването на страницата не винаги презарежда играта ми. Внедрих AssetWatcher, за да се уверя, че всичко е налично преди стартиране и работи веднъж, обикновено след като изчистя кеша на браузъра си и рестартирам Chrome, но след това имам късмет, ако опресняването зареди играта. Обикновено трябва да повторя процеса на изчистване на кеша, да рестартирам браузъра, за да го тествам отново.

Знам, че задавам много въпроси, без да предоставям много код, но имам всичко в SVN хранилище онлайн и ще се радвам да го отворя за всеки, който желае да погледне.

Всяка помощ се оценява! Благодаря ви за отделеното време!


person user1367002    schedule 01.05.2012    source източник
comment
Какъв е въпросът? Моля, опитайте се да бъдете по-конкретни. Благодаря.   -  person stefgosselin    schedule 01.05.2012
comment
Благодаря stef, добавих действителните си въпроси, а именно: това нормално ли е? Само аз ли имам този тип проблеми и някой намерил ли е заобиколно решение? Просто искам да се уверя, че не правя нещо нередно и подходите, които прилагам, са валидни.   -  person user1367002    schedule 01.05.2012


Отговори (1)


Разгледахте ли образците на PlayN? CuteGame, по-специално, изглежда, че може да е от значение. Вижте:

person klenwell    schedule 01.05.2012
comment
Благодаря за това! Не бях гледал внимателно CuteGame, ще опитам ImmediateLayer. Кодът, с който работя, се основава предимно на примерите за PeaWorld и XNA Platformer. Имам известен успех при изключване на отделни повърхностни слоеве за всеки кадър на анимация вместо извиквания на drawImage(). Също така включването на WebGL в about:flags на Chrome изглежда помага много -- малко се смущавам, че все още не бях намерил това. - person user1367002; 01.05.2012