- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将我自己的基于 WebGL 的引擎移植到微信小游戏环境,目前只是尝试让 WebGL 上下文被粉红色清除:
我已经按照腾讯提供的示例以及 ThreeJS 示例来设置游戏项目。它在微信开发者工具中运行良好(如上图所示),但是当我尝试在我的设备(Android 手机)上打开它时,它卡在 100% 加载屏幕:
这样持续约1分钟,然后黑屏。
我的代码中没有资源加载。这是我的 main.js
中的内容:
var ctx = canvas.getContext('webgl', {
antialias: true,
depth: true,
preserveDrawingBuffer: true
});
ctx.viewport(0,0,ctx.canvas.width,ctx.canvas.height)
ctx.colorMask(true,true,true,true)
ctx.depthMask(true)
ctx.enable(ctx.BLEND)
ctx.blendFunc(ctx.SRC_ALPHA, ctx.ONE_MINUS_SRC_ALPHA)
ctx.clearColor(1.0,0.0,1.0,1.0)
export default class Main {
constructor() {
window.requestAnimationFrame(this.loop.bind(this), canvas)
}
render() {
ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT)
}
update() {
}
loop() {
this.update()
this.render()
window.requestAnimationFrame(this.loop.bind(this), canvas)
}
}
我的 game.js
也很简单:
import './weapp-adapter/index.js'
import './symbol'
import Main from './js/main'
new Main()
我的 game.json
只包含以下内容:
{
"deviceOrientation": "portrait"
}
我还注意到,当我尝试 Threejs 示例(可在设备上运行)和渲染函数中的注释行时,它会表现相同(卡在 100% 加载中)。
最佳答案
我终于想出了解决办法:
当我将 WebGL 上下文初始化放在动画帧的第一个调用中,而实际渲染在所有其他调用中完成时,它在我的 Android 设备上按预期工作。这是我更改过的 main.js
:
export default class Main {
constructor() {
this.render = this.render_first
requestAnimationFrame(() => this.animate())
}
showmsg(t,c) {
wx.showModal({
title: ""+t,
content: ""+c,
showCancel: false,
confirmText:'OK',
success: function(res){}
});
}
animate() {
this.render();
requestAnimationFrame(() => this.animate())
}
render_first() {
this.render = this.render_normal
var _this = this
this.domElement = canvas
var contextAttributes = {
alpha: false,
depth: true,
stencil: false,
antialias: false
}
this.domElement.addEventListener("webglcontextlost", function(e){
_this.showmsg("WebGL","Context lost");
}, false)
this.domElement.addEventListener("webglcontextrestored", function(e){
_this.showmsg("WebGL","Context restored");
}, false)
this._gl = this.domElement.getContext( 'webgl', contextAttributes ) || this.domElement.getContext( 'experimental-webgl', contextAttributes )
var _gl = this._gl
var vsrc = ""
vsrc += "uniform mat4 uModelView;"
vsrc += "uniform mat4 uProjView;"
vsrc += "attribute highp vec4 aPosition;"
vsrc += "void main(void) {"
vsrc += " gl_Position = ( uProjView * uModelView ) * aPosition;"
vsrc += "}"
var vid = _gl.createShader(_gl.VERTEX_SHADER)
_gl.shaderSource(vid,vsrc)
_gl.compileShader(vid)
if (!_gl.getShaderParameter(vid, _gl.COMPILE_STATUS)) {
console.error("Vertex shader failed: ", _gl.getShaderInfoLog(vid))
}
this._vid = vid
var fsrc = ""
fsrc += "void main(void) {"
fsrc += " gl_FragColor = vec4(1.0,1.0,0.0,1.0);"
fsrc += "}"
var fid = _gl.createShader(_gl.FRAGMENT_SHADER)
_gl.shaderSource(fid,fsrc)
_gl.compileShader(fid)
if (!_gl.getShaderParameter(fid, _gl.COMPILE_STATUS)) {
console.error("Fragment shader failed: ", _gl.getShaderInfoLog(fid))
}
this._fid = fid
var pid = _gl.createProgram()
_gl.attachShader(pid,vid)
_gl.attachShader(pid,fid)
_gl.linkProgram(pid)
if (!_gl.getProgramParameter(pid, _gl.LINK_STATUS)) {
let info = _gl.getProgramInfoLog(pid)
console.error("Program link failed:", info )
}
_gl.useProgram(pid)
this._pid = pid
var aPosition = _gl.getAttribLocation(pid,"aPosition")
var uModelView = _gl.getUniformLocation(pid,"uModelView")
var uProjView = _gl.getUniformLocation(pid,"uProjView")
_gl.uniformMatrix4fv( uModelView, false, [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1] )
_gl.uniformMatrix4fv( uProjView, false, [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1] )
this.uni = [uModelView, uProjView]
this.phase = 0.0
var data = [0,0,0,1,0,0,0,1,0]
var idata = [0,1,2]
var vbID = _gl.createBuffer()
_gl.bindBuffer(_gl.ARRAY_BUFFER,vbID)
_gl.bufferData(_gl.ARRAY_BUFFER, new Float32Array(data), _gl.STATIC_DRAW)
var vbiID = _gl.createBuffer();
_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER, vbiID)
_gl.bufferData(_gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(idata), _gl.STATIC_DRAW)
_gl.vertexAttribPointer( aPosition, 3, _gl.FLOAT, false, 0, 0 )
_gl.enableVertexAttribArray( aPosition )
_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER, vbiID)
this.vb = [vbID,vbiID]
_gl.clearColor(1.0,0.0,1.0,1.0)
}
render_normal() {
var _gl = this._gl
var et = 60.0 / 1000.0
this.phase += 180.0 * 60.0 / 1000.0
var py = Math.sin(this.phase * Math.PI/180.0) * 0.5
_gl.uniformMatrix4fv( this.uni[0], false, [1,0,0,0,0,1,0,0,0,0,1,0,py,0,0,1] )
_gl.clear( _gl.COLOR_BUFFER_BIT )
_gl.drawElements(_gl.TRIANGLES, 3, _gl.UNSIGNED_SHORT, 0)
}
}
在实际设备上,微信小游戏似乎在一个单独的线程中运行动画循环,而不是主 JavaScript 执行。由于 WebGL (OpenGL) 上下文只能在同一个线程中访问(除了在多个线程可以共享相同上下文的 native 应用程序中),它会在设备上崩溃,因为渲染函数会尝试访问在不同线程中初始化的 gl 上下文。
这在微信开发者工具中是不可见的,因为该工具不能准确模拟设备架构的工作方式,并且动画帧和 JavaScript 执行似乎发生在同一个线程中。
关于javascript - 微信(WebGL)小游戏不能在设备上运行,但可以在 devtool 中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54107987/
语境 对于我的许多 js 文件,我没有源映射。当使用 devtools 控制台时,它会污染有关的警告。我不想关闭所有警告,但那些对我来说并不是真的有用 问题 如何抑制 Chrome DevTools
我有这个 Chrome DevTools 颜色选择器问题,当我将停靠位置更改为 时,吸管不起作用。底部 .默认设置在右侧,颜色选择器吸管工作正常,但当我改变位置时就不行了。有什么设置吗?因为我无法从
如图所示,我想知道是否有键盘快捷键可以逐个或批量关闭这些选项卡 最佳答案 AltW 或 OptW (Mac) 关闭事件选项卡。见 Sources panel keyboard shortcuts .
我正在测试我的 HTML 的可访问性。在使用 TAB 键导航 HTML 时,焦点环有时会消失,因为具有焦点的元素被隐藏了。那时我不知道哪个 DOM 元素有焦点。 有没有一种方法可以在 Chrome D
我正在使用 ios-webkit-debug-proxy 和 remotedebug-ios-webkit 适配器从 Linux 上的 Chrome Devtools 调试运行 Safari 的 IO
尝试运行 Nativescript 调试 session ,每次我输入 chrome-devtools://devtools/bundled/inspector.html?experiments=tr
看起来渲染设置不像以前那样(即启用绘画闪烁、显示图层边框、显示 FPS 表、显示滚动性能问题)。 我怎样才能再次访问这些功能? 最佳答案 渲染设置已从 移动 Chrome 48 .您现在可以通过三点菜
我正在使用 devtools 调试一个大的 DOM: 我想为这个 div 添加“书签”,这样我就可以轻松地再次跳转到它。 如果此书签能够在页面重新加载后继续存在,那就太好了。 有办法吗? 最佳答案 我
我想弄清楚为什么我的应用程序性能很差。所以我在 DevTools 中做了一个性能记录,我可以看到帧通常需要大约 150 毫秒,这太长了。 但是我不明白为什么框架需要这么多时间。有一些 javascri
我正在使用 devtools 调试一个大的 DOM: 我想为这个 div 添加“书签”,这样我就可以轻松地再次跳转到它。 如果此书签能够在页面重新加载后继续存在,那就太好了。 有办法吗? 最佳答案 我
我希望在页面刷新时打开 DevTools 是很常见的。我可以使用 DevTools 从一开始就调试该页面吗? 最佳答案 您可以远程调试自己的 Chrome 实例,以获得每个页面的完整 DevTools
我经常使用控制台来输入和评估表达式。很多时候我是错误的并且捏造了一些表达式名称。这样做之后,chrome devtools 控制台将自动完成并提示我的一些错误输入。 有没有办法清除控制台历史建议? 最
如果我打开 google DevTools 我找不到时间轴面板 如此处所述: 根本没有标签。怎么了? 我在 Windows 7 和 Chrome 61.0.3163.91 最佳答案 时间轴面板现在称为
Google Chrome Devtools 中的事件监听器断点提供了多种选择,但对我来说,它们并不是很有用,因为它们总是让我陷入代码的一些不相关部分。 我想知道是否可以将其限制为仅一类?例如 onM
Chrome 开发工具过去常常为我按字母顺序在“范围” Pane 中显示属性。例如,请参阅此处有关“Google Chrome 中源选项卡中的范围”的屏幕截图:https://dev.to/shado
我尝试使用 Chrome DevTools 为 Android 应用程序执行 SQL 查询,但这是不可能的,因为输入按钮将光标移动到下一行而不是执行命令。前一段时间它起作用了。 我重新安装了 Chro
我有相对简单的 webpack 配置文件(如下): module.exports = { entry: "./src/main.js", output: { filen
我有这个简单的代码 input:hover{border: 3px solid blue;} 预期行为:当我将鼠标悬停在输入上时,新样式应该出现在 devtools 样式部分,但它仅在我通过 dev
documentation说“每次打开 DevTools 窗口时都会创建扩展的 DevTools 页面实例。DevTools 页面在 DevTools 窗口的生命周期内存在。” 然而,Facebook
我有一个页面,其中我使用 morris.js 插件显示 23 个 donut chart 。在性能分析期间,我遇到了这个: 当然还有 22 个以上的警告。结果时间为 401 毫秒。 我对每个 donu
我是一名优秀的程序员,十分优秀!