2010-09-10 37 views
11

Tôi đã nghĩ đến việc tạo trò chơi bằng cách sử dụng javascript cho logic trò chơi và phần tử canvas HTML5 để tạo hoạt ảnh cho bản vẽ. Mục tiêu của tôi là viết một cái gì đó hoạt động trong các trình duyệt và trên các điện thoại thông minh mới hơn. Vì vậy, tôi đã viết một chương trình nhanh chóng di chuyển 100 vòng tròn xung quanh trên màn hình và cho tôi thấy tốc độ khung hình. Tôi đã khá thất vọng với kết quả: Chrome: ~ 90 FPS Firefox: ~ 25 FPS iPhone: ~ 11 FPShtml5 <canvas> framerate

Đây là một thử nghiệm khá đơn giản vì vậy tôi không muốn cơ hội của tôi khi nói đến thực sự làm một trò chơi hoàn chỉnh. Đây có phải là kết quả tiêu chuẩn từ phần tử canvas hay có một số thủ thuật để vẽ nhanh hơn, nếu bạn có bất kỳ liên kết tốt nào cho tôi biết? Là vải chỉ là một món đồ chơi tại thời điểm này hoặc nó có thể được sử dụng cho các ứng dụng thế giới thực.

Sửa Dưới đây là các mã:

var ctx; 
var width; 
var height; 
var delta; 
var lastTime; 
var frames; 
var totalTime; 
var updateTime; 
var updateFrames; 
var creats = new Array(); 

function init() { 
    var canvas =document.getElementById('main'); 
    width = canvas.width; 
    height = canvas.height; 
    ctx = canvas.getContext('2d'); 
    for(var i=0; i < 100; ++i) { 
     addCreature(); 
    } 
    lastTime = (new Date()).getTime(); 
    frames = 0; 
    totalTime = 0; 
    updateTime = 0; 
    updateFrames =0; 
    setInterval(update, 10); 
} 


function addCreature() { 
    var c = new Creature(Math.random()*100,Math.random()*200); 
    creats.push(c); 
} 

function update() { 
    var now = (new Date()).getTime(); 
    delta = now-lastTime; 
    lastTime = now; 
    totalTime+=delta; 
    frames++; 
    updateTime+=delta; 
    updateFrames++; 
    if(updateTime > 1000) { 
     document.getElementById('fps').innerHTML = "FPS AVG: " + (1000*frames/totalTime) + " CUR: " + (1000*updateFrames/updateTime); 
     updateTime = 0; 
     updateFrames =0; 
    } 

    for(var i=0; i < creats.length; ++i) { 
     creats[i].move(); 
    } 

    draw(); 
} 

function draw() { 
    ctx.clearRect(0,0,width,height); 
    creats.forEach(drawCreat); 
} 

function drawCreat(c,i,a) { 
    if (!onScreen(c)) { 
     return; 
    } 
    ctx.fillStyle = "#00A308"; 
    ctx.beginPath(); 
    ctx.arc(c.x, c.y, 10, 0, Math.PI*2, true); 
    ctx.closePath(); 
    ctx.fill(); 
} 

function onScreen(o) { 
    return o.x >= 0 && o.y >= 0 && o.x <= width && o.y <=height; 
} 

function Creature(x1,y) { 
    this.x = x1; 
    this.y = y; 

    this.dx = Math.random()*2; 
    this.dy = Math.random()*2; 

    this.move = function() { 
     this.x+=this.dx; 
     this.y+=this.dy; 
     if(this.x < 0 || this.x > width) { 
      this.dx*=-1; 
     } 
     if(this.y < 0 || this.y > height) { 
      this.dy*=-1; 
     } 
    } 

} 

init(); 
+0

Bạn có thể đăng mã không? – Castrohenge

+0

Tôi đọc rằng ngắt kết nối các hoạt động từ DOM sẽ làm mọi thứ ** Thực sự ** nhanh hơn nhiều, tôi nghĩ rằng chúng tạo thành một phần tử canvas mà không cần kết nối nó ở bất kỳ đâu trong cây DOM và ghi nó lên khi vẽ xong. Nhưng tôi không chắc chắn 100% - tôi chỉ lướt qua bài báo một cách nhanh chóng và quyết định rằng đó không phải là những gì tôi đang tìm kiếm vào lúc này. – Frank

+0

Tôi có cùng một vấn đề chính xác như bạn (và cùng mục đích, xây dựng các trò chơi dựa trên HTML Canvas để triển khai chúng trên máy tính bảng và điện thoại iOS và Android) Kiểm tra bài kiểm tra của tôi (Bầu trời và đám mây, về cơ bản là một loạt các vòng tròn di chuyển) http://www.gubatron.com/html5/sky.html Tôi nhận được FPS tuyệt vời trên máy tính để bàn, nhưng tốt nhất tôi có thể nhận được trên Galaxy Tab là 10-12FPS. Đã thử nhiều thứ, điều duy nhất giúp giảm số vòng tròn được vẽ. Điều này khiến tôi nghĩ rằng có lẽ tôi nên làm việc trên một phần nhỏ của bức tranh với độ phân giải ít hơn nhiều, sau đó mở rộng nó ra, nó sẽ bay? – Gubatron

Trả lời

0

Chrome là trình duyệt duy nhất cho đến nay mà tôi đã nhìn thấy kết quả tốc độ khung hình cao với.

Bạn cũng có thể thử bản xem trước mới nhất của IE9. Điều đó sẽ cung cấp cho bạn một điểm chuẩn phong nha về cách thế hệ tiếp theo của trình duyệt (với tăng tốc phần cứng cho HTML5) sẽ xử lý mã của bạn.

Cho đến nay, tôi đã thấy rằng IE9, Chrome 7 và Firefox 4 tất cả đều có thể thao một số dạng tăng tốc phần cứng.

+1

Tôi biết rằng trình duyệt đang ngày càng tốt hơn nhưng về di động thì sao? Đó là một trong những điều chính tôi muốn nhắm mục tiêu. Không có vấn đề gì nếu tôi sẽ phải chờ 3-5 năm để có một lượng người tốt để có thể chạy nó. – skorulis

+0

Vâng, bạn mong đợi điều gì? Bạn sẽ phải thêm một thẻ GeForce vào iPhone của bạn để tăng tốc độ này (và tôi phải nói, tôi rất muốn xem một bức ảnh về điều đó). Nhân tiện: Chrome và iPhone sử dụng cùng một công cụ kết xuất. Những gì bạn thấy chỉ là sự khác biệt trong tính toán sức mạnh. – Boldewyn

1

Tôi đã viết một quả bóng nảy đơn giản cho bạn điểm nếu bạn nhấp vào nó.

Nó hoạt động tốt trong Firefox, Safari, Chrome và trên iPad. Tuy nhiên, iPhone 3G/3GS là chậm khủng khiếp với nó. Cũng vậy với điện thoại Android cũ của tôi.

Tôi xin lỗi nhưng tôi thiếu số cụ thể.

0

Có vô số các tối ưu hóa cần thực hiện với bản vẽ Canvas.

Bạn có mã ví dụ bạn có thể chia sẻ không?

5

Phần lớn phụ thuộc vào công cụ JavaScript. V8 (Chrome) và Carakan (Opera) có lẽ là hai động cơ chất lượng sản xuất nhanh nhất. TraceMonkey (Firefox) và SquirrelFish (Safari) ở xa phía sau, với KJS đưa lên phía sau. Điều này sẽ thay đổi khi tăng tốc phần cứng đi vào dòng chính.

Đối với các tối ưu hóa cụ thể, có thể chúng tôi sẽ phải xem một số mã. Hãy nhớ rằng canvas hỗ trợ tổng hợp, vì vậy bạn thực sự chỉ cần vẽ lại các khu vực đã thay đổi. Có lẽ bạn nên chạy lại điểm chuẩn của mình mà không cần canvas để bạn biết liệu các hoạt động vẽ có thực sự là yếu tố giới hạn hay không.

Nếu bạn muốn xem những gì có thể được thực hiện tại, hãy kiểm tra:
js1k
Bespin
Canvas-stein

+0

js1k là điều khiến tôi nghĩ rằng vải đã sẵn sàng cho dòng chính. Có một cái nhìn gần hơn có vẻ như một số có được hiệu suất thực sự tốt và những người khác không làm những việc tương tự. Tôi đã lược tả mã của mình bằng cách sử dụng console.prolfile(). ~ 90% thời gian đã được vẽ. Tôi có thể có thể nhận được một số hiệu suất thêm bằng cách sử dụng phân compost nhưng tôi sẽ phải viết một người quản lý để làm việc ra những khu vực của màn hình cần phải được vẽ lại. Nó sẽ thêm rất nhiều phức tạp – skorulis

6

Để làm cho hình ảnh động hiệu quả hơn, và để đồng bộ hóa tốc độ khung hình của bạn với các bản cập nhật giao diện người dùng, Mozilla tạo ra một mozRequestAnimationFrame() function được thiết kế để loại bỏ sự thiếu hiệu quả của setTimeout() và setInterval(). Kỹ thuật này từ đó đã được Webkit chỉ chấp nhận cho Chrome.

Vào tháng 2 năm 2011 Paul Irish posted a shim đã tạo requestAnimFrame() và ngay sau đó Joe Lambert extended it bằng cách khôi phục độ trễ "hết thời gian chờ" và "khoảng thời gian" để làm chậm hoạt ảnh.

Dù sao, tôi đã sử dụng cả hai và đã thấy kết quả rất tốt trong Chrome và Firefox. Các shim cũng có thể trở về setTimeout() nếu support supportAnimationFrame() không có sẵn. Cả mã của Paul và Joe đều trực tuyến at github.

Hy vọng điều này sẽ hữu ích!

+0

Tôi nên làm rõ, sau khi áp dụng nó vào mã của bạn tôi nhận được 60fps trong chrome và firefox. 60fps này là cố ý vì nó đồng bộ hóa cập nhật khung với bản cập nhật giao diện người dùng. Để có giải thích kỹ thuật thích hợp, hãy xem http://www.nczonline.net/blog/2011/05/03/better-javascript-animations-with-requestanimationframe/ – adamrmcd

2

Các vòng cung có tính toán chuyên sâu để vẽ. Bạn có thể cải thiện đáng kể hiệu suất bằng cách sử dụng drawImage hoặc thậm chí putImageData thay vì vẽ đường dẫn mỗi khung hình.

Hình ảnh có thể là một tệp được tải từ URL hoặc có thể là hình ảnh được tạo bằng cách vẽ trên khung riêng biệt không hiển thị cho người dùng (không được kết nối với DOM). Dù bằng cách nào, bạn sẽ tiết kiệm được một tấn thời gian xử lý.

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