gpt4 book ai didi

java - 为什么这个 SpriteBatch 在 C# 中工作而不在 Java 中工作?

转载 作者:行者123 更新时间:2023-11-30 11:16:41 26 4
gpt4 key购买 nike

我有用两种不同语言编写的 SpriteBatch 版本:

Java:http://pastebin.com/7gwHBTXiC#:http://pastebin.com/cTFn26H8

它们具有相同的代码,并且都在一个简单的程序中进行以下调用:

Java:

    GL11.glViewport(0, 0, game.getWidth(), game.getHeight());
GL11.glClearColor(0, 1, 0, 1);
GL11.glClearDepth(1.0);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

sb.Begin();
sb.Draw(tex, new Vector2(-0.5f, 0.5f), new Vector2(1, -1), Color.White, 0);
sb.End(SpriteSortMode.None);
sb.RenderBatch(new Matrix4(), new Matrix4(), BlendState.Opaque, SamplerState.PointWrap, DepthState.None, RasterizerState.CullNone);

C#:

    GL.Viewport(0, 0, game.Width, game.Height);
GL.ClearColor(0, 1, 0, 1);
GL.ClearDepth(1.0);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

sb.Begin();
sb.Draw(tex, new Vector2(-0.5f, 0.5f), new Vector2(1, -1), Color.White);
sb.End(SpriteSortMode.None);
sb.RenderBatch(Matrix4.Identity, Matrix4.Identity, BlendState.Opaque, SamplerState.PointWrap, DepthState.None, RasterizerState.CullNone);

两者 (3.3) 的 OpenGL 上下文完全相同。

但是,C# 版本做了它应该做的事情(绘制一个白色矩形),而 Java 版本什么也没做(只有绿色背景)。谁能告诉我有什么区别?什么不起作用?谢谢。我已经坚持了三个星期。

最佳答案

所以,我确实找到了问题所在。它与 Java 管理内存的方式以及 Java 在这方面是一堆垃圾的事实有关。它在 C# 中工作而不在 Java 中工作的原因是因为 C# 提供对指针的访问,而 Java 拥有的最接近的东西是 NIO 缓冲区。为了让 OpenGL 调用工作,必须提供物理指针,但缓冲区可以根据它们的构造方式提供物理指针或虚拟指针。简而言之,将“ByteBuffer.allocateDirect”替换为“BufferUtils.createByteBuffer”可以解决问题。虽然,我宁愿看到 Java 被修复 :P。

    private void GenerateBatches() {
if(glyphs.size() < 1) return;

// Create Arrays
ByteBuffer bb = BufferUtils.createByteBuffer(6 * glyphs.size() * VertexSpriteBatch.Size);
SpriteBatchCall call = new SpriteBatchCall(0, glyphs.get(0).Texture, batches);
glyphs.get(0).VTL.AppendToBuffer(bb);
glyphs.get(0).VTR.AppendToBuffer(bb);
glyphs.get(0).VBL.AppendToBuffer(bb);
glyphs.get(0).VBL.AppendToBuffer(bb);
glyphs.get(0).VTR.AppendToBuffer(bb);
glyphs.get(0).VBR.AppendToBuffer(bb);
emptyGlyphs.add(glyphs.get(0));

int gc = glyphs.size();
for(int i = 1; i < gc; i++) {
SpriteGlyph glyph = glyphs.get(i);
call = call.Append(glyph, batches);
glyph.VTL.AppendToBuffer(bb);
glyph.VTR.AppendToBuffer(bb);
glyph.VBL.AppendToBuffer(bb);
glyph.VBL.AppendToBuffer(bb);
glyph.VTR.AppendToBuffer(bb);
glyph.VBR.AppendToBuffer(bb);
emptyGlyphs.add(glyphs.get(i));
}
bb.flip();
glyphs = null;

// Set The Buffer Data
glBindBuffer(BufferTarget.ArrayBuffer, vbo);
if(gc > glyphCapacity) {
glyphCapacity = gc * 2;
glBufferData(
BufferTarget.ArrayBuffer,
(glyphCapacity * 6) * VertexSpriteBatch.Size,
bufUsage
);
}
glBufferSubData(BufferTarget.ArrayBuffer, 0, bb);
GLBuffer.Unbind(BufferTarget.ArrayBuffer);
}

关于java - 为什么这个 SpriteBatch 在 C# 中工作而不在 Java 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com