|
|
@@ -2,54 +2,70 @@
|
|
|
<html lang="en">
|
|
|
<head>
|
|
|
<title>vue.js version</title>
|
|
|
- <script src="https://cdn.jsdelivr.net/stats.js/r11/stats.min.js"></script>
|
|
|
- <script src="../../dist/vue.js"></script>
|
|
|
+ <script src="https://cdn.jsdelivr.net/stats.js/r11/stats.min.js"></script>
|
|
|
+ <script src="../../dist/vue.js"></script>
|
|
|
<style>
|
|
|
-html, body {
|
|
|
- height: 100%;
|
|
|
- width: 100%;
|
|
|
- padding: 0;
|
|
|
- margin: 0;
|
|
|
-}
|
|
|
-svg {
|
|
|
- width: 800px;
|
|
|
- height: 600px;
|
|
|
-}
|
|
|
+ html, body {
|
|
|
+ height: 100%;
|
|
|
+ width: 100%;
|
|
|
+ padding: 0;
|
|
|
+ margin: 0;
|
|
|
+ }
|
|
|
+ svg {
|
|
|
+ width: 800px;
|
|
|
+ height: 600px;
|
|
|
+ }
|
|
|
</style>
|
|
|
</head>
|
|
|
<body>
|
|
|
- <div id="app">
|
|
|
- <svg>
|
|
|
- <circle v-for='point in points' :cx='point.x' :cy='point.y' r='2px' fill='#FC309D'></circle>
|
|
|
- </svg>
|
|
|
-</div>
|
|
|
+ <h1>Animating 1000 SVG dots</h1>
|
|
|
+ <div id="app">
|
|
|
+ <p>
|
|
|
+ <button @click="toggleOptimization">
|
|
|
+ {{ optimized ? 'disable' : 'enable' }} optimization (Object.freeze)
|
|
|
+ </button>
|
|
|
+ </p>
|
|
|
+ <svg>
|
|
|
+ <circle v-for='point in model.points' :cx='point.x' :cy='point.y' r='2px' fill='#FC309D'></circle>
|
|
|
+ </svg>
|
|
|
+ </div>
|
|
|
<script type="text/javascript" charset="utf-8">
|
|
|
-var stats = new Stats();
|
|
|
-stats.setMode(0); // 0: fps, 1: ms, 2: mb
|
|
|
-
|
|
|
-// align top-left
|
|
|
-stats.domElement.style.position = 'absolute';
|
|
|
-stats.domElement.style.left = '0px';
|
|
|
-stats.domElement.style.top = '0px';
|
|
|
-
|
|
|
-document.body.appendChild( stats.domElement );
|
|
|
+var stats = new Stats()
|
|
|
+stats.setMode(0)
|
|
|
+stats.domElement.style.position = 'absolute'
|
|
|
+stats.domElement.style.right = '0px'
|
|
|
+stats.domElement.style.top = '0px'
|
|
|
+document.body.appendChild(stats.domElement)
|
|
|
|
|
|
var WIDTH = 800
|
|
|
var HEIGHT = 600
|
|
|
-var model = createModel(1000);
|
|
|
|
|
|
new Vue({
|
|
|
el: '#app',
|
|
|
- data: model,
|
|
|
+ data: {
|
|
|
+ model: createModel(1000),
|
|
|
+ optimized: false
|
|
|
+ },
|
|
|
created: function () {
|
|
|
var self = this
|
|
|
- self.raf = window.requestAnimationFrame(render)
|
|
|
+ requestAnimationFrame(render)
|
|
|
stats.begin()
|
|
|
function render () {
|
|
|
stats.end()
|
|
|
stats.begin()
|
|
|
- self.raf = window.requestAnimationFrame(render)
|
|
|
- self.step()
|
|
|
+ requestAnimationFrame(render)
|
|
|
+ self.model.step()
|
|
|
+ if (self.optimized) {
|
|
|
+ self.$forceUpdate()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ toggleOptimization: function () {
|
|
|
+ this.model = this.optimized
|
|
|
+ ? createModel(1000)
|
|
|
+ : Object.freeze(createModel(1000))
|
|
|
+ this.optimized = !this.optimized
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
@@ -72,7 +88,6 @@ function createModel (count) {
|
|
|
|
|
|
function step () {
|
|
|
points.forEach(move)
|
|
|
- // move(points[0])
|
|
|
}
|
|
|
|
|
|
function move (p) {
|